|
等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14427 / 14427 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 19 小時前 |
|---|
簽到天數: 5800 天 [LV.Master]伴壇終老
|
發表於 2024-11-17 20:43:13
|顯示全部樓層
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
* w. ^: h. L0 J" f' A2 A9 V% TAI 就是站長的最佳幫手。
6 g X( u% m' q; l, C
, a7 P( q" D2 j% e# B, Y
! V3 _& U" t' N0 p這裡的「新架構」是指後端的架構會有大變化
1 D- g y# F# O7 K$ C" s$ B4 I8 w但前端的 UI 介面玩家不會感受出來有何不同: W, c& R2 I: k2 I s [
+ w* g3 x7 d/ _ a: G2 L* b; P7 C' w: v+ r
為什麼站長要改成新的獨家架構?
n9 [5 i) A' q* }就一樣由AI模型來解釋清楚吧。; M& F* i8 e( ^" \0 q
& K8 v5 X# ]5 _) y' Y1 g) ~: J; c+ E
* J( {7 I# |0 Y* E% c% G讓我分析一下使用純 PHP 和使用框架的優缺點:( ^' q* k' ~6 n7 ~% ?
純 PHP 的優點:
- z* {* A+ f6 g( a! |5 R7 Q1. 性能較好 - 沒有框架的額外開銷; }8 l. `' g3 h. F; e" Y
2. 學習曲線低 - 只需要掌握 PHP 基礎知識& b; [% O( ]6 e
3. 更靈活 - 可以完全按照自己的需求來設計架構. ~/ O& o- F/ T1 F6 V% f/ N
4. 代碼量小 - 不包含不需要的功能模組
0 q+ b2 l, ?' P: z5. 適合小型項目
1 o3 S8 U' a% Z純 PHP 的缺點:4 F) i& \" ]- M6 ]3 ?1 E
1. 需要自己處理很多底層細節
, |0 r0 @& z. T- _) `2. 代碼複用性差
/ V* E, J7 x+ E9 `% l2 R3. 缺乏統一的開發規範2 d' L8 h0 X1 e) k% W( f# @& M
4. 安全性需要自行考慮和實現
6 k) x' \( M n( }( s/ S: m$ Y# c5. 開發效率相對較低
: T4 T9 n f& C% n% P1 c6. 維護成本高
& ^) F% G, }# q/ o+ \使用框架的優點:, Y& r. j7 V5 I- A
1. 開發效率高 - 有現成的元件和工具 r- R% d/ Y! j
2. 有完善的安全機制
" k) h d1 x9 h! c8 T% @$ @* T3. 統一的編碼規範" w+ l4 h. u [: W$ @
4. 易於維護
f7 Y% p. C- o7 _7 H5. 有活躍的社區支持
5 W4 I5 @2 [0 M! z: c6. 適合團隊協作
9 y1 W. \2 Y: E7. 自帶很多常用功能(ORM、緩存等)
. i- i' a4 \1 N3 n" c0 B使用框架的缺點:$ u; b* o- ?( r6 h: O/ @9 ]
1. 性能有一定損耗& p7 \) J. k. M+ C5 r) t
2. 學習成本較高! _5 \5 O" W4 P9 R- r z6 G& f
3. 可能包含很多用不到的功能- ]0 J2 k# H4 n' w4 }& V: o4 `
4. 不夠靈活,需要遵循框架的規範- J! K3 b- M! W
5. 對小項目可能顯得過重+ H7 X3 L% \, F
建議:
7 c# H# E+ v4 p7 a1 ^3 r# X: t1. 小型項目或學習階段可以使用純 PHP
g% O7 n+ t/ C( f3 Q2. 中大型專案建議使用框架
: x. V' e1 D; n* v8 K- Q3. 選擇框架要根據專案需求和團隊情況
& t* |$ d- Z: G" x9 o3 h4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
9 A! P/ @9 }" f1 Q. { X您打算開發什麼類型的專案?這樣我可以給出更具體的建議。- K7 H+ k$ M; F6 v; E& e% f U
" j5 ?# P) @( d9 I% w8 L. m
0 R- Y- P7 G( K$ O+ D6 Q
7 m/ I. L9 H2 f, P; L% e/ {
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
: s, V5 C" t# V R0 Q& j3 G$ `9 @: N' Z+ `- ]4 y! x
這個轉換主要做了以下改動:
5 c7 v O8 g/ K1 f) c. W( e6 E1 J1 O+ Z' X: ]
路由結構:9 G7 S! G, h ^/ l' U( v+ V
e4 E3 k6 v, |; @0 l- U* m使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下* a7 H2 M% p$ j2 H- H+ x! r3 `
支援原有的 page/mode 參數結構
) h& u+ ?" h. v1 N Q8 o0 V, J, N通過路由規則自動匹配到對應的控制器方法
8 l X9 _. x0 c# T( R. x
- `! t1 R+ j1 ]- r- P3 D6 A; k4 t- p: J Y) i1 ?% I$ T
控制器結構:
! {0 V$ y. b- ]+ g7 h9 C1 p! {! p1 L: [( u
創建了主要的 LoginController 處理所有請求7 K$ V1 ]+ E" }
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
. Z3 g4 A) y0 g) z- o8 O錯誤處理改用CI4的視圖系統
4 p" L- W+ `: Z2 [; F" h0 t: m; H0 Z# W+ ^
8 {9 |& u0 m& y
類的組織:
8 b1 v) s" r0 F" k# l- g/ e5 p, H# A
) q9 c4 u7 Y$ n7 Q4 [; N/ U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
- a4 R0 {+ L) d% Z, e2 V- C% I保持了原有的類繼承結構
, b5 X. d" Z P/ l8 E" c' ]8 a% I改用CI4的控制器基類和特性
" k2 A/ `' i/ C7 I$ k+ {6 d
6 q$ P7 u2 q- H8 N" S, Z, ^* p0 x3 |
改進的安全性:+ j; k" f" {- c- \2 H2 G
: s" D) F! e) { r$ T
使用CI4內置的安全特性
- I9 X( `: o7 u+ J/ Y更嚴格的輸入過濾' U) [" w* r2 }& \4 `) y
更好的錯誤處理機制
' p8 Y" b% j7 E# c1 ?3 K) i- h* Y: }2 L: N- t7 m
6 Q+ a; Q) X, N; |# o$ N" y9 y' e0 M1 m
要使用這個新結構,你需要:& u# p! n; Y. v0 u% N' l' {
3 O5 R$ n- y3 X+ R3 s9 Q Y將這些檔放在對應的CI4目錄結構中
& ?# x8 ?2 j, z: O$ c確保創建相應的視圖文件
8 n! f& r% y6 p* O" L+ k配置語言服務
2 J; v7 `2 d, S# r/ N根據需要調整模組檢查邏輯) a5 o }0 M* f4 { h9 s0 S9 i3 Q' k/ u
& H2 g! `9 T& R: G7 ?& k" v, g
需要注意的是,你可能還需要:* z6 [5 `/ R( g
{7 J4 F& @+ H* E( G2 H- i2 d
創建相應的視圖檔(在 app/Views/ 目錄下)
6 \' Q4 R9 e2 V( }配置適當的中介軟體來處理會話( a# f1 G' t( ]3 i4 X" s/ ?
實現具體的登錄邏輯
- T% W! r: \8 d4 A
2 ~4 @( z1 J2 n$ y' m需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?6 z0 Y* F* \# \7 O) n
) G$ o: I8 B7 g' b( f- <?php' f* p+ I T- i2 m
- // app/Config/Routes.php( J8 } \: J X5 R8 u
- namespace Config;
+ }( e# ?( U' S7 _/ h0 H - , Z+ [7 H# b, W9 V* @$ D( @% r
- $routes = Services::routes();2 h- ?) z, G5 @) ^( `
' e; S: B2 \/ ?% h6 \* W- // 添加自訂路由規則
, q" f. v2 v- @" \ - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {4 }7 y8 A, n" ?
- $routes->get('/', 'LoginController::index');. Y# F% A6 I+ o
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');, c7 X1 V9 N8 {0 h0 m$ K
- // 默認路由處理
6 B# E' N) g* }- Y* U# p! g - $routes->get('(:segment)', 'LoginController::handle/$1/show');8 v. X$ u/ U+ }5 {" x3 j
- });
6 f2 W2 v( f3 s9 L2 w
, _, W& R+ e$ U( s" }: l7 _) o `- // app/Controllers/Login/LoginController.php
9 C$ y7 P& @ }5 L. Q8 D - namespace App\Controllers\Login;, p( h& o: z5 K8 w7 l
- $ F" C0 Y$ {2 p- V$ X
- use CodeIgniter\Controller;
% p, o5 y7 b4 ?6 s$ z - use App\Controllers\Login\AbstractLoginPage;
# Y) {/ B& ~, I8 [4 h
( X9 I2 M7 G+ p$ t+ n* x/ J- class LoginController extends Controller
5 ?0 N; d5 i* a" X7 I - {
* R5 A( q: Z6 T0 P - protected $pageObj;' y: a0 Z1 _ Z$ a2 C
- protected $LNG; // 語言物件" H' t4 G1 w3 b8 s
& }/ i3 R; w4 l9 j3 \0 H9 P7 o- public function __construct()
7 \) O1 K" g4 p$ u% U - {6 X% r/ F& n k. o# p. a
- // 載入語言檔和其他必要的依賴% [2 Y0 I4 U0 T- {3 S/ p" G
- $this->LNG = service('Language'); // 假設你有一個語言服務& N0 D2 d8 a [$ D4 Y! i& _1 e2 D& Y
- }
/ n) E! N0 g8 K. h - . V/ q; J, |3 ]! u1 D5 I. s3 k ~
- public function index()
5 S5 S" }9 U" A. G7 L& _: D: e6 E - {) x7 r' L4 {7 T4 I+ u5 i
- return $this->handle('index', 'show');
4 M/ t; Y R4 ]5 @( ?5 o+ L/ O+ z$ d - }3 _# z- n g( u7 ~6 e& [* I1 ?
- R* T& U( v0 S8 c8 Q8 _
- public function handle($page = 'index', $mode = 'show')
% u: d8 c4 e- c. Y6 W4 N - {
# N) n( E" R* A, _, D+ m - // 安全過濾頁面名稱
& K! b9 j) r' r0 s - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
2 Z/ p d/ ?, i( T - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
7 ^5 [ n6 d2 v! Y* U2 j/ q# h - 7 ]; @' o3 o* h5 @$ u! P
- // 檢查類檔是否存在
$ c: l+ R- R* W B3 S4 R - if (!class_exists($pageClass)) {: s1 l' h- V, V
- return $this->showError($this->LNG['page_doesnt_exist']);
3 j7 `6 f) _& W5 h- q - }
( ?- M R# {1 A1 J4 L: X - 6 ^. `+ y- W# ?9 N
- // 產生實體頁面類' `* r- o E( n& o* S
- $this->pageObj = new $pageClass();
# c7 G" |4 U1 b0 t! y - ' x8 u$ E2 c8 h, `) D
- // 檢查模組要求
, ^" U' Z+ Y Z4 Y: o. V0 s8 ? - $pageProps = get_class_vars($pageClass);
4 i/ f& `! l o) ? - if (isset($pageProps['requireModule']) &&
; G% {% F& I `: G8 B. j - $pageProps['requireModule'] !== 0 &&
5 B- I- t1 |# d2 q; h4 S - !$this->isModuleAvailable($pageProps['requireModule'])) {1 A( ], N; i5 O: V
- return $this->showError($this->LNG['sys_module_inactive']);
9 v4 N- i) q; ]' B - }
, T9 M. k3 a$ D$ y - ) x& o# B) v, E3 ?$ b
- // 檢查方法是否可調用- {2 ?- h( M3 `/ I/ _# L2 _+ r$ p* [
- if (!is_callable([$this->pageObj, $mode])) {
( O' t% `) n1 l9 ]1 C5 n - if (!isset($pageProps['defaultController']) ||
6 C) y+ W- j! U( a+ a7 w( M - !is_callable([$this->pageObj, $pageProps['defaultController']])) {' C8 f8 o n( J% ~1 h3 x
- return $this->showError($this->LNG['page_doesnt_exist']);
|$ ?0 z4 Q* C0 t/ k+ o. ^ - }
% E A- X, N1 ^: y. t - $mode = $pageProps['defaultController'];2 p# x. l9 }: {! \" U# L
- }& e" \6 ^$ J: ?1 D8 i* K
- ; n6 W0 R" ?1 u( ^
- // 調用相應的方法
9 A. a& n, D5 K$ ?7 L% f - return $this->pageObj->$mode();
1 @7 f1 G# Y% }7 m; {9 m9 E - }
3 z( t4 k; ~+ n7 S; z H0 x8 D4 l M
# H( H9 v, \6 D2 i5 F- protected function showError($message)
3 d4 l9 r2 T& A4 A - {. v% G' y% {! X; J
- return view('errors/custom_error', ['message' => $message]);
$ Z& b# N+ w" o- [& K d- ? - }
/ g; ?" h) S- p - 2 ~" q1 C0 }9 U" k
- protected function isModuleAvailable($moduleId)8 o5 a5 S& j2 z& V! ` |1 T" f
- {* `2 Y8 p" \* K% n, m1 C
- // 實現模組可用性檢查邏輯" |* b8 U- D6 ^! o7 Y5 ^
- return true; // 根據實際需求修改
8 `3 z1 R- [- o5 O1 g0 Z8 Q# ^ - }
& o3 E, p V# @* b4 W - }
" L7 V' h, D5 o6 d - 0 D# ^8 p1 W9 M6 e3 q y; @
- // app/Controllers/Login/AbstractLoginPage.php
- w0 I) z9 ?- ]/ g: B% e" g; { - namespace App\Controllers\Login;
6 e! d/ m. G0 v; ~* P7 n
$ {, B' P7 B1 n- {9 w. y! n- use CodeIgniter\Controller;0 S3 q9 c% Q. o" |( H3 b. L' [
- ; o- K+ p n' w4 E
- abstract class AbstractLoginPage extends Controller
6 M6 o3 h( o) C) |7 W - {
* T. k( Y& n& A: \7 ^2 P$ x7 K1 a - // 實現基礎登錄頁面功能- _! l9 ~) |1 G; }) |
- }) S: B( u0 S, L" s5 t: m: ^0 c5 @
" s, _! ~# R* ]8 t Z7 Z; ?) A% {- // app/Controllers/Login/ShowErrorPage.php
7 _0 \. T; G$ x, A$ U - namespace App\Controllers\Login;
" A' H1 t' W/ G4 W. D
; Q& Z: U3 ~1 }- class ShowErrorPage extends AbstractLoginPage& N$ ~3 [& y; l; f; i5 R. c4 Z; ^
- {" e0 y& s2 H1 ~$ A* a
- public static function printError($message)
' @! y) Q4 y F8 _- n1 E - {
5 L3 M/ X% V' @ - $controller = new LoginController();
D8 r% U3 E- E0 |0 b( ` - return $controller->showError($message);
2 C4 a: n0 \4 K9 i - }
4 { x& K! a$ R4 b$ } - }9 i9 e) g8 r9 l& Z
- & D5 M* Z9 Z8 z2 A
- // app/Controllers/Login/ShowIndexPage.php
$ k. R$ ^/ [& e" J4 `$ Z) e0 o* z - namespace App\Controllers\Login;
# A% Z2 D3 j& t) n9 }7 A3 Y - + Y+ V0 y4 i4 S& P# w
- class ShowIndexPage extends AbstractLoginPage: G6 T! P( ?2 y$ o8 q4 A5 _/ q; g E
- {; h4 M, }8 x# B$ _, U+ |2 O( j
- public function show()
) ^4 T7 A- d1 X0 ~8 T4 I0 `$ L6 X - {/ E# `- ^' r; y9 ?) t: N: F' o
- // 實現登錄頁面顯示邏輯* p1 A9 s, l2 g4 Z. [& |% i7 Q
- return view('login/index');2 f/ u/ Z& P6 \& X: }
- }
2 m A5 }% X5 r - }
1 }1 i- {$ `, {0 i, ?
複製程式碼 |
|