等級:25 - 爐火純青 經驗值:0 / 245 魔法值:13939 / 13939 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 6 小時前 |
---|
簽到天數: 5627 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致6 v+ v5 t6 Z% | H8 w
AI 就是站長的最佳幫手。
2 m4 t9 \) B0 Q6 J3 ~# @0 V' X: x& |
2 M% U. U% i/ C o1 ~2 E這裡的「新架構」是指後端的架構會有大變化- Z. S8 P' n" ^' R
但前端的 UI 介面玩家不會感受出來有何不同* E9 S! |( I: U ?7 r" z4 B
8 X& A" W& A( C3 O [
9 p- m0 a" L$ P! i1 J; T5 I為什麼站長要改成新的獨家架構?
. D% C6 W7 q( G+ K就一樣由AI模型來解釋清楚吧。1 a) K: ~2 c+ p. z' L3 T
4 n0 N5 @/ Q6 M: h6 O
: z& p- {* h! w; o; ^/ s讓我分析一下使用純 PHP 和使用框架的優缺點:5 d) l3 K7 i! X9 Q1 U& h1 a4 S4 u1 }
純 PHP 的優點:$ K8 Z3 U7 r( B, d" Z# l
1. 性能較好 - 沒有框架的額外開銷( M9 v2 w' e: q4 B9 l5 k; g2 p
2. 學習曲線低 - 只需要掌握 PHP 基礎知識1 R: F- T0 f1 C: _
3. 更靈活 - 可以完全按照自己的需求來設計架構( Q9 Q2 S4 n* `# }9 k- H
4. 代碼量小 - 不包含不需要的功能模組8 B+ y/ a/ ^6 j7 D! }. K' v3 g4 ?
5. 適合小型項目
) X+ U9 w6 Y4 ^* |/ n# _純 PHP 的缺點:
) U% h2 t8 f- g; {1. 需要自己處理很多底層細節) P/ v% |* J6 H, y; j
2. 代碼複用性差
- F+ U$ G1 d" R" ^, m, G W3. 缺乏統一的開發規範9 H4 v; W; M7 [% G5 N8 X: `
4. 安全性需要自行考慮和實現
" G1 w# r4 W) N; O5. 開發效率相對較低 ?6 E! C b- n5 H+ F
6. 維護成本高/ l$ k7 O3 S! U4 }
使用框架的優點:
( e0 e9 N3 D+ |- c1. 開發效率高 - 有現成的元件和工具
9 I7 w! x2 n; L, B2. 有完善的安全機制
) C5 q$ \' E; ~7 i; n% s3. 統一的編碼規範
# g" n& e4 l) D9 T; e6 [4. 易於維護5 a: T; Y/ j1 D* o& g: K
5. 有活躍的社區支持8 k7 s# k7 Z( V* S
6. 適合團隊協作! U6 D7 K; r, J2 U7 N
7. 自帶很多常用功能(ORM、緩存等)
8 P: x& e u- E" ]+ [; h使用框架的缺點:5 P" ^. ]3 c& \% S0 z$ V
1. 性能有一定損耗
4 X9 R* `% Z$ ~ Y; w( \2. 學習成本較高
5 N9 e; y# r' X' c t3. 可能包含很多用不到的功能
& d5 b9 y) `& w1 K7 C2 k4. 不夠靈活,需要遵循框架的規範
+ a# f8 B! ], E5. 對小項目可能顯得過重& `5 N' E5 w5 O3 o' m3 O7 m
建議:7 O' L0 @: N) J: q( ?
1. 小型項目或學習階段可以使用純 PHP( H: D( f; `! {6 m; Q- D0 h! J$ p
2. 中大型專案建議使用框架* _% I" j" V7 h0 q
3. 選擇框架要根據專案需求和團隊情況
( [$ [- [9 t% k% O2 O4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
- K* F! G1 _$ N1 |, y3 M& Y+ d: W您打算開發什麼類型的專案?這樣我可以給出更具體的建議。4 k0 Z8 e- o9 W# C# U2 Y ~+ T4 n
% S- k/ }/ {, ^( @- J* i
7 n' B# N* C9 A
! _6 P& H4 Q. M& _& q
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
' a$ E% X5 t$ S a0 S
% o: b; U9 y; Z# k: n6 K' E7 c# S這個轉換主要做了以下改動:( w! C) u! Y( K
) o/ m7 E2 U. \6 `: d) s路由結構:
2 F) B0 m' M, g9 A* E4 @3 w& S8 }2 W6 X! \ X/ J6 D I H
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下0 L: r& _" i8 c' ^2 g" @" V
支援原有的 page/mode 參數結構+ V: d% _; O- X
通過路由規則自動匹配到對應的控制器方法4 F z! B. I# {" F: O1 Q
3 W, |. y: f( M" R* c# K0 a. K( D0 z- `! ~
控制器結構:9 ]3 D7 ^4 `- o. [ e3 T% [
9 h3 n8 a- W8 r創建了主要的 LoginController 處理所有請求( c' ~0 a; p$ s" h
保留了原有的頁面類結構,但改為符合CI4的命名空間規範( v0 A: S' {, z0 H# O# G( f
錯誤處理改用CI4的視圖系統
: L' Q3 h: p4 `0 A) ~
* [+ d- _' B% U4 ~7 q! V
* t: X2 w0 G3 m t類的組織:) v6 @! l- }* C3 G
; e% a }# l( r; u* P! R所有登錄相關的類都放在 App\Controllers\Login 命名空間下
0 v. R1 v* o; X3 S1 k保持了原有的類繼承結構
; w( L5 }- p( s! X- }改用CI4的控制器基類和特性3 b- c+ A: o! q" E9 X( e
! d' V; A# F6 F: J
- N \9 R* p6 \2 [% `6 a
改進的安全性:
& @- K' z) y% J! ]- a" w' R5 a' _- k; C8 y1 T+ m& E
使用CI4內置的安全特性4 _+ H- }' i* x- y
更嚴格的輸入過濾! \; }& m; ?9 u8 T$ S3 Q" Z: s
更好的錯誤處理機制& n; ~9 H# e3 \. L1 Q4 E+ V# O: g
! {3 t! }9 }$ I
/ U- c3 I4 z$ Y9 J. u
1 q/ O" Q9 F% ~* g# J1 C要使用這個新結構,你需要:
9 p; T4 F3 O4 h3 L5 m1 O9 x s7 [6 E X) i1 }( R# z( d
將這些檔放在對應的CI4目錄結構中
* E. n) k4 i) z; y# Q2 u! ~確保創建相應的視圖文件7 D8 t& C8 `/ a0 I+ }
配置語言服務6 ?$ [. Q. x5 f& d% K% D5 r* z
根據需要調整模組檢查邏輯
2 b: n# j' n) r) {" m" ^+ D, p- } J Y: X- T
需要注意的是,你可能還需要:
: y, L: `. l( G$ L$ e; u; U6 P% H9 m9 i/ W
創建相應的視圖檔(在 app/Views/ 目錄下)
# s; g- ]9 W4 V5 H4 _" q配置適當的中介軟體來處理會話9 C% A- W3 U/ ?: q: W$ l3 b3 M
實現具體的登錄邏輯5 n+ L7 c7 G, v9 h$ U
/ |5 H7 q; H, ~9 C$ I& u! o需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?# K& ^7 p8 l4 R. f3 _0 u
5 h! q) T, D: J, R- x _+ a& y0 Z# l! @
- <?php% B0 g. F) k# e* r, ~/ N
- // app/Config/Routes.php( f' ?9 }- F( i2 N, a: ~
- namespace Config;
0 z8 J- h: J5 |: m3 K" d1 c' x
: [; N5 N$ j3 f- a9 v- $routes = Services::routes();
; {9 Y2 J) ~5 {6 O& g
% b# E% a( A" q9 D: H# Y) ?- }/ J7 F- // 添加自訂路由規則9 M: m/ S4 z6 Q; t1 q' v
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
9 H0 i; a4 q8 L) M% ?1 o0 N Q - $routes->get('/', 'LoginController::index');/ x+ O3 t, C2 q. O* @3 V# N' W5 t7 n
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
2 t2 R" l+ ]1 ~% l: q# N1 \- t - // 默認路由處理3 |1 G3 p3 i! I7 u! U* Y5 y
- $routes->get('(:segment)', 'LoginController::handle/$1/show');0 ~1 M" z0 q# Z/ O
- });
/ y% T7 O* r, g$ E: b
. I) f/ U9 b: H" S) L' K- // app/Controllers/Login/LoginController.php
, n5 C; X9 ]; I, m$ | - namespace App\Controllers\Login;
+ g/ }" s) L1 Z. G6 X6 n - 0 a2 ]$ m9 t- J6 p2 P% T
- use CodeIgniter\Controller;
0 v* i, O6 d3 ]; N - use App\Controllers\Login\AbstractLoginPage;7 [8 @ Z# y$ S6 w8 I0 q7 }: r
W* [; [5 @% i8 W+ A5 F+ r- class LoginController extends Controller# a- u, N# v/ L4 F' `
- {
: ~# x$ F6 V" a0 x2 E - protected $pageObj;
- q" I4 |7 y' _8 k) _4 w - protected $LNG; // 語言物件7 x1 {/ k0 d1 Z; j( C4 `
% \7 Q. Q% }6 N2 w# N A8 \- public function __construct() ! v5 y9 b& b9 `7 }% p
- {
+ x- `. g5 t- m6 _9 L8 [ - // 載入語言檔和其他必要的依賴
: i+ g W9 W2 A; V1 Q - $this->LNG = service('Language'); // 假設你有一個語言服務+ y5 D6 E# f) A
- }
. X. R. \2 Q! `! o9 \
# b( d: G3 S5 X7 {+ |- public function index()
" ]8 f; P' R. I - {
9 N8 |' r- u+ G( m$ a$ m8 H - return $this->handle('index', 'show');
2 H v# Z7 B# M; R& q: D* _& ` - }1 y2 f" N3 s7 g
; s7 D& K6 m' E% f6 m0 ?5 l2 U- m$ a- public function handle($page = 'index', $mode = 'show')! P2 ~; o" G2 O9 t3 }8 b D
- {
- V. n5 G+ c `6 y - // 安全過濾頁面名稱
, V' L4 g/ y; `* }# f - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);5 X% ^( F# w- B" N- H' b: \/ S& b) H3 f
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';+ a/ k) ~# X1 h0 M! y; a% }' L
- 6 q# i9 o( P4 W5 R4 L
- // 檢查類檔是否存在
0 d0 w. {6 Y+ c" `8 f* V5 s2 q - if (!class_exists($pageClass)) {
& F. g$ I- I, l4 k+ K - return $this->showError($this->LNG['page_doesnt_exist']);
8 H4 ?' s" U$ \ Q - }
) U# P6 C, W) h+ g5 ^' n - l6 u4 G4 i: y
- // 產生實體頁面類
! H F0 l% A% C$ \( C- L6 W6 x- s - $this->pageObj = new $pageClass();
) b1 Y) `3 _: u7 H -
4 p! L% z2 Y* [. L - // 檢查模組要求, i# C8 e# u+ [1 G
- $pageProps = get_class_vars($pageClass);2 m5 ~( w! n+ R; G9 L
- if (isset($pageProps['requireModule']) && + T1 e/ O- u- c# S* _
- $pageProps['requireModule'] !== 0 && + `+ |, A+ F+ W2 _6 U
- !$this->isModuleAvailable($pageProps['requireModule'])) {) Q1 Q [; _& M& g$ G* F' @2 G
- return $this->showError($this->LNG['sys_module_inactive']);
# n! m6 j& q0 g/ _' v! u: W! J! Y) i - }
2 T2 R& T; `7 {8 l, P6 U; C% b8 `
! g% w# ^/ S6 m. [- // 檢查方法是否可調用
% m# L7 C; ~2 A) a5 q - if (!is_callable([$this->pageObj, $mode])) {
2 d. d {- k2 g# w% ]( V- O, `# d - if (!isset($pageProps['defaultController']) ||
$ N% e) W* _+ W- h& ^4 O - !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 m: w/ p4 z+ O6 ^2 Y! a' M
- return $this->showError($this->LNG['page_doesnt_exist']);
$ \; {1 l4 _* m7 e/ Y1 ~, n4 X - }1 n8 U3 Y. W+ x* M P
- $mode = $pageProps['defaultController'];7 x& q5 L) i0 U G" w* t, M
- } F- P o) |/ d' Y8 |# J6 S. E/ y
- ' U- Q% V* U6 V; J* @
- // 調用相應的方法6 D' D0 O7 |9 h0 h- `& \1 \( W- b/ u
- return $this->pageObj->$mode();0 A' R1 ]6 y4 n1 B& S
- }
/ P6 \) p: y" J: ^" { - 3 u! @- e" M; G
- protected function showError($message)
* x" X! ? h! J! A! @% o - {: ?1 [/ S8 {: A9 d9 S9 b& s/ {5 P
- return view('errors/custom_error', ['message' => $message]);. w# }+ k; o* v( k+ \
- }. R% v* H5 N' M4 f' {7 I
- . Q3 ]' Z# a1 M# t6 v4 O& G
- protected function isModuleAvailable($moduleId); _ k" o, t4 u7 v' C9 O
- {
& @/ e) R! k2 l3 B/ a% M/ l$ N - // 實現模組可用性檢查邏輯, E j0 h! T( @( A" @( `: K
- return true; // 根據實際需求修改
& X% N& M+ H) D- u% I; j/ j+ V - }. z- _, `9 d/ G: l
- }
' M- U9 T3 |' u2 {! H0 h - : x7 k. X1 ]2 ?! w
- // app/Controllers/Login/AbstractLoginPage.php: N' P" f( ?. b0 j- n- Y
- namespace App\Controllers\Login;* V N4 }: E( o. ~' v
- 4 S( d3 z& o+ e$ j) ^
- use CodeIgniter\Controller;! K9 O2 ?2 O% v: ] B- m9 b# F- t6 M
+ c2 X8 ^7 |, a" J$ u, _- abstract class AbstractLoginPage extends Controller
4 y5 }% [9 w% F" @/ e! K - {
9 V$ n* C% C0 w - // 實現基礎登錄頁面功能$ r( ?4 x6 \3 q- k$ G
- }
. b3 e d/ V. r7 G/ G - & \7 z/ Y4 h/ j4 P: d1 k1 M
- // app/Controllers/Login/ShowErrorPage.php
9 k( a& |& K7 u$ `+ D, @% { - namespace App\Controllers\Login;: U) ^2 ?/ ]6 p+ m
: J S2 K9 D- A/ O$ c- class ShowErrorPage extends AbstractLoginPage7 u, Y4 u6 M8 N: u
- { H8 }% F/ _% m4 T* x. |1 D
- public static function printError($message)8 S7 w# M& W( V" H; ]* E& K4 f
- {
5 J+ X0 X& u2 f2 x5 z' n - $controller = new LoginController();8 |. O( U% A+ V/ t* m$ D. j1 o
- return $controller->showError($message);
* F. _1 }$ f4 N - }. Z( ~, A& u* i1 j
- }, H0 Z! D% e% {: ^: ]9 n6 B
( s. p$ O' a# c7 x- // app/Controllers/Login/ShowIndexPage.php
! ^! {9 c. A/ C* p3 F: {" O4 I - namespace App\Controllers\Login;
1 N2 z2 p8 e2 f" W8 y( W- C
/ k' V. |0 ?$ t- class ShowIndexPage extends AbstractLoginPage
9 L ]+ I0 S2 v* y - {
, s& ]/ Z# v5 T) w. d; b - public function show()/ z) S; Q$ b/ u
- {
) i; ]- S0 |8 E* x- `3 F) r' L - // 實現登錄頁面顯示邏輯
( n2 g! Y( a a, p# N' Q - return view('login/index');6 S- j- z: k: n4 \0 t$ q
- }) d$ o1 N) `" q E% c) x
- }, x6 J7 X) J1 f
複製程式碼 |
|