等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14069 / 14069 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 9 小時前 |
---|
簽到天數: 5669 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致* n6 y$ n2 n7 ]# D9 F0 y2 m$ b
AI 就是站長的最佳幫手。( B* e. {, |; K8 |( E
& A9 i6 [7 ^. m0 {
3 o8 \+ s* S4 s% R0 o這裡的「新架構」是指後端的架構會有大變化
- F1 T) @) _0 R$ ?但前端的 UI 介面玩家不會感受出來有何不同0 U2 r. _& j( w' H3 B: T
{ d9 O( k) k" X% u( W6 d
5 o& i% F; B* l為什麼站長要改成新的獨家架構?
1 Q4 V( U' K. P$ h2 U/ F$ h就一樣由AI模型來解釋清楚吧。
. E8 l% E1 e, S& n1 { \4 p0 }/ F4 | j
3 B' E' m4 v# F. W讓我分析一下使用純 PHP 和使用框架的優缺點:
4 R' f" T6 j" m5 t" t純 PHP 的優點:
" z+ [' @5 U% H2 m! [# W/ P8 k1. 性能較好 - 沒有框架的額外開銷; j9 x4 k+ ^1 W: Z2 a
2. 學習曲線低 - 只需要掌握 PHP 基礎知識" F0 J9 ^: c; _" _$ j' _3 q' i0 J
3. 更靈活 - 可以完全按照自己的需求來設計架構
" ^" D4 o1 Z5 X4. 代碼量小 - 不包含不需要的功能模組
$ t& C0 |" k, [1 G5. 適合小型項目
6 f* x5 }/ P9 ^- M l f純 PHP 的缺點:% q K6 ]6 b9 s( U
1. 需要自己處理很多底層細節
) q2 p0 R( l9 |( ~! Q2. 代碼複用性差
, ?0 d. E0 R2 F! G m. O* A# u6 p3. 缺乏統一的開發規範
; c4 e) q1 D0 q4. 安全性需要自行考慮和實現
) ?% B$ S& Q& v: t5. 開發效率相對較低( A* }: m: J) z
6. 維護成本高% P& D3 c* S, N; M
使用框架的優點:# c( M; `4 B8 v0 h3 e( q
1. 開發效率高 - 有現成的元件和工具
+ t+ r7 @8 E+ |; @( Q2. 有完善的安全機制. D2 k/ E$ H M9 w* [/ s5 T
3. 統一的編碼規範) s: R0 u% v. Y, h
4. 易於維護
' ^6 \: F t8 I/ |6 f. n5. 有活躍的社區支持4 Y* ^) ^; R4 j
6. 適合團隊協作
# Q& U4 E% u$ B# d/ u7. 自帶很多常用功能(ORM、緩存等) N8 @( C& K3 W; U$ ?
使用框架的缺點:9 z5 W5 _6 c$ _- P2 F" u
1. 性能有一定損耗3 G5 J3 l, `4 q: ^' d
2. 學習成本較高) l5 y- H1 g) O! }
3. 可能包含很多用不到的功能2 Y/ B$ q9 o( D
4. 不夠靈活,需要遵循框架的規範
( e+ M9 k+ M; n3 ^4 e: h+ \5. 對小項目可能顯得過重
: _1 G3 [" w4 U6 @3 o7 i, o建議:! Y+ h/ j* z, `6 z: y
1. 小型項目或學習階段可以使用純 PHP5 n1 x9 b( M! q6 ]! B2 j
2. 中大型專案建議使用框架
4 ?! @: ~. n8 X' G, k3. 選擇框架要根據專案需求和團隊情況2 V0 U) r/ s V5 P0 G2 g" O0 k
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
4 [( I6 z+ V8 _# A9 U5 z1 }: f您打算開發什麼類型的專案?這樣我可以給出更具體的建議。1 T& y: T4 ]' q6 X
3 o; s) h8 T: V8 l! C7 c
/ E; a5 K" J. x
6 M# n/ }5 v- @$ ?我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
/ A3 N: w4 M! X9 `+ U9 N) g& {; H: |" n
這個轉換主要做了以下改動:
6 v% ^: j5 L! d7 c5 l8 I' a1 s, I' T; c. V$ ]; ` j) K
路由結構:& Z; u; X& o& X: a8 b. v( [. [
, V0 Q, i+ p$ ~& r
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下6 z4 l' i: \2 U* M
支援原有的 page/mode 參數結構
* k( n- G1 k5 u1 |! c通過路由規則自動匹配到對應的控制器方法2 o+ @; V+ p4 U" o4 d
8 H& H5 I* `5 {* q9 G8 F, x9 g' u0 n/ T7 L: K' q
控制器結構:8 F0 L) A! @7 F! D9 x
4 k+ }3 \. W3 d9 J1 D) t創建了主要的 LoginController 處理所有請求1 A2 A( f2 j- V
保留了原有的頁面類結構,但改為符合CI4的命名空間規範% |/ Y: x1 P h' U. y
錯誤處理改用CI4的視圖系統
7 f7 w# R# |; b- c Q, U! Y8 |& S. e6 D0 a c/ k
/ p) v: o7 e g* I7 g+ Q
類的組織:
' p, ~6 d& h) E5 K+ I$ C9 o! ]3 Z0 J& u2 x% O- L" S
所有登錄相關的類都放在 App\Controllers\Login 命名空間下& a) I+ X6 d8 {3 ^6 m8 \3 D$ g
保持了原有的類繼承結構
9 ]9 U' B3 ^5 n+ Q( o改用CI4的控制器基類和特性
) v: D2 H6 V+ A# d9 I( h2 J
9 b5 H6 q1 H9 D) p3 V$ v/ u- { h, x
改進的安全性:. o: l1 |( h7 X9 u' ? j2 E K3 |
; Q5 c2 j# b/ y$ {使用CI4內置的安全特性( ~$ G) s+ H3 u( ^
更嚴格的輸入過濾2 ^, |5 x5 d- c/ d: {& [
更好的錯誤處理機制! v z' u( L" U
" F+ ~8 C- Q4 w% Q
" J' [9 c1 b, p0 R- b* a0 s9 z: g% j
要使用這個新結構,你需要:
f* A' u+ R, \8 f0 _2 n6 E G$ y
將這些檔放在對應的CI4目錄結構中2 o" I0 w7 Z+ \7 G' b
確保創建相應的視圖文件! `, O* M- F+ p$ t$ Q P
配置語言服務
3 Z) L6 [$ |; D% h, u1 U5 ]$ X根據需要調整模組檢查邏輯* ~+ U% d; j' Y2 S: ^; ?6 m
3 |6 `+ C9 q9 J: q6 j
需要注意的是,你可能還需要:
% P( f! g' C2 a6 ?! Z4 c0 \+ w1 @. o/ y
創建相應的視圖檔(在 app/Views/ 目錄下)
/ ~2 @9 z2 A `0 @4 T% I( \配置適當的中介軟體來處理會話
: S5 ~3 J+ y0 U f+ k實現具體的登錄邏輯: j/ l; N9 l% @* N3 ?- f9 h1 L9 d
; X" f; \: o" p% O3 T, s: O
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
8 m7 @! Y) t3 `/ d+ J1 Y; `* B( A0 s" V' G; X7 e" W* E
- <?php# y. l$ b/ s" X
- // app/Config/Routes.php; r/ q& i( K# I" {: {% k
- namespace Config;# O, b( U7 ?. I/ t
- , g5 y7 E! L# i f/ z2 V' O
- $routes = Services::routes();2 I$ b5 Y* n, y
- 4 E, s+ b: v7 _' _3 v, ?
- // 添加自訂路由規則 F, k9 L- Q' [* {' O1 L0 E+ x
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
( D+ u" F. f; K/ d/ S - $routes->get('/', 'LoginController::index');- F. n6 w4 f- Y) A9 e
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" C: J/ V) d3 x+ N% F! b" ^# i
- // 默認路由處理0 P- b4 o, ]; A6 C5 O" W
- $routes->get('(:segment)', 'LoginController::handle/$1/show');6 f0 M7 m3 q# Y/ |8 o7 L: Q5 ~" H
- });3 @; @6 `& m8 \$ S' \( s8 G T$ g4 O
- 7 T9 t$ k* w# z. S2 E" s
- // app/Controllers/Login/LoginController.php
]$ h4 ?( M2 p, h- \" R - namespace App\Controllers\Login;/ m; |2 s8 {1 W$ F% _$ [$ ?6 J$ @
- 6 C2 m$ q1 z) [' R( _/ u
- use CodeIgniter\Controller;5 n) D2 a% V9 t5 {$ V
- use App\Controllers\Login\AbstractLoginPage;
/ f, h' A5 O2 ]
7 f4 d- f0 j: C7 q% S9 k- class LoginController extends Controller, R. ?2 s; a( k! H, m9 P2 m
- {6 Q7 K2 ?; i& j+ K
- protected $pageObj;7 X( R' B1 a2 ?) k7 h. E
- protected $LNG; // 語言物件5 y6 I9 w" p7 g
- % z# @, r' n) ?6 b+ C2 T1 h, m
- public function __construct() % o- U9 b3 Y. P& M& q; K0 n
- {; x `# J, D8 U# [- a
- // 載入語言檔和其他必要的依賴 i% K2 S4 @7 l- u# p! l- [
- $this->LNG = service('Language'); // 假設你有一個語言服務 \( c& U# S3 M* ]9 [% g( j
- }2 K( w1 P/ B5 \ Q
- ( Q; v4 I5 D) M; W5 ]
- public function index()
: M+ k; d2 [4 |, i - {
- `! z6 g* q2 V2 V - return $this->handle('index', 'show');6 M$ B, C8 E9 }' y. e% q2 H
- }8 O# d t$ h! A- A u1 |
; H0 ]* {& |: o2 f* G" ^: X- public function handle($page = 'index', $mode = 'show')
/ O. s) L1 ^/ T" `% k8 Y - {
) r5 T6 L) s( W$ S. [ - // 安全過濾頁面名稱' f [' w, m# w4 V
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
) O+ d" p! @ e. x - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
: y Y9 }$ L! G; v% { - $ Q( C, d$ J1 {3 z6 x1 x$ F% F
- // 檢查類檔是否存在* Z! x0 x. |0 L) w9 F. F0 T
- if (!class_exists($pageClass)) {, h: h! ^: T& ^
- return $this->showError($this->LNG['page_doesnt_exist']);
! g! y8 ?5 u B) \) c, `# Z - }
, Y Q _/ G4 q7 F! u. S' A- z3 u - # `9 d: O r. f
- // 產生實體頁面類2 R% ?; x2 e- Z$ h! I5 {
- $this->pageObj = new $pageClass();: L. a; | W$ \) {
-
5 e6 y0 z2 r2 Q. l - // 檢查模組要求
1 b5 d8 n7 ^. l: J2 L4 \0 J - $pageProps = get_class_vars($pageClass);
2 o6 o& Z6 U+ O - if (isset($pageProps['requireModule']) &&
' r- Q9 c0 [& s5 e - $pageProps['requireModule'] !== 0 &&
, g1 Y5 p5 o; q) c7 R/ o0 M - !$this->isModuleAvailable($pageProps['requireModule'])) {
9 ]* S8 D7 N( t: c& J0 M+ A& h - return $this->showError($this->LNG['sys_module_inactive']);
1 e" E. J2 G% L) }6 U- o# \ - }
& t0 I& q7 d- f+ [0 X/ R) J
1 I0 L, I8 m2 x1 N2 Q- // 檢查方法是否可調用
. T! n$ p1 D* M8 H - if (!is_callable([$this->pageObj, $mode])) {
# C- \7 D0 J& p$ ]8 B/ @ - if (!isset($pageProps['defaultController']) ||
$ n9 n# B& Y$ z" V5 L - !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 u9 |! a$ }& M3 \" |4 m" P) n
- return $this->showError($this->LNG['page_doesnt_exist']);: F3 N( G9 B3 x1 n5 b7 e
- }1 R. Q" K u( ~- M0 _0 {
- $mode = $pageProps['defaultController'];" `+ W1 l& R6 B2 M& N- N
- }
2 s9 w0 r/ w* y2 b0 x - ( M0 X% F; n' S( ]6 R! l
- // 調用相應的方法9 l# X A9 M( K2 w) Z/ ^
- return $this->pageObj->$mode();
! G6 K2 ~: F1 R0 g - }
4 d, ]0 k1 K1 ~" @0 Z+ E& ~! Q
$ A& `5 U! J6 S% a( |) i- protected function showError($message)9 d ^6 U* Z p+ y5 z; [
- {1 `; g z8 y/ q+ {- ]9 j
- return view('errors/custom_error', ['message' => $message]);% _/ `, n) |! r. m/ o
- }
+ ~/ @0 t# q6 [* b& ]: V. h& i - ) H" j4 m- c3 a* _2 P) Y! G5 q
- protected function isModuleAvailable($moduleId)3 |) y0 d# u6 E) w( @
- {8 d; U; G' J2 T: y' j0 B
- // 實現模組可用性檢查邏輯
- e! R/ Y2 M; C5 r# g7 s# r - return true; // 根據實際需求修改- m' i% d0 S) z9 a4 s+ G _) D
- }
6 O$ a: ^6 |+ |" @. _. E# U( f - }
- `4 r" r* {- F9 Y G8 A
! F( }- y4 P! o- // app/Controllers/Login/AbstractLoginPage.php! i: i9 f1 P; L% V6 K k
- namespace App\Controllers\Login;
4 B: D/ \. ^; Q' L9 ]; @0 s. k
, a* a% v: q- y/ P% _- use CodeIgniter\Controller;, }' S# @3 n! v% A0 n# }1 q! q
- & v+ r: f6 R( c* D. y. f% W6 w
- abstract class AbstractLoginPage extends Controller
3 ]0 A2 J3 |# q - {; ~5 H) d; p1 L, {; r
- // 實現基礎登錄頁面功能
! Z& i& R$ H& T q: _ - }
1 Y# a5 a- [4 {+ r. {: d9 {2 g - 6 k9 E! B# t4 \4 W7 S/ E5 T+ X
- // app/Controllers/Login/ShowErrorPage.php. a5 {$ u; m' q+ \9 |% B
- namespace App\Controllers\Login;+ L* l% R8 i8 x7 x$ Q0 H; b2 O
% m5 q6 t/ F3 V; T2 h- h3 U7 p6 I- class ShowErrorPage extends AbstractLoginPage
) f5 W+ N1 D9 q6 z {, k5 S" m2 ~% ]. ^ - {7 s" h! ?+ V9 ^
- public static function printError($message)
- Y: d; \3 S4 o; ~# I+ G - {9 O, s" h% x- I& ?) K
- $controller = new LoginController();
# Y; D$ x: z, l% x) w t# P# a. G( L - return $controller->showError($message);: w, X6 n6 [) F: I; |, t: d, e/ Y$ ]
- }
4 P7 t2 u$ K+ L) q2 @0 L; M7 R' |1 T - }. T) n7 Y+ U0 |+ E
- ^* U6 n6 i$ p% }8 J9 W4 _
- // app/Controllers/Login/ShowIndexPage.php
" y/ Z( D5 q+ e. M j - namespace App\Controllers\Login;. V2 p) K1 ^4 [( [( T- P l" r) z, k
- 6 I5 {/ Q0 S5 C6 W2 Z
- class ShowIndexPage extends AbstractLoginPage
8 J+ y+ l: R0 g2 T, o+ m7 S - {9 U7 t7 a; y5 U4 ]
- public function show()% u* h0 [2 k0 N+ ?$ p0 K1 e6 d7 p& y
- {; L0 Y0 V9 m1 n r& X, }* U7 h
- // 實現登錄頁面顯示邏輯" w* X/ J' s4 C
- return view('login/index');. f+ h# @) q* [7 O
- }
# U$ Q+ I6 c" O! f# D4 u - }
7 \4 _' @# c0 y( A* f; h' u" o
複製程式碼 |
|