等級:25 - 爐火純青 經驗值:0 / 247 魔法值:15278 / 15278 生命值:7%
升級
  100%
TA的每日心情 | 奮斗 15 小時前 |
|---|
簽到天數: 6069 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致! M) f% ]& r8 `0 s' l% X
AI 就是站長的最佳幫手。
3 D n! P% j+ R3 o* }7 F( r% t# h1 w& u i- V
/ a" \' n: ]. d& z' V3 k
這裡的「新架構」是指後端的架構會有大變化2 k6 X" J1 F, W$ J5 e, |0 B
但前端的 UI 介面玩家不會感受出來有何不同
- K: s7 F2 C( R* y
8 l) ?9 ~- R% L: Q8 d4 H" s$ O8 W8 Q5 d! i0 @. @; x
為什麼站長要改成新的獨家架構?1 B, q$ P( Z) [% v/ Z- Y
就一樣由AI模型來解釋清楚吧。; \1 D7 A# D! r
. [" D, m m! q B
1 W. F7 H! u* G) h4 t4 q4 j讓我分析一下使用純 PHP 和使用框架的優缺點:/ U0 [! C d- x! c2 p
純 PHP 的優點:
+ ^8 F& |; F, u7 F6 h5 |; S1 N1. 性能較好 - 沒有框架的額外開銷
. y! @( V! F5 Y; {7 s# E2. 學習曲線低 - 只需要掌握 PHP 基礎知識
9 X- z6 P7 n& u- j+ p- c! w5 `3 E3. 更靈活 - 可以完全按照自己的需求來設計架構7 N- M* _, A4 E' h/ _
4. 代碼量小 - 不包含不需要的功能模組
3 ~* u$ t3 E" R3 X$ z! E% d5. 適合小型項目
, `- y3 s( T5 E純 PHP 的缺點:8 w: b. u1 A6 P0 X' k2 S6 a
1. 需要自己處理很多底層細節
+ q1 ]0 \) X- s' E2. 代碼複用性差0 {' u2 Q: G/ x& @4 ]( f
3. 缺乏統一的開發規範
1 U, b: w! Y5 B6 }. [4 m4 A0 F" c4 d% D4. 安全性需要自行考慮和實現
$ e4 M. q1 p: S( N5. 開發效率相對較低
& I+ \0 R& a8 P& T8 M6. 維護成本高+ G: N1 [ y( u+ O) v n
使用框架的優點:
: Y/ S! e9 d& C7 k0 }6 q: m1. 開發效率高 - 有現成的元件和工具" O, f7 f8 J: H% d! k Z$ \
2. 有完善的安全機制; q5 }9 J- I& D- u6 k/ G
3. 統一的編碼規範
6 e$ ~; |: ~3 ~7 M- G2 t4. 易於維護' I3 R5 n9 ]! \ X7 H7 ]# E: q
5. 有活躍的社區支持
' R5 \5 c5 f. e, ~6. 適合團隊協作5 R7 X; U) O* V& p. V4 U, B; k0 M) H
7. 自帶很多常用功能(ORM、緩存等)
1 n/ r$ [. ]" x- V/ H8 n4 I- R使用框架的缺點:. B- c- m, u3 b: g% h2 d3 Z, V
1. 性能有一定損耗8 N9 Y q* p. w6 Y. s
2. 學習成本較高
0 L+ `, G# d' n1 f8 e, |% j3 i3. 可能包含很多用不到的功能
4 Z( d& U0 ?% k6 @, h9 r4. 不夠靈活,需要遵循框架的規範
: G7 U; c+ |8 j* S0 a4 d3 l5. 對小項目可能顯得過重# t) c- r& |8 t5 w- U0 A5 g
建議:8 T) d+ `9 I' C% A
1. 小型項目或學習階段可以使用純 PHP9 I. a2 \; w6 w$ A3 ^, ^( ~
2. 中大型專案建議使用框架4 R% [. i3 S5 P; t" M8 o0 B
3. 選擇框架要根據專案需求和團隊情況
3 Y1 m. K) L8 o3 W9 d9 G4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
$ H" }1 e2 I( H* e- U6 H您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 Q( D! n: q0 W' w3 L
5 |) @% J e; P$ ~8 L) A: w3 N8 p3 q* r6 ~7 @: J1 B* h$ ]$ ^6 j
# |! f$ w) r6 N+ E7 e& K3 H5 w+ |
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
; n/ D# ~% S# O0 ?9 {# m P e& ]" |
9 I7 e+ u. W: w1 n這個轉換主要做了以下改動:" l. p2 L( d: n c# i" }
# a; a: T% j! e3 Q" j* Y
路由結構:
0 B" v6 Y- P; {! Q
" E I3 x, X2 s+ C8 L使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下 b/ r! k/ E: ?
支援原有的 page/mode 參數結構
0 o+ I: V- \! z, N- x7 R6 i/ u通過路由規則自動匹配到對應的控制器方法$ d. C1 e4 {" p( O; @1 K: v6 Q. d
+ m0 {# g7 d3 V# X! L5 d5 X* p8 g4 Q$ c0 t! |8 d! ~1 ~
控制器結構:! O% |/ _6 Q* `/ ]/ \
8 j+ m, O* }: d* s創建了主要的 LoginController 處理所有請求$ w: v, }% d* Y4 {4 h/ ~; Q. I
保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ K/ T5 g( P6 Z o$ r# ]; }
錯誤處理改用CI4的視圖系統9 c( V- ]7 \' l8 i4 `; v. L
( i3 r0 A& @/ m; X" i- j% x$ P
0 b* K. z( h5 d- U
類的組織:2 x( ^7 r, g0 I" U
* M; U4 K$ S: r6 L, B
所有登錄相關的類都放在 App\Controllers\Login 命名空間下/ w/ \# J1 ?+ d9 w; ]
保持了原有的類繼承結構5 v' D! C Q" T( @3 C
改用CI4的控制器基類和特性
: w5 e9 z" U0 [# k8 X0 l0 x$ L( ^! }) \( J6 Z- u8 D# g% _# E; L: L
w4 }% {3 ]1 C0 u4 l3 {- `- H
改進的安全性:9 w9 Q- d& E. S, J4 L
' S+ ]3 x" l; o/ v使用CI4內置的安全特性% A, z- ~9 ?/ b6 @% j, k
更嚴格的輸入過濾5 X9 u7 N q) H! V% A- W! l
更好的錯誤處理機制( x' p) s+ O: @& Z8 r* v
* P$ F5 X, V% ~; Z8 d
. ?: ^/ O1 c$ }) ]3 l
* D; ]5 |6 k) n8 R& K6 }要使用這個新結構,你需要:
: ?' w" |: q8 w6 T' P6 Z: q1 w' ~6 R* s0 x5 j# m" i
將這些檔放在對應的CI4目錄結構中% H% [7 M& f |" d! g( V J/ u/ \5 B
確保創建相應的視圖文件
, `# i! B' P+ o$ H* @0 D配置語言服務/ I9 r8 w" z3 i
根據需要調整模組檢查邏輯
: ]4 t* c w1 {1 S8 U
& T7 H. \+ I% \: A, _需要注意的是,你可能還需要:# z1 J2 U7 ~; @4 z& H5 `
2 O; C! b \# l m9 z( {' {
創建相應的視圖檔(在 app/Views/ 目錄下)# m H. D9 U. u& c# Z% T, L9 \; t, X) u
配置適當的中介軟體來處理會話5 _4 a% l+ o! M
實現具體的登錄邏輯1 s) [6 x) S6 u
1 |$ C4 a6 S' h/ A0 F R需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?) S3 V* z9 K/ _3 a, y8 ~
1 ]" f# u7 h4 `* V0 t) C
- <?php
3 Z/ B" G4 Z, _/ Q6 U; |3 }" | - // app/Config/Routes.php
6 h' d% K$ q+ h! S3 H1 U7 }" j+ e9 q( D - namespace Config;
! I4 O8 V' z8 {
, s$ j& v% a! }# M$ v% g- $routes = Services::routes();9 B9 b6 I6 N) d! ?' [9 m8 F- k
- - Z& ?" B f3 h$ E( K
- // 添加自訂路由規則/ H s8 p, d2 ~
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {$ ?' P; T& X! A% U, v) |4 d. s
- $routes->get('/', 'LoginController::index');- c4 I# _% q2 ^2 o
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');0 I* j- ~& y% w% I" ^
- // 默認路由處理
, r3 t1 g6 k+ r& ^ - $routes->get('(:segment)', 'LoginController::handle/$1/show');
# Y6 z" l& r6 Y" f& |; A+ X. f - });
6 L: K; C0 `' Q- h1 d7 V - ( ?4 [% s# J& T, p8 _
- // app/Controllers/Login/LoginController.php
4 @" M( X' a& l# h - namespace App\Controllers\Login;; e! N/ _9 `8 N' v- Q9 ~
- ; X/ Z6 K" C; F' n6 M5 j7 W( c# \
- use CodeIgniter\Controller;6 A+ d! |# m( A& A, ^, Y- m
- use App\Controllers\Login\AbstractLoginPage;' K0 T0 l& O; h. `' A2 k* K
- J% ^$ c9 k1 N' S2 D D- class LoginController extends Controller
: x, k/ m% |0 y7 A5 I - {" I" E- `6 I1 y: P, V# \
- protected $pageObj;7 L2 s2 q* f4 z$ [2 W
- protected $LNG; // 語言物件
# ?6 P0 c o" `" s A - & p3 f- e8 y% @+ p& U; x
- public function __construct() * Q2 X4 P3 _4 @2 Z' D
- {
! e6 c" t1 G$ o/ |. d - // 載入語言檔和其他必要的依賴0 e" ^1 [6 \' I, N! V- U2 J
- $this->LNG = service('Language'); // 假設你有一個語言服務
, M3 L: X' R1 Y6 p. D6 [ b( S - }
/ ?6 z) b7 c+ {/ G' h - 2 }, m+ n0 V# m. y
- public function index()
|% v8 ~9 m7 D# \0 ~ - {
! h9 g" I5 x) k c: \' j - return $this->handle('index', 'show');- w- J5 T8 e: c% D
- }
- P( p- w/ L& l8 i" W
" R& ^3 L4 K: }) E; s- public function handle($page = 'index', $mode = 'show')
5 k1 f* z2 [2 ^; W8 t/ ~8 |9 b: S - {
. G0 R( S: m6 p2 U - // 安全過濾頁面名稱
, D) y7 C0 |# Q, H' x* ?0 i, \ - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
; G1 ~2 @7 Y. F% [3 H7 S - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
2 S0 O! {3 v2 {1 w. k" [2 M - 8 e' G% z2 M. @ |5 s! o
- // 檢查類檔是否存在( I+ E$ {3 u C0 Y8 j
- if (!class_exists($pageClass)) {. T" S( G3 G2 x T. N
- return $this->showError($this->LNG['page_doesnt_exist']);0 g/ C$ R" D8 ? X. y4 l
- }: D& ?& X3 l( H) G
) g% ]- M$ R: [$ n& v/ Q- // 產生實體頁面類
1 Z8 o) H% H" d6 [6 T T - $this->pageObj = new $pageClass();
* o! r) Z3 M( I$ j - 5 E6 e, `( {0 s1 G
- // 檢查模組要求
2 ^/ F6 `3 V% Z" q& k - $pageProps = get_class_vars($pageClass);& b4 t; ]2 [0 ]3 x6 a+ n
- if (isset($pageProps['requireModule']) && ( f( T9 T, \: A2 ?% g& D! \
- $pageProps['requireModule'] !== 0 &&
0 K. B5 w0 Q/ c- ~! r# j: g - !$this->isModuleAvailable($pageProps['requireModule'])) {, i' [! j0 ?3 D! Z
- return $this->showError($this->LNG['sys_module_inactive']);4 \) o! s/ b0 {' h& L) t( Q- Z. B
- }
3 y+ A6 K/ S# r7 V, B - 4 L4 t6 {* i3 K+ ?9 `2 i
- // 檢查方法是否可調用( _" M& K$ J* y8 W+ W) k1 B
- if (!is_callable([$this->pageObj, $mode])) {
1 L6 a- |- g' j. \1 t - if (!isset($pageProps['defaultController']) ||
M# Z) i+ W: K" R9 W - !is_callable([$this->pageObj, $pageProps['defaultController']])) {- o) W. d7 h3 q l9 n
- return $this->showError($this->LNG['page_doesnt_exist']);/ t& [' Y: A6 f( g5 |. r
- }% L" ^( E' H% N W* {% D6 J
- $mode = $pageProps['defaultController'];
( Z+ Q1 m X6 r2 U/ B: d - }
* | ?, U" \% E9 w! C) p
% b4 l+ {0 d* g% @# ?- // 調用相應的方法
4 z' g( a7 G5 Q - return $this->pageObj->$mode();0 i+ c4 j9 z" O3 P7 V
- }4 Y4 Q8 R8 [: M9 |* y4 k4 v& x
- 1 D" p1 r6 e! c( G/ D; }
- protected function showError($message)
( H. S1 a7 s( ?, G - {
; F$ \: A/ V7 h; `* T - return view('errors/custom_error', ['message' => $message]);
4 j# V3 z" X1 V7 }: K) [; J% Y; H - }
9 o2 k$ v& C7 X8 f Z - ) z* k/ S! \1 U' m; o. j5 p
- protected function isModuleAvailable($moduleId)
, }, M: o# F( D - {' h; z6 ^9 m* @( G% z
- // 實現模組可用性檢查邏輯3 i4 t# ^. T! g( S6 x
- return true; // 根據實際需求修改0 b8 {! C0 l' B3 w4 o
- }( _( z/ Q7 g V" y1 f& a
- }) V% Y2 _ J0 c5 L; ~' G& a) {
- ! ?& P" {- c9 v9 v' ~7 V
- // app/Controllers/Login/AbstractLoginPage.php- p, z( t; Y+ f# |
- namespace App\Controllers\Login;
/ o4 S6 S: W5 w" |6 c5 f - 8 I6 [. ^$ S# F5 B8 A
- use CodeIgniter\Controller;# W" j5 a4 {3 O! v( t9 J0 W
4 C% \, c! M/ D# J0 V/ O- abstract class AbstractLoginPage extends Controller
2 w, y9 D& A$ M% h F: l+ V7 N, D1 x# B - {- c8 R H: Y1 V3 V
- // 實現基礎登錄頁面功能
3 J9 A# o* I8 g2 }. l! n1 Y) b - }
, w0 G1 P- `# k/ \% j) y' y. X, A - # L( c! {2 @% n2 u5 ]* D
- // app/Controllers/Login/ShowErrorPage.php6 f7 t, D. e% P$ v% R! x" G W" c
- namespace App\Controllers\Login;
% d" X2 P. J# m3 }& V# c - ! x2 k0 F) _, O1 X) B0 d, K* s' R0 b
- class ShowErrorPage extends AbstractLoginPage) Q' A0 j- f1 W1 Z1 o, X
- {
* g$ @ t& ?9 K% `+ `# B' d) k' M4 P8 I5 Y - public static function printError($message)
2 I/ j- _, z& {4 d9 U7 W - {5 d0 ~- }: n+ ?7 W9 i. s8 Q
- $controller = new LoginController();& b6 r( W8 L" |, w+ e* }2 @0 z
- return $controller->showError($message);
" U. v8 m5 A3 h( l - }/ w: h& m( u: d6 i6 r4 E8 V' j- j
- }
, k5 l" s- y' M
) o# N+ `0 M+ U$ a3 v4 A( i- // app/Controllers/Login/ShowIndexPage.php
% c$ }' Q O4 h" g8 g$ @4 H - namespace App\Controllers\Login;
- P7 L8 H" ] P5 l8 v2 ? - 3 `' r" k( ^. y
- class ShowIndexPage extends AbstractLoginPage( D; j A ?1 Z, x6 D
- {+ W ~" u4 ]- m8 q6 F
- public function show()3 i' b9 o X- m+ `5 S: x& \
- {# a! H6 t) W; ^6 T2 g! e
- // 實現登錄頁面顯示邏輯
; \+ n8 F/ ? Q9 W9 O3 l& E0 Q - return view('login/index');
/ y8 a6 i. G' }4 H- _7 c) H J1 r - }6 s8 ?+ q" N% ~' M0 j
- }
! ?0 |. z! U9 p6 a
複製程式碼 |
|