等級:25 - 爐火純青 經驗值:0 / 244 魔法值:13397 / 13397 生命值:4%
升級
100%
TA的每日心情 | 奮斗 14 小時前 |
---|
簽到天數: 5426 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致; F- U4 Y6 v- d/ {7 B# b
AI 就是站長的最佳幫手。 h4 m. O/ q( {2 Q" F
0 q a8 r- F/ z' T. O6 J0 @0 ? K* _: M' Y
這裡的「新架構」是指後端的架構會有大變化
+ y* @9 j1 _5 ]$ x* v" V但前端的 UI 介面玩家不會感受出來有何不同
+ f: i6 I! J |) f: y; e
/ [6 l( ^9 P, [* g( E) @5 J
% M, _/ v. W8 o" [為什麼站長要改成新的獨家架構?
8 G& v( G9 }% U& W! S! B4 q就一樣由AI模型來解釋清楚吧。
R- l& y7 B+ g4 @9 l) ]# |
* b5 k k- T$ r3 q: j3 R. u" `$ M2 {7 z! Q# n5 r
讓我分析一下使用純 PHP 和使用框架的優缺點:
$ z4 P+ V/ y0 ^8 c純 PHP 的優點:) b" J/ K! m% m' R6 u$ K
1. 性能較好 - 沒有框架的額外開銷' f' {3 I) v7 P" @" V' }& c
2. 學習曲線低 - 只需要掌握 PHP 基礎知識. O6 v M% E7 h0 ?$ }
3. 更靈活 - 可以完全按照自己的需求來設計架構+ F2 I5 o& d( }8 r' k3 s
4. 代碼量小 - 不包含不需要的功能模組
2 k3 B$ I5 }& L, O* |5. 適合小型項目% N: E, ~8 f: z5 J& x
純 PHP 的缺點:0 B. }1 l- S8 A2 }, P$ P: g; r
1. 需要自己處理很多底層細節
' `& n0 s; ]; b2. 代碼複用性差: y/ `4 Z, b/ x, t6 i( P) p, p0 L
3. 缺乏統一的開發規範- d9 A% t7 Y3 |: q0 [0 k* u
4. 安全性需要自行考慮和實現; d% k; l; `. P7 g7 p% A
5. 開發效率相對較低
# B' h7 S( {0 o0 f( h; ^; }7 @6. 維護成本高9 g+ M8 ~( v8 |: [
使用框架的優點:& V* e2 D5 [4 \8 L8 ?
1. 開發效率高 - 有現成的元件和工具
# X, q7 B( P/ Y7 S2 k3 k* V2. 有完善的安全機制- H8 q9 ^2 U. G" @
3. 統一的編碼規範( A7 G* \- r% ^. h% F' a6 `- p
4. 易於維護
6 r0 J7 S2 S$ F- K1 S! K5. 有活躍的社區支持
' A7 P x) r/ ], e8 v& e6. 適合團隊協作
) f/ M |0 E5 |( e! Z0 i8 N7. 自帶很多常用功能(ORM、緩存等)
: B) F3 G0 G0 g: `, X3 @! d1 g" G使用框架的缺點:
1 h4 F5 O( j" {% m8 J1. 性能有一定損耗5 }; o( e: R b; B; y2 K
2. 學習成本較高( I4 M. K& o% U! ^' E6 E/ C
3. 可能包含很多用不到的功能
2 ^& z3 V# h* x( I3 c/ l5 @4. 不夠靈活,需要遵循框架的規範
! q8 f; t7 Z( q" v& N5. 對小項目可能顯得過重
# O7 W6 z/ Q; z! u( T, `: d3 Z建議:
) M) e, g2 p4 ^2 K1. 小型項目或學習階段可以使用純 PHP
) K( a+ e5 e$ J# U6 }; h2. 中大型專案建議使用框架% B& x5 N1 u* T T( ]6 h; P
3. 選擇框架要根據專案需求和團隊情況
8 P2 ?% c* h l6 K2 w4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
. u5 j# s, P g1 h您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
; H& r. g* s$ x' E& ]5 `) s% t: A. @8 v- r
# k0 a o" }1 u* m) \& x9 B
$ Y# t4 { y; Z! j我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
5 U- K" K/ s9 J2 f
* S7 V4 J+ E0 I2 o4 Q這個轉換主要做了以下改動:$ |! v1 g: N! C9 x: g! |
; ~" E) e% ]- T' T- q路由結構:
! r& s$ ^9 _7 c; i) F( u+ K9 B7 _& i: ^( h& l# }, z/ s
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
: l3 [2 d+ N- L0 j支援原有的 page/mode 參數結構
. m/ G ]4 U: C/ }" O3 ?7 y通過路由規則自動匹配到對應的控制器方法" \' Q: I! m: Z) ^2 \
% ?5 J& ?; M8 `; {1 y. a; p5 h; J
* g% x- y1 y( C/ l* [
控制器結構:
5 K. Y( ]% i& }
/ w+ y. ? y! q: K% }! Y5 w; _$ @創建了主要的 LoginController 處理所有請求5 Z% {2 c; \6 z* I+ ^7 g, W7 ~
保留了原有的頁面類結構,但改為符合CI4的命名空間規範# @! i- _( {% Z ?( S% I' d f! V
錯誤處理改用CI4的視圖系統
+ |" }; J8 ^# f% R
S) _7 p# B; e* d" u/ J. y
$ q. N" _# j% ?" ^. r類的組織:
7 R' V! F* U+ u* c; T2 C
5 o. F2 {5 S# _/ U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
/ i% m" z. @. {: d5 _3 J保持了原有的類繼承結構
) e0 X3 S. C% Y* V$ I8 x改用CI4的控制器基類和特性6 Z3 g, j! r5 J
! Z6 X, N* Y% o- z$ h, y
) y8 y8 V& E# z2 N1 Y5 U, ~! v
改進的安全性:( X, N% N: K [( W
1 N, |2 ]& E2 g" Z
使用CI4內置的安全特性, R# u0 s+ W/ v5 X Z* {3 s: _
更嚴格的輸入過濾9 z$ }* G5 }/ r' j: l7 `2 i
更好的錯誤處理機制
% b6 O5 @; i1 Y( N! _( D
" @' q9 \$ o% R: e+ a! b. F0 m
- Q- O! u6 o1 R, m8 ?! n
+ f7 r5 e9 g$ Q3 y- Y( r9 C. }, [要使用這個新結構,你需要:- }" e$ |& `; M6 B7 z
* m3 W2 a* D/ s) F0 z: t! C
將這些檔放在對應的CI4目錄結構中( c$ f! P) ?4 }. P$ t6 Y
確保創建相應的視圖文件4 I+ R: D! U% O+ b
配置語言服務: w6 R' O( R" _* y# Y
根據需要調整模組檢查邏輯
1 Q: a/ H4 a% c6 R3 O/ W4 Y6 o- x7 ]" V" l F# k/ @! |9 \
需要注意的是,你可能還需要:
: G3 H0 \1 _; {" X: C3 o
! U, C9 g9 o3 e) b創建相應的視圖檔(在 app/Views/ 目錄下)) u7 Z: U# s, N" G) ~ B
配置適當的中介軟體來處理會話
3 s" A: ~, E3 G6 J9 I# g C7 L! S& v實現具體的登錄邏輯5 B; ]) _4 x) C' K3 v/ H1 u; q
& \5 c/ S( m' L( [8 F$ d( d需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
6 J. y1 v3 ^! o7 ^/ I- @1 @- z; ^. D3 F3 y
- <?php
* {, K% I' X6 y, R% } - // app/Config/Routes.php; M& P! N* V& U
- namespace Config;9 F: k/ R) u( S( x7 n; ^! L) S
3 f9 U, u! F+ _5 O' S" Y- $routes = Services::routes();0 }7 h4 V8 ]( L' O4 `
% t2 O$ d6 N6 Z# w# U- // 添加自訂路由規則0 H( ?% Q# Z8 g7 r
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
3 l# \ X6 t" j( x, E0 u$ H" e2 v. u - $routes->get('/', 'LoginController::index');
, Y) \0 o7 K, b' d - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');' `7 }3 C( \! O$ L
- // 默認路由處理
0 X" o% H4 p! Q* `" L: G - $routes->get('(:segment)', 'LoginController::handle/$1/show');
- q& ?% l4 N% t1 @, E: V4 Z - });& A2 j4 } k6 m/ N9 T3 l8 D7 ?
, W4 R) ^; K& s4 n- // app/Controllers/Login/LoginController.php
4 c, s; C& d2 |, [/ z - namespace App\Controllers\Login;
8 {* f! L2 w$ X2 R# ~ - : q/ Y3 b, X8 [! j" F. x& }* T
- use CodeIgniter\Controller;
8 I& L; j; v/ W0 Q0 } - use App\Controllers\Login\AbstractLoginPage;
7 Y1 Q. ^; ] U8 a: {4 C - 7 M) Q: F$ A6 N: }
- class LoginController extends Controller8 w7 h3 v2 T7 O" n3 u8 V
- {0 B9 d8 P. }! ?* F; F& O
- protected $pageObj;
, N( T0 G( p# Y3 `4 x7 r - protected $LNG; // 語言物件0 V4 c0 H! y& V
- ]( }6 Q, }) E, q. N
- public function __construct() / B* E8 w) e1 m; N
- {; l5 j: b, N) u
- // 載入語言檔和其他必要的依賴* }! W; i% Y5 J% [6 \9 A
- $this->LNG = service('Language'); // 假設你有一個語言服務; ^) n1 r0 E1 G
- }/ `) t% z# [7 o, U2 x# l- y
( |$ p ?! f* X, P+ p& p e) }- public function index()
% K5 W9 X, ]8 m9 E! J4 u - {' F- i0 l/ G' |6 v5 W
- return $this->handle('index', 'show');
1 p l+ Y5 K; {1 o; |& j% { - }, q2 Y! i3 |% N% C* T. T3 h
- ' ?( Y9 W6 j1 B$ C8 i4 [: `% G
- public function handle($page = 'index', $mode = 'show')' m8 ?) d. Q- k4 R
- {: n9 n' J4 y: Z6 Z' K
- // 安全過濾頁面名稱7 B6 v3 o5 x! x$ H3 p
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);! B' X$ j7 F6 R+ p3 B: m
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
0 _- f1 f8 D" |1 @4 ` -
7 O+ W4 r1 ]* g% Y3 E- |% m- Y/ V - // 檢查類檔是否存在
4 n1 y# X* G4 W' k. G) C) v - if (!class_exists($pageClass)) {
# E$ [3 @/ e' m - return $this->showError($this->LNG['page_doesnt_exist']);: e4 u& p- h9 r* U0 m5 |
- }
2 v# A3 G- n! z1 v: M& D - 4 q0 F" g9 r( z& n
- // 產生實體頁面類! |& I/ ]* R D& e- A
- $this->pageObj = new $pageClass();
. o& ]# {& B' C0 r* ]! M. S( t -
7 m! \0 U& c- D1 X, E - // 檢查模組要求
" z2 U; J0 u+ C3 y1 }$ R - $pageProps = get_class_vars($pageClass);" K3 V( c }) K
- if (isset($pageProps['requireModule']) && 2 _/ f+ r% L ?' n) `, i1 W4 C
- $pageProps['requireModule'] !== 0 && $ u5 u C. [* P' Q. y2 w9 d
- !$this->isModuleAvailable($pageProps['requireModule'])) {. u9 E( E9 _) G5 L Z) S) i* B, k s
- return $this->showError($this->LNG['sys_module_inactive']);
( z, g7 ]4 W; J% ~ - }
* t8 @6 y# x8 }& r
( ~0 O0 @' i1 M! V% K9 W1 P+ x5 M2 V- // 檢查方法是否可調用2 B: A4 B6 K( K: p2 l7 k
- if (!is_callable([$this->pageObj, $mode])) {( Q3 c; W5 M$ e) o: [, e
- if (!isset($pageProps['defaultController']) || : w7 t( ^4 w4 g5 y9 u3 E) b0 S4 K
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {! o: D0 m: {4 m2 n/ }
- return $this->showError($this->LNG['page_doesnt_exist']);
$ P/ S2 z- Y0 E2 o' p - }
+ y6 o% K/ B. L4 y - $mode = $pageProps['defaultController'];
) i2 |3 k7 @# {! F - }
4 ` C% Z h- N; ^9 E# ~
" Z7 y$ C4 `! P( k: v- // 調用相應的方法
" o) w6 W! L7 z5 t - return $this->pageObj->$mode();- o) y c3 Y' Q+ K0 G: r
- }- t9 L ?" {" S# k( A5 @% d! j
1 I# q: l" D/ W2 a* P9 H% Y- protected function showError($message)+ o7 r0 a0 P9 B4 ]4 I
- {5 m. G) z5 F# ]" W- p
- return view('errors/custom_error', ['message' => $message]);
9 h. K% c s ~% H - }
) J9 s1 @& l0 C! O$ a - ! y4 v& ~/ L. T
- protected function isModuleAvailable($moduleId)
; F% L4 ]- X% N2 ?0 y) o0 J1 v - {4 l, U2 L* D+ {3 V; |3 l& K( @5 x( Q, ]
- // 實現模組可用性檢查邏輯
3 B# y: U& E! F' w - return true; // 根據實際需求修改, x& ]# J; c T2 _5 Y' x
- }
* H9 ]3 }5 ]3 Y8 F! d+ S; \6 i5 J - }
* ^3 Y% Y" p4 b1 d3 J5 O - : `- y6 P6 l# g2 N/ X( Y2 G+ Z- `6 H
- // app/Controllers/Login/AbstractLoginPage.php
% |( }! r2 w% T7 |5 T - namespace App\Controllers\Login;
3 h4 K- a6 o1 r - 9 I* c5 N2 y, l0 w3 b3 s
- use CodeIgniter\Controller;! v x7 V' W8 E& k# C! r& l
- ! s! r$ ~ s0 I/ |+ f
- abstract class AbstractLoginPage extends Controller3 X- ]6 u# |4 `8 D
- {
: w8 q8 E/ ]/ Q, f: l+ f4 T - // 實現基礎登錄頁面功能% W+ S% I8 w2 k- I
- }& x& f2 V$ C3 v/ S; w! x) v( v
2 M `/ g- y4 z7 a- // app/Controllers/Login/ShowErrorPage.php- n6 z4 z/ w0 R7 [2 {
- namespace App\Controllers\Login;
$ L& |: h, o! G: G, d
a, i: F# a( s5 L+ U. D- class ShowErrorPage extends AbstractLoginPage
$ \0 v( }, l1 u - {
% F" n7 ^2 B5 O( r) @2 ~ - public static function printError($message)
0 F9 H- s& w* d3 L. J - { R6 q. j$ h+ ?4 b
- $controller = new LoginController();, w4 R, k& s A
- return $controller->showError($message);
7 G6 r+ j8 r, z, J8 W6 I! e$ w - }
5 H# Y. W j4 n# x& q% _$ h9 L - }
( k3 y% e8 o3 K4 u" g, y - ( z J7 h! D$ X6 V, g8 o
- // app/Controllers/Login/ShowIndexPage.php
; r( ~2 _9 l( ?5 f - namespace App\Controllers\Login;, U5 t, F( q& a* H& V ~0 e
- f% I, W7 i( l
- class ShowIndexPage extends AbstractLoginPage
$ p0 ?+ a- X: Q: E: J - {, m7 w% P* e; J# H# h4 T
- public function show()
& F1 P0 D) P0 x4 F+ G J - {0 s( j$ F0 j. D& Z; V9 V- ~) E
- // 實現登錄頁面顯示邏輯. r- k, J& r7 u, e. B- | Q
- return view('login/index');4 S5 X/ C) Q- ^ ?+ x' b
- }% x0 Q- P) a/ Y1 e3 K
- }
0 f5 @' _& e; G1 r% l
複製程式碼 |
|