等級:25 - 爐火純青 經驗值:0 / 246 魔法值:15202 / 15202 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 14 小時前 |
|---|
簽到天數: 6041 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
8 }1 N$ C. p( \! R q' z6 Z" B3 kAI 就是站長的最佳幫手。
" U' N* U+ q! ?$ `* u& p# p6 b+ {# l3 [+ s: J0 @ s$ c
+ }9 ^! p/ U1 \. v這裡的「新架構」是指後端的架構會有大變化
5 e/ t0 r1 t- f5 [! U6 s4 z9 i* e但前端的 UI 介面玩家不會感受出來有何不同0 H( b/ T- F }9 k0 m }
: `" K, X. P' }8 l4 M) P
+ B M. B) K1 H' G7 R1 V V
為什麼站長要改成新的獨家架構?. |4 U8 K/ }# _: M- h
就一樣由AI模型來解釋清楚吧。1 O0 l) |4 P$ U! H. s
+ h e" I: `: f9 s2 r6 z
3 r S3 h6 Y* ~2 `+ e
讓我分析一下使用純 PHP 和使用框架的優缺點:
, K) L/ ?6 m# b* u5 l純 PHP 的優點:
% B! k- M: w0 L1. 性能較好 - 沒有框架的額外開銷2 v5 k4 S( e9 d0 R) E
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
& a+ N. l: w/ C/ h# V; p) N3. 更靈活 - 可以完全按照自己的需求來設計架構. ^$ i3 B0 Z; y: q; z0 ?( g( r
4. 代碼量小 - 不包含不需要的功能模組0 i9 M) _" @, M2 }
5. 適合小型項目; d8 f, w5 n( z; M4 w4 V r
純 PHP 的缺點:
& \' R6 t" g" Q9 q6 \1. 需要自己處理很多底層細節
0 @. H4 t, G4 J2. 代碼複用性差, ~; e( c2 N0 e' [- x0 i
3. 缺乏統一的開發規範! _* m, N0 L7 r& ]" Q
4. 安全性需要自行考慮和實現; Y7 i! Y' D& D$ K9 c, l2 V; M' F
5. 開發效率相對較低
0 @) B I& m) x. ^7 o# _6. 維護成本高6 k" l( s- \2 g- T* Q
使用框架的優點:
2 {6 z! G% _; v8 L* d1. 開發效率高 - 有現成的元件和工具0 g# ]- b* K8 w4 z
2. 有完善的安全機制
! o W0 P% c+ d) S( E3. 統一的編碼規範" y2 x( v- V9 a" Z) I- h
4. 易於維護4 b" p7 T& ]4 y6 _
5. 有活躍的社區支持
9 I" V, s$ O& a2 F$ o% M! }" }6. 適合團隊協作
, F6 c9 J: T* D1 l7. 自帶很多常用功能(ORM、緩存等)4 K" t, o9 v- t, X1 Q
使用框架的缺點:
6 l9 M4 D7 x3 P3 z& j! p1. 性能有一定損耗
, k9 {; j; T; N' k2. 學習成本較高" U, o: a2 q9 d. D, i' y$ o! M
3. 可能包含很多用不到的功能
5 P% |/ e0 s/ m$ @# b' h4. 不夠靈活,需要遵循框架的規範2 U% H* M. Y6 o6 p t6 \0 N
5. 對小項目可能顯得過重. H- S( e, S0 s
建議:% `6 y2 j0 W# {$ S
1. 小型項目或學習階段可以使用純 PHP& X) ^$ V G7 K) V5 X7 u0 Q: _
2. 中大型專案建議使用框架$ A' Z9 N# p; P
3. 選擇框架要根據專案需求和團隊情況: l k' q3 U2 X2 e! s; I# l
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇1 z# |' M( u( ^5 G Y
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
5 g1 {4 z3 }& r J* P" ?5 u2 P' d5 z
! W2 {* s; H& ^( H! P6 w
( C& Q: m, i& O. I2 d6 W
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。2 i6 I- E P- h: H/ |8 |1 e
8 ?: X1 ]5 R n" a% v2 W& b9 V# q( k這個轉換主要做了以下改動:
( D0 \9 f5 d s& m: P( {' y0 M1 q9 k% O; u, d4 x$ `
路由結構:
U, z+ ^! H1 P2 F$ [ g7 Y
/ |3 A+ v y6 b$ l: l4 i' B使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下5 D2 {0 X% E- b% D. {5 |
支援原有的 page/mode 參數結構
! [" }# ?: B3 J, \' _通過路由規則自動匹配到對應的控制器方法
& [! D3 n5 _$ f* b' [0 E
: L G) u) o+ [' z
6 B1 j5 V! k% z3 w控制器結構:
9 }' c+ U" t5 y& y2 v5 z( A+ P/ Q) N3 ~& }
創建了主要的 LoginController 處理所有請求
9 k( o' G5 c, n/ Z& B5 N保留了原有的頁面類結構,但改為符合CI4的命名空間規範
; a# q/ ~; z+ H# u e+ Z+ O# \錯誤處理改用CI4的視圖系統' B) B4 n5 n @7 g
|2 Q" p$ D6 j3 O/ o0 o& O9 B
7 E7 b! @% r; e9 O3 U r/ _類的組織:
2 g$ u& o$ d5 ?5 ?, B2 w. B$ A: v2 S, T8 @+ H5 ?$ [ b: W7 y
所有登錄相關的類都放在 App\Controllers\Login 命名空間下7 M" j/ D8 F0 U4 F# v' C) \
保持了原有的類繼承結構1 y& j: h/ f* i! K% N
改用CI4的控制器基類和特性
! n) ?( p; m/ L
& _5 z1 g4 a- a' ?6 C. J S a- S3 J9 p* m2 I
改進的安全性:! R8 ]; N, v& c4 n& u3 w
9 |) v1 E0 Z( e, [( Z6 _7 Y
使用CI4內置的安全特性- d+ @1 I0 Z; ~4 X, }
更嚴格的輸入過濾4 V* x5 i2 e: N8 L0 i' _
更好的錯誤處理機制
/ ~; t; ?% i3 H6 q1 p
+ A/ c' q g/ y3 n- c2 o( Q. `- Y" Z2 e* C4 {) D1 K# E) r5 ~
# ]- p; w2 ^* X( [) O8 |
要使用這個新結構,你需要:1 b) j6 w' M0 h
" B. \ O& F; \1 }- L- J" l! {
將這些檔放在對應的CI4目錄結構中
6 {& T2 F# _8 ?0 n確保創建相應的視圖文件
# t- D2 u/ A% Z2 p, q4 W配置語言服務( N; N( h: Q9 ~
根據需要調整模組檢查邏輯
& X" s- E# i9 z) X! \, U& [. a! k* v7 L; K
需要注意的是,你可能還需要:8 a" c5 ]7 t9 `+ L* t, e' F6 U
0 j; n) S+ I- J( v2 P) L" ]創建相應的視圖檔(在 app/Views/ 目錄下)/ G* c* X& n5 U
配置適當的中介軟體來處理會話: O" o! m3 k' A4 \
實現具體的登錄邏輯5 {' X" Y6 r0 G' E# t
, B5 Z9 Z o% j0 J' }4 O
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?2 U% Y4 o6 t' P" p6 G+ e
* N: r" w( [- U
- <?php9 A+ V; u9 m$ o! r3 T( f
- // app/Config/Routes.php
7 X! B4 j8 ?+ G$ K2 G - namespace Config;
( s0 f! }7 u8 T/ U% w" t3 H - 8 v: ~* a% O" y& p. E, t0 P
- $routes = Services::routes();
n+ Q/ U$ d8 r - ; k( D' w; i* s2 \
- // 添加自訂路由規則* j G& m& X' S' |- Q2 S
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
; ~$ T( h# N( o# C6 v- y0 F) [8 L - $routes->get('/', 'LoginController::index');
' B. e% x, m* ^* z1 G0 ` - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
' [( ^( \: |* }6 |2 m4 V - // 默認路由處理
& \; I; e6 |* F9 S4 \! {7 p/ p - $routes->get('(:segment)', 'LoginController::handle/$1/show');; E v# |* r# N" x! S! Z, `/ `
- });
4 J& K1 M4 H7 I( W - + R5 d2 Z1 h0 e9 S: r
- // app/Controllers/Login/LoginController.php! d/ x' u' N4 r0 g8 E- {
- namespace App\Controllers\Login;
" T7 E2 a/ W) P! F - ! {# c% L, O. A5 }
- use CodeIgniter\Controller;3 S$ S( o- V9 \
- use App\Controllers\Login\AbstractLoginPage;, |2 C6 ~# k$ w8 ^
- 5 z4 ^# d3 j# C& l
- class LoginController extends Controller) m6 k4 [" i& J: g
- {" f6 a, k: {6 o( h) H& m6 U
- protected $pageObj;
# j% L1 |1 e$ E& A: v* R% W& U - protected $LNG; // 語言物件' k! E& f4 M. s9 t$ _9 r/ L6 B7 T
. C, n+ b4 p, |2 V/ ?- public function __construct() " L, L1 C7 ^0 c) h! X
- {
1 G# M* {& u' ~2 t; j5 M: P - // 載入語言檔和其他必要的依賴
: f4 a/ c1 ]/ L* j0 R( }, o$ k- m - $this->LNG = service('Language'); // 假設你有一個語言服務3 y/ g0 s" A" x% t
- }
% I7 R% J$ x! T" S7 C8 r0 ^
. @7 |& p+ W( ^0 l* }3 G( Y5 X( z/ Z- public function index()
/ z6 h( r2 g( \9 v1 _ - {/ }# h0 P l. N. B% C5 q! Q: D
- return $this->handle('index', 'show');6 @& P D# A( w1 S1 K8 x5 C
- }- e) b8 B4 i+ m; G4 S) w" ], u& s4 v
. g# O% W- @* H& _4 a7 H- public function handle($page = 'index', $mode = 'show')
4 |% t6 N4 W! I - {; i7 V$ a0 X1 z0 s" @
- // 安全過濾頁面名稱
2 O9 s( u0 C1 t: L% N! L - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);6 x% K1 A/ q( y+ V5 F1 Q
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';" [ \* u) j& ]$ o* r5 ]
- $ I) Z1 a8 W! M- E R4 p r8 F/ l6 }
- // 檢查類檔是否存在
* ?1 u1 k5 Z4 ~, D - if (!class_exists($pageClass)) {# |2 ~4 q$ k& s9 `: v
- return $this->showError($this->LNG['page_doesnt_exist']);
j( s5 v) B4 n' d3 B - }
1 Z6 e' b8 \9 h! F - . G: X3 j( i4 H D3 K" m7 f
- // 產生實體頁面類! C2 Z3 _/ Y; w/ c' a: x
- $this->pageObj = new $pageClass();1 E* n6 s4 s1 m2 V8 G, `' x6 U
- : ^/ c' ]- V; ^; S# E* {. z
- // 檢查模組要求
Y' o; _+ R+ V( q' i) G - $pageProps = get_class_vars($pageClass);6 I; y4 a# p2 L4 D8 W; x
- if (isset($pageProps['requireModule']) && 9 p; R8 ]. x& B K2 a
- $pageProps['requireModule'] !== 0 && ; c0 a8 X: ^; W$ h! S# a" e
- !$this->isModuleAvailable($pageProps['requireModule'])) {
9 G) I( v" o' e, W3 @1 b/ O3 {7 A - return $this->showError($this->LNG['sys_module_inactive']);' _! q9 m7 P% |3 r$ {4 F2 q+ N
- }* h! t# o( B: W* ~+ T; q5 G1 t
- % p/ B z. V( z5 R
- // 檢查方法是否可調用
$ b& D; D c1 B7 ] - if (!is_callable([$this->pageObj, $mode])) { l' l8 G3 `4 U. {' x4 U: N+ h5 B
- if (!isset($pageProps['defaultController']) ||
/ E4 x' D. c" g) o - !is_callable([$this->pageObj, $pageProps['defaultController']])) {, c& G. r0 ]7 D6 T% x1 F
- return $this->showError($this->LNG['page_doesnt_exist']);5 r5 W. F, f+ ?% m" ^& ]1 ^' m
- }
; {" L4 C* f! w p* S. z - $mode = $pageProps['defaultController'];
u, z- L$ x9 c, m: P3 k9 j+ U) |: f - }
$ c4 G) m, L& C
8 T! T G. A( C. \8 }9 w' d- // 調用相應的方法
8 r& \" V7 |9 o3 ~; j) _ - return $this->pageObj->$mode();* b* k- C2 e% e3 Y' Z% w- G
- }8 v- o. |7 W; J# r6 u8 o! _/ b
- : k/ o! u4 s5 S+ H/ H
- protected function showError($message)) f4 h$ @+ ~9 m, F
- {
0 ~; l, A1 m# a& V; L - return view('errors/custom_error', ['message' => $message]); Z3 _* m1 t: w- G$ K) J! ]
- }' [3 [6 ?+ f! R/ k& ~) E: c6 E' _
- & _$ L) o( d6 [0 W8 w$ s8 M
- protected function isModuleAvailable($moduleId)
+ w" Q% m4 c) z" M' \+ [# p - {' N) s" I8 q0 P' N! k
- // 實現模組可用性檢查邏輯$ W( b2 |! s% `
- return true; // 根據實際需求修改
- @% H. z9 y4 L3 ?$ i3 f - }
0 G" \" i/ a# n6 E6 z7 B0 b - }
9 N# M3 P4 g9 x - / I1 L4 g2 v: y6 h# t0 Q
- // app/Controllers/Login/AbstractLoginPage.php
" c, @$ x7 o! o2 V2 ?4 _8 j$ a - namespace App\Controllers\Login; B d- Z" I. s1 L) n6 t
- ' J$ ~! ]: v/ ^8 ~1 U' q
- use CodeIgniter\Controller;4 Z1 R. I O9 N; c
6 f0 F% L# P, i1 \- abstract class AbstractLoginPage extends Controller
2 J F+ d6 ?- U9 p! r - {+ c2 l* S9 M* |4 [( [. {5 P
- // 實現基礎登錄頁面功能& }5 Y- [5 z: n: b' v; |
- }, q# C8 j( F6 r0 D# a! r
4 m4 P) y4 x% n1 N: |' l- // app/Controllers/Login/ShowErrorPage.php* E. G0 |/ [8 k' b+ v Z+ X
- namespace App\Controllers\Login;$ G0 r5 B0 Z& r' t6 x J1 m0 Z1 ?9 u
- # u* f W* c) z- e! V1 V
- class ShowErrorPage extends AbstractLoginPage0 B0 |3 a! j0 @8 G$ U
- {
" t' S3 z* y+ F - public static function printError($message)- p2 ?7 ?: S) n
- {0 {0 c& u4 k! u7 e2 E
- $controller = new LoginController();2 c2 e6 C+ Z4 S
- return $controller->showError($message);
5 S, L" ?/ G5 ?+ E; K% f F - }
9 k6 W/ J# t8 N+ k* e - }
: G' [7 C" C4 c3 t( ?
3 e n; p2 B3 s2 N& V. F- // app/Controllers/Login/ShowIndexPage.php, L9 L5 G: C5 p6 V' Z
- namespace App\Controllers\Login;+ z3 t! }) E2 E+ w/ b5 q
+ _/ F9 ^+ V- O; ?" v. ?- class ShowIndexPage extends AbstractLoginPage) ?* y' B6 n- v. N
- {
1 i6 p7 ^2 n) ^: z3 | - public function show()
. Z0 H; v" m8 ]8 z/ X - {7 [# H; |! }; {+ _
- // 實現登錄頁面顯示邏輯8 H) B7 s8 Q1 Q4 o
- return view('login/index');
2 K6 P8 Q8 O. \; u - } ~( S b% w q+ |$ X1 U
- }
0 w1 G6 u7 C) K- l k9 K
複製程式碼 |
|