等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14862 / 14862 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 4 小時前 |
|---|
簽到天數: 5917 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
* v* W# k, Q2 S# O {4 QAI 就是站長的最佳幫手。
" i' U) C- P, G+ P* J$ q9 N& _& {! T+ N7 Q& ?
& ?! g* Z% `9 Z4 F' d
這裡的「新架構」是指後端的架構會有大變化& I3 P# F& g( z x) r$ j) v
但前端的 UI 介面玩家不會感受出來有何不同
" m7 z) ]$ q, M8 B% E! r7 x8 E
! U/ P$ @5 M$ d- z/ x0 ] H% D" J" l( g: ]
為什麼站長要改成新的獨家架構?
, T$ S D( v2 L1 {7 _就一樣由AI模型來解釋清楚吧。
( ]$ ]9 i7 s+ x H6 w
8 }3 F4 S: K$ |- Q" s i$ L
% J2 R. n- ? O9 w* y# a/ G+ W讓我分析一下使用純 PHP 和使用框架的優缺點:9 V4 D+ a, X, g2 S* b
純 PHP 的優點:
9 S" F1 U C6 ~; a1. 性能較好 - 沒有框架的額外開銷
! x3 s. C. C1 g* O2. 學習曲線低 - 只需要掌握 PHP 基礎知識! N- F) w9 X5 H$ P4 S
3. 更靈活 - 可以完全按照自己的需求來設計架構+ Q& V* u6 }9 U8 P0 ], u/ O C
4. 代碼量小 - 不包含不需要的功能模組
( |% y& @8 ^) G+ a( {7 M' p5. 適合小型項目
, n) l [9 l/ C: A7 E純 PHP 的缺點:" Z% `' N0 s% G4 e5 F/ B
1. 需要自己處理很多底層細節* f. F$ }' i y1 K( B N/ X
2. 代碼複用性差
" ?: X8 A% y( E, `" t4 Z+ m2 d& T3. 缺乏統一的開發規範, q- V! ?0 |" h' [/ G
4. 安全性需要自行考慮和實現
! ^2 D- K- {: D, G6 z5. 開發效率相對較低
7 x/ s7 l9 ^# L- n- y* T6. 維護成本高/ y4 q. r& u2 P5 Y' t5 k
使用框架的優點:, E5 w. ^1 U+ k) B# S3 e9 D* ~
1. 開發效率高 - 有現成的元件和工具
0 r/ a. ~: k* z! ] Q2. 有完善的安全機制
/ }3 d" I4 F' ]3. 統一的編碼規範3 \7 K. a' |6 q
4. 易於維護
: B5 e0 {- q- ?! b: y7 z7 B5. 有活躍的社區支持/ d; |4 t+ p+ o) s7 s7 r7 M9 Z
6. 適合團隊協作
- R! g( Y! e2 y' I% ?7. 自帶很多常用功能(ORM、緩存等)
1 D! z, H5 F& F1 ^- F$ Z; V( i使用框架的缺點:9 r' @0 h0 y& a* u$ J0 I8 A, o; B! w
1. 性能有一定損耗
) C1 L+ Q% e6 s$ I! g" H* O2. 學習成本較高
# U, K6 V O0 }5 l3. 可能包含很多用不到的功能
( \0 a% a0 S& s4 A4. 不夠靈活,需要遵循框架的規範0 h3 g4 d% J8 H, P" r! m7 O0 A; s
5. 對小項目可能顯得過重/ V1 g5 H4 p6 Q. R! u7 O7 X
建議:
" I) T- I6 D1 G* m2 O( h1. 小型項目或學習階段可以使用純 PHP
% X* X% X+ j% p- h6 W, k+ {2. 中大型專案建議使用框架
& A0 T. M& ?- i3. 選擇框架要根據專案需求和團隊情況4 v' B) i! R( g* Y- \2 l" v6 Z
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
$ e3 I( ?2 E4 F( x6 q# J# g3 O) t% z您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 E, K7 t @8 ~: s# j
3 \* s. q" M0 w' Z2 R1 q2 J- j/ X4 G
1 p1 X# P; {. V+ s, C+ Q" d1 v9 ~; U
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。' W' h8 @4 T2 X4 B K$ y; R9 e0 O" S
* s7 @' H. G w5 S+ C, I7 _- b
這個轉換主要做了以下改動: e& ^) u4 @9 E0 a X
9 m: j2 O$ m! S g. `路由結構:
$ u: j) @* I- N6 o- J- y } f! l: L$ B) O9 F6 _* ~
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
6 w- t/ d, [0 A* g2 [# M支援原有的 page/mode 參數結構" j4 Z; D* t5 J Z
通過路由規則自動匹配到對應的控制器方法
1 | f2 Q3 O0 @. x* F4 }$ [ O4 I8 Q3 @6 Y. @
, J' D! N) h- i" C9 f; @2 o' M6 p控制器結構:
% |; P, Z' b1 J/ @/ b0 M& o k7 I+ J% @
創建了主要的 LoginController 處理所有請求: p- s1 e1 I( V9 e7 z5 j
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
0 d0 j# ~% [6 K3 \* Y7 ?; x. u5 g錯誤處理改用CI4的視圖系統/ ?1 Q2 { S: {9 T! o
4 @$ ~/ [' c+ W4 c# h( J$ {0 |
1 E9 c* u: Q5 {! @3 }' f類的組織:% d5 m! t) v9 n
9 f) M! k& c/ b8 z# J! U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
- y% I- ~+ G6 }2 w1 E3 R$ A4 Q5 g保持了原有的類繼承結構! R9 T$ E7 ?. Z* F$ w; ~" M
改用CI4的控制器基類和特性
e F" A1 d: K+ t7 ^8 l' @ p7 f% V$ @
8 s7 i- H8 U( G6 k* u) F改進的安全性:
. e1 b5 L" F& T, B; Z7 U" |
7 S! B* ^+ E( l( ^. d使用CI4內置的安全特性6 y) }" h; X& }0 I; E
更嚴格的輸入過濾! j }' e( _- O
更好的錯誤處理機制$ p1 X8 G7 E; u' {2 P
+ W! z0 Q: k) ?- _9 M. j9 C3 w* t8 X
" F% L0 @8 m! N5 d6 L要使用這個新結構,你需要:
: D- V0 m: L8 D3 c0 ~* M9 v" \" f j% C5 I% {' O
將這些檔放在對應的CI4目錄結構中8 s5 N; o4 E' C! A6 w
確保創建相應的視圖文件
* z- ~9 z. u" A6 N配置語言服務
4 R3 B9 M. }. b# S+ f b根據需要調整模組檢查邏輯
9 h6 b! `$ I8 q1 }2 n0 X# S- V9 ]; n/ X' ?; p
需要注意的是,你可能還需要:
8 \, D. n! K, v
' j3 `* t# h5 c K% ?' {1 z2 \2 l8 O- ?創建相應的視圖檔(在 app/Views/ 目錄下)
5 |) N L" y- k1 }' s: X |+ W! H配置適當的中介軟體來處理會話
0 ~- [! i1 `' Y! K% V1 m" ?實現具體的登錄邏輯
: B4 M) m) J7 C# t/ D% M. q, O% z* j4 P$ b* p5 T
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?1 G0 @& I9 a) ]. d/ E7 l- K! |- ~
4 @+ {7 D3 i8 J( Z% U- <?php
$ {: B# i: U& H - // app/Config/Routes.php
9 q7 R5 y: U& z) X$ Q0 R. W0 N - namespace Config;% O9 |+ q& \' ]; P- ]" C
- $ D _) }4 k1 u7 d, x, o" g h
- $routes = Services::routes();" [+ ~( _4 ~7 d$ ^6 x4 f
- 0 q& g' u+ x: s& o4 t; P
- // 添加自訂路由規則! K# r8 L) U; H# j6 p( G" D
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {% a0 ~) ~/ C q- y5 d: u, s L7 ~
- $routes->get('/', 'LoginController::index');
/ r9 N9 x# t1 j8 ^% r - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');4 f) A$ X1 j2 z8 k& T# u
- // 默認路由處理5 T% P' n' G* T* m8 g
- $routes->get('(:segment)', 'LoginController::handle/$1/show');' ~+ }% }6 ~, }7 N& L6 q
- });
# l9 _9 E" t @; [8 R3 M/ L2 k
. l; C% b# Y) K. @- // app/Controllers/Login/LoginController.php
9 s5 ~" h% u( K# k5 H& z# h - namespace App\Controllers\Login;2 _( h' Y. L* K6 _0 K
$ j' E; D- p' ^9 m- X- use CodeIgniter\Controller;
/ m: |4 z; b; d! F7 D - use App\Controllers\Login\AbstractLoginPage;
8 Y) s% L1 Y# m
$ a9 {4 \9 O- @ Z; I- class LoginController extends Controller
5 p6 F* A+ T( D# D, J7 X; j# @ - {
2 m6 o6 H2 x$ E. A" |% I - protected $pageObj;
0 Q! }- {! P* e5 h2 w: F/ z- r- E - protected $LNG; // 語言物件
9 f/ E6 b# B2 ~9 n& u9 |4 c: S
+ u1 A9 O o- l6 z, n: k/ O- public function __construct()
/ K- ]% \, P* u0 D - {
& ~$ R1 W" |% f7 Q8 }4 C - // 載入語言檔和其他必要的依賴
3 Y& e7 I/ l3 v) r - $this->LNG = service('Language'); // 假設你有一個語言服務
+ w% R: r$ T2 I8 P4 j& T$ X# Y - }
1 _4 P2 Z; D9 v; B - " [5 Y8 F2 z' k7 m. q: i
- public function index()
; b- O( e3 V7 B( { - {
5 w9 v& K$ }/ [, u6 i# | | - return $this->handle('index', 'show');7 q: ~( B5 w3 y7 i% p4 j
- }
|9 l6 }8 H$ k# h9 t5 E1 S8 J - / @1 i: @; J: x' M' L8 d- a r
- public function handle($page = 'index', $mode = 'show')% }3 I( _: x E* N* f7 E
- {
# P5 f$ U0 r: x" c; q L. D: ]* W3 m - // 安全過濾頁面名稱5 U( ?/ j# q; e9 D5 N: x! n/ k; I
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);# N7 t9 y- j/ b8 K. z
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
( ]! }3 L6 o2 [' l& P5 I -
6 v4 _ ~5 Q$ k) Z) S - // 檢查類檔是否存在" H8 e+ k3 ~# j0 V/ W
- if (!class_exists($pageClass)) {$ A& j, u# A6 h
- return $this->showError($this->LNG['page_doesnt_exist']);
/ q) a+ l. B& L' o ? - }* b- \, Q& B1 N4 C1 b
- ( I. w( C2 l# w$ C6 D
- // 產生實體頁面類1 N E5 d" N+ V, a" O$ ?' z" d8 Y
- $this->pageObj = new $pageClass();+ X$ _9 d1 ~ k+ y% y
-
! w6 m3 Z3 v7 B6 b - // 檢查模組要求
+ O4 U S! a! N8 S4 c - $pageProps = get_class_vars($pageClass);( G h- h; R: q/ |
- if (isset($pageProps['requireModule']) && " l6 W' s9 @/ Q( J$ ]/ a( k: ~
- $pageProps['requireModule'] !== 0 && 3 h! `2 A( g& l
- !$this->isModuleAvailable($pageProps['requireModule'])) {
) I3 ]/ `% x) y! X) z5 x - return $this->showError($this->LNG['sys_module_inactive']);
6 @# }% C- |9 @+ h' j: E8 s - }# s; Q2 o' G5 j" C# t( @
0 j6 A! j. n# K3 H. t3 k* S) i- // 檢查方法是否可調用
" r" H. `# K0 |* c9 ]& \; X - if (!is_callable([$this->pageObj, $mode])) {
# R1 I6 @4 d$ Z - if (!isset($pageProps['defaultController']) ||
6 X* P4 r9 U9 J1 H( N3 z - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
+ c8 E8 l9 L6 D - return $this->showError($this->LNG['page_doesnt_exist']);
" N( z5 }7 Q/ G* T! S - }
0 \/ Z; T# S0 ~. Z5 N3 T1 j4 ` - $mode = $pageProps['defaultController'];
. g, v- {* ]/ ^* C - }, M; @) r- H6 q
" t$ l; t, Z* U4 Y6 x- // 調用相應的方法
$ `. b& {1 N8 f% J7 ^& S f) M# y, a# S - return $this->pageObj->$mode();
, i' e0 i0 Z, R" m - }
( ^: R! ]: X- r8 X/ C* n Y - 7 D, i% g- @5 P$ C! G5 i* P
- protected function showError($message)( @5 i! p) T' R& |6 k
- {
7 K. x/ Z/ E8 B# k, ?: E% P2 Y - return view('errors/custom_error', ['message' => $message]);
- g. P( h0 f, W) }5 S/ } - }) l% i8 Y" ~ L! s- w3 E9 H1 V
- * e" C1 q7 @9 l; f8 E0 C6 G
- protected function isModuleAvailable($moduleId)
/ ~3 ^2 n- F. y# @ - {
) r. L2 X& |' Y - // 實現模組可用性檢查邏輯( E/ R$ s! I! c+ [; d
- return true; // 根據實際需求修改8 m8 z' W+ E, J+ ~+ j" }# c. M0 L0 z
- }
: v! P- G' R' Z/ k - }
; B5 J4 `, C) d! `, @ - & V) Y" h- V8 T e
- // app/Controllers/Login/AbstractLoginPage.php. \* _& l+ l/ a/ g# {7 W
- namespace App\Controllers\Login;
2 o1 R) [3 _, q* @/ z - 6 z5 M+ f [: [3 p1 N0 X, [% t
- use CodeIgniter\Controller;
8 q) U' W e2 }4 [
1 q/ ?# w; a$ I7 m- abstract class AbstractLoginPage extends Controller
4 v3 o; `4 ?! E0 P/ W4 f7 Z - {
P) a; E. y4 R) y - // 實現基礎登錄頁面功能
/ v1 D; K: K! R" b' B _; X1 }6 o - }
* r/ I% c8 D9 y9 U% r - 0 E# I+ p( X) v. u) c3 g
- // app/Controllers/Login/ShowErrorPage.php
' Z4 {) i; H% _) ~3 W5 A0 f - namespace App\Controllers\Login;
, D+ G2 J% ~3 H" c) ?, w+ { - & ?; ~/ d8 ?4 v8 H# P$ T
- class ShowErrorPage extends AbstractLoginPage
" S' N* Y0 R6 `! {2 ?8 ~2 [ - {
- ~ d# W0 O# n a( W - public static function printError($message)
2 W: D+ b l: `; E4 I& l - {
2 i5 E6 ^# k, l - $controller = new LoginController();
5 S, x$ O1 I4 f+ Z6 l - return $controller->showError($message); O3 o! y" [- }0 `, }4 F% p
- }
, q% F: l% o( k5 s) \ - }+ ]% j: ~8 R; G; A) v. j
- * _" R5 @2 G* ~& t% R/ m
- // app/Controllers/Login/ShowIndexPage.php0 G) V0 J$ Q$ A6 s' U$ V
- namespace App\Controllers\Login;
; V u3 I. F6 v' I" @) h. L* B - # E- l0 N* L4 Q6 u8 @
- class ShowIndexPage extends AbstractLoginPage. w1 W7 {! H/ d! k4 x) ~
- {& h$ _6 e/ U& `+ o( V" V
- public function show(); Y, P* M/ P, M; t+ h" I) P$ Q
- {
1 k& r2 ]% f& J* ] - // 實現登錄頁面顯示邏輯
8 b1 h' o8 b# ?' _4 X - return view('login/index');
; a" t- f6 S- [" K' B5 T4 H - }
+ l" a5 F ?* ]6 T7 D - }
/ z) h& O6 { T8 I- g
複製程式碼 |
|