等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14087 / 14087 生命值:5%
升級
  100%
TA的每日心情 | 衰 昨天 01:17 |
---|
簽到天數: 5674 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致) Z5 @3 I* c2 V% x1 `1 p9 J
AI 就是站長的最佳幫手。 o; d% Z2 ]) [4 a
6 Q9 J2 p; D( D e' @0 v
J" ~( y6 {: h) W) J這裡的「新架構」是指後端的架構會有大變化$ a4 z9 \6 T# d V
但前端的 UI 介面玩家不會感受出來有何不同
3 O$ P; N$ x5 g$ d' Z2 R# J( J* u# ?, y! o
* |* `- T# y* \; E9 V0 S: N5 M
為什麼站長要改成新的獨家架構?
1 m. m) s- I/ Z( ]) o就一樣由AI模型來解釋清楚吧。 Z) s3 h4 B, y, `' s$ N4 v
: w% K5 H/ l: }0 M$ o( e
% S6 i. E9 g8 O讓我分析一下使用純 PHP 和使用框架的優缺點:
1 e5 O. x5 u" e% L; q" V純 PHP 的優點:
7 a: X% q9 l/ q; e M* u1. 性能較好 - 沒有框架的額外開銷4 p! s% l' _. P& x; f/ v% ?' A# n
2. 學習曲線低 - 只需要掌握 PHP 基礎知識- [5 ?& B7 }, n+ A; o) `: a
3. 更靈活 - 可以完全按照自己的需求來設計架構
3 C& `. ?1 a- l" M4. 代碼量小 - 不包含不需要的功能模組
3 Z6 `$ X& J+ z$ ^& {5 d5. 適合小型項目; i* t+ x# N/ D3 D, w x
純 PHP 的缺點:' x2 @! U+ I& l
1. 需要自己處理很多底層細節
( H9 Q5 x7 P" _; U2. 代碼複用性差
2 D9 Y4 c/ D( ?( m; ]% S4 k' d& b3. 缺乏統一的開發規範
4 e4 n7 y4 F4 d5 E. G4. 安全性需要自行考慮和實現
4 {8 j9 c) _" B5. 開發效率相對較低/ Q" s. p! x* C$ v }" Z5 F0 b
6. 維護成本高: p( S9 N/ o6 n9 I0 w
使用框架的優點:: u/ X+ {( Z) q2 O8 v: P, Q3 x
1. 開發效率高 - 有現成的元件和工具1 y4 n( E' U- s( @
2. 有完善的安全機制! q' b/ h5 I4 {& }
3. 統一的編碼規範( J% h/ i p$ ~9 q7 k0 f
4. 易於維護
7 N4 z& Z9 `; v5 W( @5. 有活躍的社區支持2 F& g5 Q9 o6 H- F9 [$ W6 p
6. 適合團隊協作2 w; \/ ^" X( q4 U M2 _
7. 自帶很多常用功能(ORM、緩存等)
" C4 T; O+ W' K) K$ V0 H使用框架的缺點:
7 r' {& K; w6 U& _. {- R1. 性能有一定損耗& {* p) Q% d5 Q- r$ n; h" C. @
2. 學習成本較高
1 r F- r! L9 K; L1 g" N; H1 `' U3. 可能包含很多用不到的功能
b. K) |8 V' j. n) P7 M3 d9 [4. 不夠靈活,需要遵循框架的規範
. O/ K7 t" s3 ^5 p4 S! e5. 對小項目可能顯得過重& N5 V( h0 Q" B1 q) B7 L+ w) g7 d
建議:, n' W& n' K- V' T9 \; v: w
1. 小型項目或學習階段可以使用純 PHP% J* o% s$ S6 i5 G; V
2. 中大型專案建議使用框架
2 F3 n' q8 T- g( z( m7 u. Z3. 選擇框架要根據專案需求和團隊情況2 ~( p. y5 x9 G4 z9 ^
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
: ?2 t9 ]/ t) f( B您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
( L3 J) ?. i. a) y$ E4 @% G9 W: ?, R* m7 N
* ]' d0 \4 Q4 m& A* v5 n9 P' P$ O& e
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
' \9 S- C. @3 N& X1 T1 i, g1 _. D$ r8 s" v7 p% M4 O
這個轉換主要做了以下改動:
( e! h: Z) r' Q2 I: M9 L. ?5 q6 }+ w/ p0 g' Q1 z, d" H1 c% w
路由結構:
2 m5 k! ?$ D; L8 [6 w; W) j
- f. Y* T9 m% K, I; Y使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
I" A6 L& a* }" p/ b支援原有的 page/mode 參數結構
5 ]6 g& l5 m) H0 O通過路由規則自動匹配到對應的控制器方法* W5 ^, u2 h0 F {
% J/ L3 ^ V2 u; v+ [( g9 {0 E& m. V b6 u# w2 A5 F; r; e6 @
控制器結構:0 T4 a. D( b" ?2 y0 `8 j0 C
8 {5 K9 g; _! j7 Z% n- O! O
創建了主要的 LoginController 處理所有請求 `) B0 J5 S0 r) Q- @6 l
保留了原有的頁面類結構,但改為符合CI4的命名空間規範, R3 D9 _; b# f# ~- d, J: y, |
錯誤處理改用CI4的視圖系統; h% C3 X$ k" D. [. ~8 Q( q8 C' C9 C& `* z
5 z- m# ^7 ~: @) H! a
5 e2 i! L- w9 h類的組織: l c" h/ [% E- |/ U; T
0 |2 q- g7 R- w$ s
所有登錄相關的類都放在 App\Controllers\Login 命名空間下* N1 X0 N( K9 t- D2 J
保持了原有的類繼承結構: c/ r9 G+ r4 g1 p2 @
改用CI4的控制器基類和特性
( {% D1 U9 T4 y1 T* [
8 @$ `9 A& l3 B" y; \* }( E0 h
0 \8 l- R/ m: I; }改進的安全性:2 A% s# n% ^. q; q+ r8 z
- I6 \) d# C/ i4 ^& }
使用CI4內置的安全特性
4 `- R( x" r5 J3 Z更嚴格的輸入過濾+ v) u5 y! f& F6 @# {8 I$ P
更好的錯誤處理機制
0 M* V2 ?; h) i# ]3 b- w# q! n- q* `( D: x) U4 u2 J1 t* R, x
9 }) ^: R# Y* J# l, f; e! s f, V) u, i& B2 j1 W p2 x
要使用這個新結構,你需要:
- e) \. R* a7 n3 l6 O" F/ c# n
0 H) Z! j% y( X. ]7 \4 a8 f# C將這些檔放在對應的CI4目錄結構中
! K( q9 U! u: N; O! `# Z5 X確保創建相應的視圖文件( H3 D$ h1 a$ b
配置語言服務) C ^9 i- @- {' L
根據需要調整模組檢查邏輯, P" @, u" r1 ^1 E8 j
* ^3 g" F9 |8 u* A需要注意的是,你可能還需要:
, F( U2 Q9 R( S/ r
* ~* T! _* _) [+ j& e2 n3 V創建相應的視圖檔(在 app/Views/ 目錄下)
% V2 h* i6 {) ?, g- m配置適當的中介軟體來處理會話
3 T& ^& S9 \6 t+ i& ^7 T* u實現具體的登錄邏輯
4 k; K( T# o2 O: `9 S/ f4 y! }3 v5 C5 w+ v/ V% f$ c9 @, o
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?7 h9 Q. x2 I# z. i# c- p# T
1 ^7 R- B9 }0 M( O" @- <?php2 d* k; S- H, o# U
- // app/Config/Routes.php
. Y% ~* A* F' G8 l h$ p0 A - namespace Config;' J9 o- N3 l. g
- g: `" N+ B1 G/ R" d) h! J. J8 E+ ]- $routes = Services::routes();8 ^* [/ ?+ D7 l* M& W! O2 L
& f1 v8 k: P4 Y8 b' X4 X1 _- // 添加自訂路由規則% m' g' o" q+ p, n* Z
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
$ y! W6 r. f9 N& W- A$ G - $routes->get('/', 'LoginController::index');/ C D% @! ?8 x; }, {1 k
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');6 ~/ k, I/ P7 P, j
- // 默認路由處理
) x3 |! e1 n1 B1 |: B$ h% u - $routes->get('(:segment)', 'LoginController::handle/$1/show');
: s8 m3 C& o7 L0 V+ \7 N4 ~2 M - });; w8 q2 G' u& [
- 2 l( y$ i8 F9 `! N) Y) ~5 M8 q5 T
- // app/Controllers/Login/LoginController.php; L( x8 c9 V9 g% u, Q8 U
- namespace App\Controllers\Login;$ t0 W+ @/ W* R t8 b% @
' g( w, l, Y3 M; p8 r" {7 z) ^1 m- use CodeIgniter\Controller;
% E% h. p5 i# O4 ~ - use App\Controllers\Login\AbstractLoginPage;# l- v! c6 M/ ~
. Y# g: f! @$ }! v v, D5 d- class LoginController extends Controller" Z& e! G- I3 M8 t- J" l
- {. \3 ^ h( \# b: t) i* \$ m/ A
- protected $pageObj;# L; D$ ], o8 `! \
- protected $LNG; // 語言物件
# l7 J: Y" E4 E4 e7 a/ r - # V8 Z4 o# u! i. f$ _
- public function __construct() 2 o+ u- u, W! e5 a
- {
5 W2 i# `6 M* s( u7 n - // 載入語言檔和其他必要的依賴
: m+ a2 l ?: j# X# w, y# S - $this->LNG = service('Language'); // 假設你有一個語言服務& `4 Y: W! y2 W, S$ }, ]. M1 U$ C
- }
) z1 A* O9 a; K$ W. U. w6 w7 v' K - * m2 v( y; }( h, }
- public function index()3 j6 M7 Y6 _. u# @" a
- {
) Z G# f+ ^; y# B - return $this->handle('index', 'show');# X* L1 f- x; }: l
- }
0 S9 R9 {' I# D2 [8 ?9 U
8 i9 L1 c) G' i8 ^( A/ M- public function handle($page = 'index', $mode = 'show')
( f& }" \ g$ h+ J! D: c - {
" U; G H4 ~ x; L - // 安全過濾頁面名稱
+ ?* S$ ^# d1 ]& c* ~ - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
* h( c: h* c/ r# L: ~$ ]0 b) A - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
; T" k' y$ F7 N1 X" U4 Q8 l; z -
! h1 U( k6 Z- Z1 ~ - // 檢查類檔是否存在+ Z1 j5 ?9 _; p& W3 H" {( Q
- if (!class_exists($pageClass)) {
# z& A8 ~0 B: w4 l! d9 D - return $this->showError($this->LNG['page_doesnt_exist']);, c1 Z3 e& L: p5 I
- }9 F( Y" y" n, A# Q1 d7 H p/ V
$ f3 F" n4 x$ i7 v# I7 {! g- // 產生實體頁面類
) a5 \) B0 \$ A - $this->pageObj = new $pageClass();
- s @ ]% ?' j+ G' N - ; T6 j0 Y2 i N6 s: u
- // 檢查模組要求: C/ b9 U0 |/ ~. J) T+ u. i+ T
- $pageProps = get_class_vars($pageClass);% o3 O% I4 M$ O
- if (isset($pageProps['requireModule']) && " G5 T2 j- x8 Q+ {6 h2 J0 b/ C1 B
- $pageProps['requireModule'] !== 0 &&
, B9 p' p- e/ s* k' T" t8 H - !$this->isModuleAvailable($pageProps['requireModule'])) {
h( v3 Q/ g$ ?0 }3 f - return $this->showError($this->LNG['sys_module_inactive']);
3 p C4 r" Q$ e - }
4 F. j3 @. \8 }4 B. e
' X/ e3 e6 D# w; W. T! X- // 檢查方法是否可調用
7 T2 w8 d' B! e3 R; q' v) x - if (!is_callable([$this->pageObj, $mode])) {& q4 C8 m$ N4 M2 y' w
- if (!isset($pageProps['defaultController']) || 4 g# p5 }6 c$ I9 |, P% L
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {
' G* V& F- I( R+ r - return $this->showError($this->LNG['page_doesnt_exist']);' B9 w5 O! J; ^8 I+ s2 J
- }
/ Y& S: _" L# ^' @8 y - $mode = $pageProps['defaultController'];
7 {$ D* f \0 h6 @ - }/ r8 p1 v9 p& Q) ?6 G( Z
$ n! P' A" D, ?8 d: o- // 調用相應的方法
* Y, k, x Z. l4 k8 s4 X - return $this->pageObj->$mode();
, L" V; o' ~, r; S& h - }
) Y- Q9 n" z: Q4 @6 u - % {* u5 a F3 ^6 W* H! R' G: E( l+ R
- protected function showError($message)
1 b" n, z! g6 u! b- Y; d8 T - {: i) E; b$ v; x/ n' f" i
- return view('errors/custom_error', ['message' => $message]);+ \# t- ]1 f2 D; u* a/ A
- }( S) [+ _& ~, e% u/ Y; T) h5 J7 g
- 4 M! r o( P3 K9 e% E* f; I
- protected function isModuleAvailable($moduleId)
3 f! [/ Z+ c! g - {
2 ?: |: W# y$ p. ^; a1 P, g( b! b, a - // 實現模組可用性檢查邏輯) W6 [8 d( B- e7 Z3 t5 G
- return true; // 根據實際需求修改/ L+ v1 k- w/ k% g7 _7 m3 Z0 x
- }
& {% L; ?! \; p+ e - }+ c. W- K# b) x5 D9 G; M
3 B* p* N/ U! {% ]6 X- // app/Controllers/Login/AbstractLoginPage.php
4 s. _0 e3 G! u0 q - namespace App\Controllers\Login;: `/ g7 h1 K7 Q/ C, R& m8 ~
- - b7 R- l, n" A0 H4 n
- use CodeIgniter\Controller;
+ r1 X0 z3 i0 W: S1 a& D3 t
6 f5 z4 F! {8 O& |$ O$ k- abstract class AbstractLoginPage extends Controller
; E# h& X+ Q& o, E - {
" W0 _( z- j/ L/ {' F( Z k: } - // 實現基礎登錄頁面功能9 L' W6 v, I h% f
- }" U4 r" ~+ s B5 c3 w
- ' J/ _$ m1 F' m1 J
- // app/Controllers/Login/ShowErrorPage.php
7 F2 J0 s) k8 @* {! a. w - namespace App\Controllers\Login;6 u- I, c* y! P2 b; K
- 1 r4 j8 l+ t2 K( h. E+ D+ {
- class ShowErrorPage extends AbstractLoginPage
; G- K2 a& I/ G* w - {% [: I0 }1 W; o# ?- v
- public static function printError($message): n2 T' P8 h+ z% w. H
- {
+ I' |6 R& Y7 D8 [2 _/ n - $controller = new LoginController();- F; Y- b3 S. R V; z5 }) x
- return $controller->showError($message);
5 W6 r- e6 f! W* ^& X - }$ O2 A$ D+ A) C f
- }
" C. z( e8 H; m' H4 s" `
" A9 L! |& [* Y* v- // app/Controllers/Login/ShowIndexPage.php2 |3 z% ^6 N% g& }% @* M! N( q
- namespace App\Controllers\Login;; T. t, f9 [, \" G
- : g. S* T A- N! T" A
- class ShowIndexPage extends AbstractLoginPage
( y- b3 a4 Z: ^( h - {$ n0 H' s7 l" n- @- D$ x
- public function show()- w, I" [! p" v4 R/ W) W1 R# Q
- {& [4 F- c7 X3 i" L
- // 實現登錄頁面顯示邏輯( Y9 z' l; h$ q" J2 P7 e3 B
- return view('login/index');
& [/ Q6 H8 ]' B7 z - }
- o3 M: _' S# |: M/ } - }- B+ e1 {: P$ w. i% ^% G
複製程式碼 |
|