等級:25 - 爐火純青 經驗值:0 / 244 魔法值:13397 / 13397 生命值:4%
升級
100%
TA的每日心情 | 奮斗 13 小時前 |
---|
簽到天數: 5426 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
- y( S& Q" G6 a: p7 R& }0 ~- VAI 就是站長的最佳幫手。
* V; R" B- C" E0 J& M1 Y- l2 _( w1 k% ]( V
& u7 L& X- W& b+ H3 y這裡的「新架構」是指後端的架構會有大變化; F& Y% n+ e: S7 H2 b3 Q
但前端的 UI 介面玩家不會感受出來有何不同1 ~3 R0 H( n" F. g9 p. }' V
( z/ U0 j9 l* y# A& M% P# C$ B
0 i& Q, n& p, S3 d
為什麼站長要改成新的獨家架構?# W8 |4 @+ C7 n" ?" v
就一樣由AI模型來解釋清楚吧。
- w3 F# |# ^" M+ b0 s6 }! H
6 m1 n# d- L/ B4 v4 o
- |8 V# e4 ^, J) F |1 Y4 ?9 x8 b讓我分析一下使用純 PHP 和使用框架的優缺點:
, F, |6 W9 W- A( c+ T4 y: }純 PHP 的優點:
. @6 ?$ z: R5 ]6 p5 q! c9 ?9 h+ ?1. 性能較好 - 沒有框架的額外開銷5 c% e' o D- s' }8 f
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
# m g% P" g+ i$ z5 i; {! Q) t" t3. 更靈活 - 可以完全按照自己的需求來設計架構/ P3 Z. x% ? B/ n3 T8 j" q
4. 代碼量小 - 不包含不需要的功能模組* Q5 _5 q- ^1 q2 Q& k6 F, t; R6 s
5. 適合小型項目
2 m2 w: }+ U# F/ F純 PHP 的缺點:' @% `7 b9 j% r; ^ U3 }
1. 需要自己處理很多底層細節
4 _; ?1 k& S$ m0 x3 b0 p$ [2. 代碼複用性差
, s4 ]% n; G6 |* D! a7 _7 Z3. 缺乏統一的開發規範
/ }7 F& w$ o& w7 a2 }) j/ [4. 安全性需要自行考慮和實現5 a$ D1 s4 v+ B1 u
5. 開發效率相對較低
7 l C4 d4 W8 Z; z6. 維護成本高
1 }( ^" i! o( F/ E, A使用框架的優點:
( n& S( W. D0 L% Y$ l! ^2 B1. 開發效率高 - 有現成的元件和工具
* D0 v& N; }. o% K2. 有完善的安全機制5 z9 Z# R; ?0 Y2 c. |
3. 統一的編碼規範6 q, {; y, _) \. h
4. 易於維護
; r8 k/ B- |( G$ ^. X5. 有活躍的社區支持, M D& x4 X; [- g
6. 適合團隊協作8 v5 ~- N$ B3 \- j/ F, R
7. 自帶很多常用功能(ORM、緩存等): o$ S4 \; ~1 H$ t
使用框架的缺點:/ ~+ E. u# v4 S& ~ K( z
1. 性能有一定損耗( q: i* F! P- ?2 d4 r5 K
2. 學習成本較高
3 M! {1 D4 Q( Z1 f3. 可能包含很多用不到的功能
Q2 P1 N* o# R; ^$ e- ~4. 不夠靈活,需要遵循框架的規範# f! o0 ~' F4 T* w( @
5. 對小項目可能顯得過重9 d# `+ D f( E% B5 m) [; |
建議:
9 g5 `/ b. ^, ~+ e9 i% Q1 r. D7 W1. 小型項目或學習階段可以使用純 PHP
* S' Y* ~' ~3 J x" o4 ^, M3 W" {2. 中大型專案建議使用框架' N4 T% \% u. d' s8 a6 C2 d
3. 選擇框架要根據專案需求和團隊情況8 m( b5 [' G e3 j! _1 P; ~ G" i K
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
2 ~/ B) A" Z/ |7 c6 q' Y- Z您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
5 D/ ^; d/ Q' e$ W& |6 j/ Z" R0 t& r O, D$ ?0 z3 i3 i
9 G+ u! W( }9 m6 A9 d9 O9 L& t& \( s8 z$ }/ ?0 _
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 }- f+ C) ~- m! }3 o
) W. D) C' ~) e6 z J/ }0 j
這個轉換主要做了以下改動:
/ o6 `2 }% {& \
# N v( c3 b- h( F! V路由結構:
& p7 Q" x' u {1 a4 M. |3 A p; Z6 O
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下8 L! A2 A! C5 A- ^' K
支援原有的 page/mode 參數結構: c, w; X5 O4 S; E s
通過路由規則自動匹配到對應的控制器方法
4 @% l6 m) t1 K7 b% u1 v+ |( e% `, v! j* `# C, x
5 [" J% S3 U: R2 ]- W- T/ X# z
控制器結構:
3 {/ T: ]' O0 p0 e8 H" i% \5 F; x Q& R+ M
( E4 C- V# T2 K創建了主要的 LoginController 處理所有請求
0 ~+ g' i. n7 A! Z; i/ N' t0 d& t$ P保留了原有的頁面類結構,但改為符合CI4的命名空間規範* Z2 ^& J9 V+ H, B O" `/ ~
錯誤處理改用CI4的視圖系統
1 B( H" A: Y7 f' j: W$ k; P( S, j# l1 U N. Z" T' Q( L+ ]. p1 Z. h1 v. i
% e/ X/ V# L% h, F' S類的組織:/ b% W* `- l0 R
$ p B) S- Q6 X) ^4 L1 \
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
0 [; s. F$ r/ ~" h6 ]4 C保持了原有的類繼承結構
. s) H; b- |1 u$ j" v; R改用CI4的控制器基類和特性
/ n& N1 S- `+ p" l7 d6 N# `4 z) m2 k$ I! ]0 }
/ T$ O" I. r, \5 T改進的安全性:
% m& n# l* m9 l7 l5 c2 _3 W0 f' t/ {* L
使用CI4內置的安全特性
3 h- _2 v2 m( l更嚴格的輸入過濾
/ ^6 v7 C; F' o, N4 ^更好的錯誤處理機制, e% y1 H$ N w2 Y+ U8 b
# U0 o% I, `+ T5 m" J0 X
4 Z9 V& q# D1 H! Q+ [
; o0 I5 G1 }5 S# U( j要使用這個新結構,你需要:. Q& k8 S) y9 I* s$ _
" r1 r3 F6 Q; e" X3 Z7 U% u
將這些檔放在對應的CI4目錄結構中6 v# \5 _7 Y3 \, ]
確保創建相應的視圖文件
% R; q+ p/ V1 B配置語言服務4 O p; B* L, w" c9 S0 a
根據需要調整模組檢查邏輯
: s8 K/ [) q$ i/ {, Z( k- T- o" C4 }& ?5 a8 K4 L( \
需要注意的是,你可能還需要:
5 g5 @# s- L( n2 ^+ |! _$ x; k$ h* m, A4 w5 I4 G: W
創建相應的視圖檔(在 app/Views/ 目錄下)7 p+ h+ n; n/ P9 l! t" x
配置適當的中介軟體來處理會話: g/ e. e0 S) k8 G- I
實現具體的登錄邏輯
! G) S0 z/ k5 C0 i. Q. @8 N+ X# p4 f4 [0 K8 A/ _- K( r
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
- g9 Q; X; ~0 p" y |& ^& ~9 U
8 T6 n5 m) T5 j5 T: W6 v+ c- <?php
% H- E+ b& b7 w% G; e; Z - // app/Config/Routes.php
4 D% c/ K9 _/ B3 F: w- ?! i! l - namespace Config;! R2 A _* h$ l- \
! y. e+ d% `* v9 ^% R$ I9 `- $routes = Services::routes();5 y, S$ V/ R- ~ N( u
; R& k+ o- F4 N$ I3 C' L9 f" |2 I* S- // 添加自訂路由規則( }8 x1 G8 t C. b4 M. S7 m
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
9 D5 Y' S4 D8 u4 J: u! a - $routes->get('/', 'LoginController::index');
/ j0 k: s9 k+ D; e - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
. v# O/ Q+ s5 ^5 g5 M5 |( A( t6 V - // 默認路由處理 B, r# _, v' V) |; Z
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
- H9 n( q2 y- X - });% c4 ~1 ~! e8 h9 b3 E* V
- : x. A# S1 Y4 z+ L
- // app/Controllers/Login/LoginController.php* a9 _+ B6 p M0 D& ?8 J
- namespace App\Controllers\Login;
. |+ M+ J* Z4 ]& } Y. C
7 g8 R5 y; v' K6 r; i- use CodeIgniter\Controller;( D* Y, z& S b) W, C
- use App\Controllers\Login\AbstractLoginPage;
; z3 m" E1 a) p; n, q* D3 q
$ _4 ]/ Y; X, Q5 _- class LoginController extends Controller9 k1 g% |( I; q7 b1 |/ _
- {7 ?) {) v( s' o. W
- protected $pageObj;5 v2 Y1 E# s8 Q3 Y0 R7 @
- protected $LNG; // 語言物件# ~# e9 s [6 d( ?
7 N* ?) }) o: b% ~- public function __construct() ; O Z4 |' i/ h: |
- {# y. p; J8 o4 @6 Q( f0 x' Q/ @
- // 載入語言檔和其他必要的依賴
* P& q8 ^5 D' S - $this->LNG = service('Language'); // 假設你有一個語言服務
; P+ q4 e4 P, e4 D; }, J9 C - }
8 ?( o8 z6 F' ~$ G% G4 H+ C: ` h - ' Y- m& g% T$ W, S
- public function index()
! |( r- J1 V" f" X; i - {# J4 q5 Z) z- R- m
- return $this->handle('index', 'show');
$ ?$ @( ^0 {4 E8 P7 ^1 j, e( c8 e8 C - }9 Q5 s; M( t W# s
- 6 a6 H9 d! ?3 H* w) Z
- public function handle($page = 'index', $mode = 'show')
% P4 F" ]8 ]2 V" h0 K - {
( y: z; w! Y& B- \: x - // 安全過濾頁面名稱4 y P3 I1 U5 ]4 @# O
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);* W0 u, H! m9 Y1 N V, \8 I
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
3 D3 V, ?8 G5 v/ E5 H - ' t8 ^1 S: v; Q( _# B% i& y, N9 q4 C: G
- // 檢查類檔是否存在3 Y, N8 F. O3 S# O2 W3 |8 q
- if (!class_exists($pageClass)) {7 a' n0 B, c* c, p4 m4 Q3 B
- return $this->showError($this->LNG['page_doesnt_exist']);
9 x* q4 g. G7 O# r7 _ - }
: z2 N5 y' K1 i9 g8 J) C+ @
% n& N0 W. ]3 n- // 產生實體頁面類
9 U9 w6 q. n0 |, q* S3 y6 _. a& K - $this->pageObj = new $pageClass();
9 T1 g5 |5 ]* F6 b7 l -
( G7 |4 q7 g# B- Q+ {8 @ - // 檢查模組要求4 V) t a6 A3 ?+ t( D
- $pageProps = get_class_vars($pageClass);& W: k7 Q! t2 k4 U) a% J( F/ N
- if (isset($pageProps['requireModule']) &&
1 B# l; c& ?' P( F. }+ r6 e - $pageProps['requireModule'] !== 0 && # C3 R5 T+ s# `2 q/ ^
- !$this->isModuleAvailable($pageProps['requireModule'])) {# n. T, K# Q& D! `. r8 n
- return $this->showError($this->LNG['sys_module_inactive']);7 i; m7 @6 F1 C8 c8 S
- }$ T8 r3 ?* O. F+ ~
- 3 I$ f9 G4 e- ?* x# M( P
- // 檢查方法是否可調用
8 x, x. g0 p* v, A2 o4 t2 W" j1 s - if (!is_callable([$this->pageObj, $mode])) {
& {- K- Q' J3 D - if (!isset($pageProps['defaultController']) || % \% _, M' X( a1 I; T, i
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 L& D* _) a+ f4 D4 S8 b, [& O% N2 b
- return $this->showError($this->LNG['page_doesnt_exist']);
" [- \) C( X2 f# ]0 R - }2 U- Y2 U5 T! C% _
- $mode = $pageProps['defaultController'];) I! W6 X, C6 C5 K
- }7 T" y( H1 n- w7 u9 v( D
- $ W* _8 n* F. t) E2 M: H
- // 調用相應的方法2 G! k; ]% [& j" N; ?. ^
- return $this->pageObj->$mode();' u0 S2 E* W- p7 V1 J
- }* X! @4 i, P# h6 | J
% @6 o) A3 J- u+ l* m: L! _- protected function showError($message)8 v4 q2 J0 u4 B0 A6 {1 L+ M
- {( B" D& ~& B$ [# C) l
- return view('errors/custom_error', ['message' => $message]);' S4 U/ f% j+ W; w0 s" b
- }$ ?# e: Z" K8 b$ c7 Q7 o7 I: Y/ u
* q4 W% b6 L S' f0 A! y- protected function isModuleAvailable($moduleId). m7 B- w! ?5 d$ }/ u5 G$ r
- {) E9 |" A' v, _+ G
- // 實現模組可用性檢查邏輯0 W0 {' c# h. @% q5 r+ f+ k8 p8 V) x
- return true; // 根據實際需求修改
/ m, D" Z5 ]# E6 w0 e - }
# r! O& @9 L4 y! L - }; A& L$ P) A3 ^' O. m9 D
- 7 [, ^0 R3 V8 x6 Y5 K/ `! m
- // app/Controllers/Login/AbstractLoginPage.php! p2 ]0 g0 G8 T
- namespace App\Controllers\Login;1 v* S* X7 d( X# p+ z* D3 d w
- 4 F9 G/ w; U. w" K& i
- use CodeIgniter\Controller;& I% T2 w! X& O9 O1 C3 L
7 E4 ?5 z) L7 A8 m4 ~- abstract class AbstractLoginPage extends Controller
+ w; g9 Z# r* e: m" W" g1 G - {
8 J8 {1 h" i* [$ l3 s: d) b - // 實現基礎登錄頁面功能; }6 Y7 m# s! |/ o
- }# I, U; B) ?$ [. ~5 O- B
- * t+ a0 Z7 V& [: \+ ~4 M+ z
- // app/Controllers/Login/ShowErrorPage.php
- L. \1 u$ [: v. m ~. g3 c - namespace App\Controllers\Login;9 |6 R$ |4 K) l$ K; I# P; V6 M
- + H! G# `1 o6 v: W3 ?& o
- class ShowErrorPage extends AbstractLoginPage, e6 a" w* Z) L' @9 i# C/ Q
- {
! }* N& i" k3 L- \/ ^ - public static function printError($message)0 o) K6 w E+ x/ @& a8 @) V: O
- {" a$ j" J4 ^/ o3 g4 d: V2 g* F* V
- $controller = new LoginController();$ x& R, k& `$ a
- return $controller->showError($message);6 D0 m$ ]: M# S- P0 H: N
- }. z9 h2 F, I; }) v& \4 I
- }
: d+ A7 E& b2 F* s
4 h7 T* w& X: q: M& ~5 l- // app/Controllers/Login/ShowIndexPage.php
$ X0 X2 v6 Z' f: E% V - namespace App\Controllers\Login;
7 b$ |& @& E2 x; X' Q. }. f5 V0 @ - : c9 k6 T1 y6 c
- class ShowIndexPage extends AbstractLoginPage( b/ r/ _/ T# T; ?5 G# m' {
- {
2 t! _" }( X2 G7 S2 ] - public function show()- t, Q% C6 K' d5 N" N4 M; d
- {) |8 s( x' z) o% j) D8 U
- // 實現登錄頁面顯示邏輯
5 h X1 y) o& |9 R F; w - return view('login/index');; S+ a4 k0 l; f# i
- }) A/ p- M1 C+ K! z5 z1 F
- }! p* V1 B1 N# g/ y
複製程式碼 |
|