等級:25 - 爐火純青 經驗值:0 / 246 魔法值:15163 / 15163 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 13 小時前 |
|---|
簽到天數: 6027 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
4 X! ^" R$ p& N$ s9 j G% N. X8 B9 hAI 就是站長的最佳幫手。
! v# R1 s8 v& o/ B8 ]" v' y- ~2 F. g- W$ g+ D5 R" b+ _
6 b; _" D) [* `6 V這裡的「新架構」是指後端的架構會有大變化
/ d( J8 K3 Q9 M6 T但前端的 UI 介面玩家不會感受出來有何不同$ d6 Z0 H/ q' o. z3 ^7 {8 Q; \4 i$ i
" Y1 ~: z- v1 ?% `3 v, p+ r' A
3 G' F2 F% z4 `& d7 I為什麼站長要改成新的獨家架構?) Z# o+ L( L8 u6 F1 q3 ?" m, q8 N
就一樣由AI模型來解釋清楚吧。" A) M. s9 i" F9 Q: M; q
+ d9 }9 I. P4 F4 R3 ]
1 j- J; A! k* d2 ]( _
讓我分析一下使用純 PHP 和使用框架的優缺點:
7 o) r9 [/ A* C$ T ~純 PHP 的優點:
. H0 h( H6 s2 e/ {6 j, k5 D. J1. 性能較好 - 沒有框架的額外開銷6 X; ]: j1 X; K$ p
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
$ X2 x3 w* X3 ^7 f. G- D. `3. 更靈活 - 可以完全按照自己的需求來設計架構
/ [, B* B6 @# o% q4. 代碼量小 - 不包含不需要的功能模組. O5 r6 b: l$ z1 t- A
5. 適合小型項目
6 y+ S! t( y% v b$ ]6 R純 PHP 的缺點:
; O/ i7 I. t. P! l* e% B1. 需要自己處理很多底層細節( L' n, \8 `1 Y7 m
2. 代碼複用性差, }8 n. c- Z4 P: n
3. 缺乏統一的開發規範
6 _- |: [0 l2 c1 z4. 安全性需要自行考慮和實現
+ ~8 w6 N ?2 i0 H) |: I5 q5. 開發效率相對較低
6 D2 d1 t/ r8 s" n1 P4 L8 f6. 維護成本高: {) V# O# B/ k3 U7 U6 _! s
使用框架的優點:
5 C6 V' G1 }( c$ m# P1. 開發效率高 - 有現成的元件和工具5 c7 @) s% U( b; Y0 p
2. 有完善的安全機制. t* b% f+ R* K% i7 a5 e( D1 r
3. 統一的編碼規範
) q6 N @, l( C- X4. 易於維護
' o( r! a" G, r* a; a5. 有活躍的社區支持: n1 \% N9 Q3 l' h5 f4 O6 F
6. 適合團隊協作
; I* H! S1 H5 k& F, P7. 自帶很多常用功能(ORM、緩存等)* D6 b; p1 O5 ]$ O6 b h
使用框架的缺點:
2 h" B* P. y, Y, o1. 性能有一定損耗
5 Y7 l; d6 E2 P: l% a2. 學習成本較高 U% r& u, J7 I* O8 u
3. 可能包含很多用不到的功能
, @% f+ S4 |0 H# s0 u4. 不夠靈活,需要遵循框架的規範0 ~% J. Y2 u9 U% W
5. 對小項目可能顯得過重; g2 d; \/ b; t( v6 Z
建議:5 i0 D, r% L& j2 x
1. 小型項目或學習階段可以使用純 PHP
8 I- P: y3 I- s4 j, w, Z" E+ O2. 中大型專案建議使用框架
7 l8 r, V) k. j& C3. 選擇框架要根據專案需求和團隊情況) I3 o3 }9 f3 K* Q7 @3 t+ N+ K
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇' ~( [9 t. P+ ~" ~; G
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。; z. w) d' l" N
2 E0 Z1 ^7 P- ]. F* d5 x
8 A7 o, y( s; ~& I
5 i# t0 Z3 u8 S# ]# L) _我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。" @+ b& l# ^( M: Y
5 m; z" x6 w* D b& Y$ L
這個轉換主要做了以下改動:2 n3 m& g. g5 O1 D
" `: O5 n( U1 @5 s$ v+ T/ D
路由結構:
/ i6 E4 o3 Q- r7 [# |* y) Q$ F W6 F$ ?/ C7 I
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
: p) y- S+ r7 A' P+ y" Q" J9 b支援原有的 page/mode 參數結構2 g* {8 A; }6 ]5 p% Y
通過路由規則自動匹配到對應的控制器方法3 n! K( x, }+ j, D
; U- a( F* [& k* y
7 ^3 ?5 G2 j. _8 c; u \
控制器結構:* e/ A9 B: \0 g/ ]
( ^1 z- A- y# Y/ A# h1 D/ u創建了主要的 LoginController 處理所有請求1 n; |! T- s, \' H1 j# C5 k# ^
保留了原有的頁面類結構,但改為符合CI4的命名空間規範! ^9 f' H6 x( j9 x5 f
錯誤處理改用CI4的視圖系統2 ]( Y y) D: T( c5 L
) S; ~+ d$ p& Y
; p6 V( f' ]7 C& k類的組織:
/ A$ G: O2 u0 f7 g. n+ j' b% S: n: f$ f9 |, r- K' b: m& S
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
& L/ j2 i: x; `5 u; B' c. z: k保持了原有的類繼承結構
/ Y# ?5 J' h9 `/ f$ Z8 j9 U改用CI4的控制器基類和特性
, E/ |7 i. E( A+ U6 l2 V7 S
! m! e1 ]" t3 C
8 Y% r; e+ j( f# {; y改進的安全性:
- g0 Y" Y9 R4 ^+ X
$ |5 Q7 m* q% w [- U使用CI4內置的安全特性
5 I+ m" q% n# m0 E更嚴格的輸入過濾1 B& _1 S; h& g
更好的錯誤處理機制
5 Z3 f I3 e! w; \
$ ~0 Q. P- _# H. h8 A/ M
$ R2 _9 O2 D9 v
( b, g0 n7 I; b5 w$ T4 ^ _ o要使用這個新結構,你需要:' z! s/ ^6 q0 [0 S
$ T7 ~( V/ o& i8 N4 a將這些檔放在對應的CI4目錄結構中# |6 a k( ]4 V# R% M
確保創建相應的視圖文件
8 A* ~# c3 b+ E* P配置語言服務9 x& e \1 Y- k+ q
根據需要調整模組檢查邏輯
" Y# c- P. u) w" ]1 Z3 B; N7 z
! P, y" g) _4 j" l/ m' O需要注意的是,你可能還需要:: Y6 I H& o: i5 R4 |3 a
. P( b: a; @9 ]2 ^; t
創建相應的視圖檔(在 app/Views/ 目錄下)
+ _' K/ h5 u# P( d配置適當的中介軟體來處理會話0 x6 Q' y5 _6 q
實現具體的登錄邏輯* r1 ^* J& f0 C* Q
8 l9 X7 a ~3 Z( `8 g) N1 r需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?1 U4 o; l1 b8 Y% u
# ]6 p5 C x/ @; l' j0 F% R7 r
- <?php B; V+ S* ]4 v2 ?/ O& i
- // app/Config/Routes.php3 s; f3 g9 B* `
- namespace Config;
: p8 V1 l* j2 s$ v
( ?# w/ y. u" S3 w- $routes = Services::routes();
- x* Z7 ?. ]4 ~* y6 M
9 |* V+ Z6 k) B" l2 f- Y7 D- // 添加自訂路由規則
1 u; r6 L7 Y0 a B- o: ^* b - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
( F. ?% J" B! u# X2 N) e1 s/ u( o! H - $routes->get('/', 'LoginController::index');: w4 j8 ~: s8 I: M: E3 z0 q
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');9 q2 m7 u) X8 K$ b- N
- // 默認路由處理5 e. w9 M: a" S0 k
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
$ @/ L) b }% `4 U* ?* W - });7 z0 [8 Y4 v8 J+ l, w
, k- n. r: b' n, g* j- // app/Controllers/Login/LoginController.php
. u* B) p2 \7 w w - namespace App\Controllers\Login;& C5 U8 Z1 g$ [+ ~+ Y8 b+ k
- }+ h- E9 p# h6 K" ?3 Z' B
- use CodeIgniter\Controller;3 w2 A9 O \& n; ]
- use App\Controllers\Login\AbstractLoginPage;
9 J: d [% @. f0 x/ [" j& k+ U - # j! g) V0 @5 M o
- class LoginController extends Controller
# s+ N5 T6 T2 z# S - {* S) Z' b: I$ G: ~/ O% B- ]) {
- protected $pageObj;8 N4 K: G4 j5 T& k4 {( d% D
- protected $LNG; // 語言物件
* S8 F: X% X$ _ C6 ^% P - # Y4 k) t5 V0 E1 m+ \# q, |8 j
- public function __construct()
% w l* b8 H4 g6 }6 v - {8 ~. C* y* G! S+ Q- a1 w( j
- // 載入語言檔和其他必要的依賴# Y2 q- b( R5 M" A! D. E; \
- $this->LNG = service('Language'); // 假設你有一個語言服務2 j( Q5 A7 ?. V ~# O
- }
/ R. z ~ }" j5 Z* L7 r - 7 ^6 c( }6 A" J: L. K- j7 h5 U
- public function index()
0 Y- Y5 x8 }' k - {; ]) T% {* w9 L: i! r3 u% ?+ o
- return $this->handle('index', 'show');- B! t* K) @/ X- ~
- }
$ o: g. J; Y# Y: P- } - 1 [) G; t9 E# r# B
- public function handle($page = 'index', $mode = 'show')2 [5 B! _, K* W; P' ~
- {
# M( Q; @6 @4 X. A& X( }5 G! a - // 安全過濾頁面名稱7 U* q6 Y3 F* ]! [4 y) e
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);9 C$ }, u( X/ X/ T+ M: u6 W( n' d1 q
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
1 H( N+ s( H% s0 `+ s4 Q! | - " P; O1 A- s& F3 F4 z, Z7 l
- // 檢查類檔是否存在( q G+ x' t# {6 T+ S8 ~
- if (!class_exists($pageClass)) {- s" H# n0 ]" F2 D2 ^1 E+ G7 Y
- return $this->showError($this->LNG['page_doesnt_exist']);
. z6 N+ j3 ]. `6 ^, N - }
) n; }- q. @+ c
2 y1 p, J5 d @8 @- // 產生實體頁面類
0 b! L- C7 _9 s5 p& A - $this->pageObj = new $pageClass();
, `# K9 x) t& v( V5 `: v6 G, i -
8 u, q; E- X( K. Z3 E7 s+ a - // 檢查模組要求
; Q5 z3 A9 N' d9 R - $pageProps = get_class_vars($pageClass);* K! d9 K: [2 K/ U( Z0 r' r
- if (isset($pageProps['requireModule']) &&
5 H: s# e; L7 g3 c% \3 U. z - $pageProps['requireModule'] !== 0 &&
1 w/ ~2 d* b$ u - !$this->isModuleAvailable($pageProps['requireModule'])) {
" v& U$ W, z# }& Y" [% n - return $this->showError($this->LNG['sys_module_inactive']);
. P: i- F2 G) r p i - }7 \6 f, S3 ?& {- Y
- 1 ~% `+ A# o; k$ v0 V1 g
- // 檢查方法是否可調用
* y& K9 j0 s8 B$ e - if (!is_callable([$this->pageObj, $mode])) {
* M- @1 ^6 m/ n0 l; ]7 u6 i) y/ n - if (!isset($pageProps['defaultController']) || 5 J( u" }" T# U
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {
8 j O5 z5 r. V5 h N - return $this->showError($this->LNG['page_doesnt_exist']);6 Y0 t5 R! `$ J: W$ u$ V
- }
! k4 A+ i2 b7 E+ h; m - $mode = $pageProps['defaultController'];( g2 I# @* n6 i5 W9 m
- }
) }2 [% Z5 g6 O# U
; Y8 K& \4 u% S# J7 B- // 調用相應的方法' U9 ?( ?1 L j+ K4 W% Q
- return $this->pageObj->$mode();) X) y1 m5 r5 Z5 y6 U# b5 l
- }
+ N$ D0 y) S2 O+ C/ w0 M+ l - ) W5 M! V0 d b3 t I9 F# Y$ N. f. D9 ?/ ~
- protected function showError($message)
0 v- C4 J: n. c& L - {
0 K6 K, A# [7 r - return view('errors/custom_error', ['message' => $message]);
6 n$ F5 F" p6 X' l' H- {# y7 g - }
( R. M; |* a6 E1 Z& w9 x4 d4 g5 v
1 w7 }3 L! a7 u) b1 o+ m& d0 [- protected function isModuleAvailable($moduleId)
4 ?$ F3 N1 J! R - {
' [ Y6 _0 H: H% Q; ?/ P' S - // 實現模組可用性檢查邏輯
8 J6 v, i* m( H/ l% `' H4 R$ |- B3 g - return true; // 根據實際需求修改! k" E" o* Y" x2 k
- }$ N4 ?; }( e3 f) q
- }
& K# w$ h8 ~* n& r0 Q& Q# ?- K - $ n+ ^9 R4 [: x' E$ g
- // app/Controllers/Login/AbstractLoginPage.php! |5 }0 V% s8 j3 _6 p9 y
- namespace App\Controllers\Login;
* a" p$ m1 q- x+ T4 t# J* O - 3 n4 u$ r0 A/ l# Q
- use CodeIgniter\Controller;5 C+ a9 ^( [. k1 x0 [. K2 s; t
- 8 ?; b3 ~: b! L9 o$ H3 V, ]
- abstract class AbstractLoginPage extends Controller# r8 G. m- w8 y( V2 Y1 ?
- {
- A( P6 Y0 _! q7 W+ C2 O: _1 O - // 實現基礎登錄頁面功能
# G% }5 N, I' S" f5 s - }
u5 a% _+ h$ R9 F* W/ t - k4 Y# s6 X2 o s' w* K
- // app/Controllers/Login/ShowErrorPage.php
6 [, M$ h7 W! k8 ~. Q [8 a% ~ - namespace App\Controllers\Login;0 W1 v" U; P3 N' i) ^
( [# A4 g1 L$ R. h- n- class ShowErrorPage extends AbstractLoginPage; l6 l) P" ^: E' d' n
- {& d& A6 j' r$ R% n5 A9 ?: ]
- public static function printError($message); l% [ X: r1 T/ f4 ~3 D9 [0 n- Z
- {
# x6 ^3 H5 d- _8 c7 N$ ? - $controller = new LoginController();
2 q% q; ^: V* T- I - return $controller->showError($message);5 N$ S& q! u% v' c
- }
. W @& S7 Q& r, D8 ?" d8 w - }2 G- w5 g3 M9 A5 t; E
- & t1 I8 u% P' k, \. u' N
- // app/Controllers/Login/ShowIndexPage.php
/ _$ t' Y; E' `/ f7 `8 @ - namespace App\Controllers\Login;) q! x; A' Q% p' ]
0 M5 |/ h* m8 }2 j, @0 g* P. R- class ShowIndexPage extends AbstractLoginPage7 \9 h. u" O* Y1 s
- {
7 ]( d& [& X+ x. Y h - public function show()3 W* L5 N+ a4 x3 _8 g' A& A
- {$ o; R4 Q0 C7 z
- // 實現登錄頁面顯示邏輯- Y L8 p3 K2 O8 z6 U! G2 I& R0 d% w
- return view('login/index');1 w1 u# [, J; Z2 u; q! U
- }* t$ V9 P2 v# C2 K
- }5 h2 j5 |2 E- V$ R: m
複製程式碼 |
|