等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14307 / 14307 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 11 小時前 |
|---|
簽到天數: 5757 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
1 L! V% I$ K: @) b4 j# ]) A# X5 hAI 就是站長的最佳幫手。! z1 ?5 m" z2 Y) s- J6 T! e. F
9 Q; k. H- Z& {, z: r0 B9 X
& Y! q$ j5 y6 ^1 O
這裡的「新架構」是指後端的架構會有大變化( u9 N {. m m5 F8 s0 u
但前端的 UI 介面玩家不會感受出來有何不同
9 }8 _, }! X# x
3 Z5 [# V! G2 t8 Z. b+ m1 V$ O# s! _; } ~! r; P
為什麼站長要改成新的獨家架構?: j$ ~/ U) ~& y5 V5 W& p4 r8 K
就一樣由AI模型來解釋清楚吧。
7 \7 [$ P. T, E7 v5 U! a
! d4 t; M2 q! I# `5 q9 N# l; B3 Z: {$ }1 F% ?: j; g
讓我分析一下使用純 PHP 和使用框架的優缺點:
! Y: H8 \3 e- ^純 PHP 的優點:. g) D1 c, N: j/ i* v
1. 性能較好 - 沒有框架的額外開銷, ]8 t/ j( d5 J. Z1 |1 ?* a
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
9 n% a% i* r. f# k8 l' |: B+ }! i3 B3. 更靈活 - 可以完全按照自己的需求來設計架構
" V/ B& u4 [/ n9 L1 r4. 代碼量小 - 不包含不需要的功能模組
2 ~9 q: y. C" L2 U# {$ E2 N3 e5. 適合小型項目
: S0 x2 ~3 N; D9 z# I5 K純 PHP 的缺點:
: r. V0 @% Y }+ n# ]5 m* r6 y* `1. 需要自己處理很多底層細節
. ]! X( c7 h; i2. 代碼複用性差" s" v+ [& @0 w9 T; ~2 ]/ K4 c# F0 [
3. 缺乏統一的開發規範
; g- R$ w) q0 V+ j% y1 Z4. 安全性需要自行考慮和實現
5 d2 ]' i8 v' `1 @7 s5 [5. 開發效率相對較低5 ]0 N u( k* A" J" F
6. 維護成本高- @ [ N) _ A' w [+ L
使用框架的優點:
' \. |! s$ _: s) Z3 D! A1. 開發效率高 - 有現成的元件和工具
2 K3 F2 g% I- K5 n2. 有完善的安全機制( f8 q! J4 A8 w, I
3. 統一的編碼規範7 Y( z% o- L/ z( Z9 r
4. 易於維護7 L, {5 b E: f s1 j' E' e- G3 Z
5. 有活躍的社區支持
' r8 \- i+ {4 o1 Z9 U6. 適合團隊協作
' ^. Y9 h2 F& P2 f& _7. 自帶很多常用功能(ORM、緩存等)' _# M" f! N9 }7 T" n) ~6 W G# F
使用框架的缺點:
: ~% p n3 t& g9 {1. 性能有一定損耗$ {+ I8 a# c7 ?, E$ W' z. H
2. 學習成本較高
) N, J4 g; z& r' p; S) o3. 可能包含很多用不到的功能/ C: D, E" P4 t D4 s, ~
4. 不夠靈活,需要遵循框架的規範
% h3 i9 \& x' X7 t) j6 \( h& T P5. 對小項目可能顯得過重* }. s0 `$ w0 R2 ^% \! z
建議:2 l/ h, s* b: d/ r8 Z
1. 小型項目或學習階段可以使用純 PHP
, K) p' w' i% x0 V' ~+ {5 H2. 中大型專案建議使用框架' z9 A6 {/ H$ c% S
3. 選擇框架要根據專案需求和團隊情況( u+ f5 _6 p: n- i! m
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
. o7 O5 c& f) O# ?. \0 ?您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
# c* X1 ~# w+ x; E4 c
# b$ E& s* }) j. o1 B; H
5 l7 ^5 F* _+ ` B6 T2 N+ V2 P; b8 g* }0 V
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
. {7 d5 B6 p( i8 y9 [4 I0 Y6 I# {: z& @6 J% ~& [7 m" _5 a
這個轉換主要做了以下改動:! s) B/ A2 _& g* y4 K
7 o/ M: R0 u# j" F/ j6 N9 I. F7 z
路由結構:1 w' X1 h" D. r8 T, Y$ z5 `4 d* L% G
6 s" F. P a+ s, [( N; E5 s使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
( O0 o# Y L. b" U支援原有的 page/mode 參數結構% H" Z" m0 L: M4 W0 t
通過路由規則自動匹配到對應的控制器方法
) ]$ O) [1 ~/ i- c
0 u, E, y8 d" S0 e1 x1 y
8 Y8 }* T6 i l- j控制器結構:$ r3 f' e0 Z% s
3 H2 q4 d0 U! r7 L4 y9 R
創建了主要的 LoginController 處理所有請求6 T, v J+ P6 u9 A. J2 g1 a
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
6 i5 X" s+ d1 _9 U L( A) v: Q8 T$ c/ g錯誤處理改用CI4的視圖系統
9 H% P& P7 o; D
0 F# C# |# [8 {9 r8 a6 }, W3 C! G8 t# n& D& V
類的組織:# E* {/ f P! l
0 I; C- B) G* [) w7 A
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
/ i4 Y( d! m4 n, H保持了原有的類繼承結構$ V% z9 e' r1 c" S; c7 f' C
改用CI4的控制器基類和特性
2 {' d9 J" S5 G9 R
( O9 W% M- I- B+ K& {# a' e$ Q4 W4 Q% ~; A! M
改進的安全性:
1 b* L: {4 @6 f+ `, p& G U
; X& q# \9 n9 n' |' y$ r9 L& w8 ?0 Z使用CI4內置的安全特性
7 g9 B4 b, L# Y6 p( N更嚴格的輸入過濾$ X) F5 L6 Q8 f
更好的錯誤處理機制
0 D2 t* D. y2 P E' G
: @8 u# F( [; [% M+ q5 I
1 w% ^/ R8 C9 n- e) Z+ d" b! n* y6 R( M `3 J' ]0 P0 e
要使用這個新結構,你需要:4 ?7 o2 K- U9 E( P% ~- G \
% V' K$ J) O. Y. b- b! K3 o
將這些檔放在對應的CI4目錄結構中
% R7 _. s$ \- o4 r9 }8 L確保創建相應的視圖文件
X7 w" ] |4 E6 e4 i! S8 Z9 l配置語言服務5 K* u9 K9 G5 E8 O7 V V% D
根據需要調整模組檢查邏輯
2 p6 q9 n5 j3 c# _. Z) J3 D' T$ [$ A! q% {6 @/ j- {/ f
需要注意的是,你可能還需要:
; _) @" c+ @% ]% j
/ ^7 p; c0 a' I8 R7 d8 l0 `創建相應的視圖檔(在 app/Views/ 目錄下)
" h9 j; B, ?" O+ w a& l7 y配置適當的中介軟體來處理會話
2 }, R2 W6 b8 G' \實現具體的登錄邏輯1 ^2 x1 S: o6 V
# w9 y: B3 U% ]需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
* B9 V9 M# Y5 p \7 w- R7 c. f1 h9 a
% ^7 _2 V- f6 ?& \- <?php/ K- @1 W& q4 l3 H$ s0 i" j" M
- // app/Config/Routes.php: L7 l0 ~& ~# g
- namespace Config;( A, y$ ?, M6 h
+ u' S" H' f- N) ~# s0 `) k+ x7 _' M- $routes = Services::routes();7 S3 {; i3 @6 W$ M! F: R$ m
- # W2 O' {+ T X: ]& B
- // 添加自訂路由規則
5 L4 U' t9 N7 }0 f( @- s, l - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' C/ r4 @8 J# |2 z7 ~
- $routes->get('/', 'LoginController::index');4 g4 i, q% {' ^
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
- w( A/ l( |8 ~- v/ @0 `( i& v8 R ` - // 默認路由處理" N5 J- Z- z* x
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
# k/ s+ O D; t - });
, p" }2 ?# z4 N! J H, h( e# A( u - 4 F- d! L3 C% ~; t. x6 }
- // app/Controllers/Login/LoginController.php
' X) u9 b" r2 T0 h3 o0 ] - namespace App\Controllers\Login;
& h- R1 t2 K D) V7 l- [/ u: {
" f2 d+ q# B" B2 g" Z2 O4 `- use CodeIgniter\Controller;) w! k0 E. ?9 `1 S
- use App\Controllers\Login\AbstractLoginPage;
, m+ O$ Z) r" d5 f4 @' O) ?
- V: w* @5 k. o. q5 {; m2 l0 i' I5 {- class LoginController extends Controller
6 l% x$ I: E Q' O' Z% e - {
* \2 P1 n8 b4 i6 h - protected $pageObj;
6 Y+ A2 n* B7 L/ q% p/ q - protected $LNG; // 語言物件: {4 |$ g7 d- b
) r5 t% W/ ?' o7 _3 j# Q- public function __construct()
' e9 a: j2 S: ]% Y2 j - {
4 J" e) U% Q1 Y2 Q/ h; w5 V9 G3 n - // 載入語言檔和其他必要的依賴2 R. l8 J/ x, _- [) I7 p0 W
- $this->LNG = service('Language'); // 假設你有一個語言服務1 T( y4 H! \; V% h" R) t
- }
, h4 [) U" M6 q: x9 H) H
7 s n. C7 P( @2 t- public function index()
4 m. _% l9 [8 V; K' ^ - {9 s. k4 V" q8 U) Z1 L# S) @0 [9 s; v" a
- return $this->handle('index', 'show');
6 z. m8 k N3 v$ G - }
# Z) |1 m) A1 { - 0 D S$ ], F- N) ]1 D& b
- public function handle($page = 'index', $mode = 'show')
# W% F" e! I5 c - {
. v H2 I% f5 e/ s# c, c$ Y+ y - // 安全過濾頁面名稱; ]6 e% { k( c" k9 ~7 u
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
+ R1 y. m; ~7 N3 B7 T$ O - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';/ m- m$ x6 Z0 z0 \8 J: k
- ) j' K( L1 O5 k' D' a) X
- // 檢查類檔是否存在) Z& I7 d: a8 i) R
- if (!class_exists($pageClass)) {! P0 i7 x! ^. u* o' H0 m( b
- return $this->showError($this->LNG['page_doesnt_exist']);- d5 E1 B- X! f* S
- }8 o* v& H8 ~- ]9 [9 X/ V7 f
/ U: K9 x* `1 j' J- // 產生實體頁面類
~2 W/ Q. R: G, p - $this->pageObj = new $pageClass();
4 E( o% M) o* p$ H4 g+ U: { -
3 W/ A; }: v1 P* q2 y - // 檢查模組要求
% @% Z% W( `, |6 P0 V9 S& U - $pageProps = get_class_vars($pageClass);
: R/ e1 Z7 l8 O7 H3 y# n - if (isset($pageProps['requireModule']) && 2 {" Y6 V+ x! w; u" L9 _6 Q7 j
- $pageProps['requireModule'] !== 0 && 9 k8 K, D4 r; v' k: k
- !$this->isModuleAvailable($pageProps['requireModule'])) {
4 [5 w5 V0 t+ o, U! \, R- V - return $this->showError($this->LNG['sys_module_inactive']);7 P% |& a$ ^5 w. }/ ^
- }
' H) p0 p; F; q6 h% X
" f! q5 P: X0 K; ]6 p- // 檢查方法是否可調用2 ~* r* u0 o q8 l0 p% c
- if (!is_callable([$this->pageObj, $mode])) {
~/ g w& c* d% d4 |; U - if (!isset($pageProps['defaultController']) || ) g2 w4 L @% w$ @. H. i; B# @
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 Z7 i' `7 o# c# @- g
- return $this->showError($this->LNG['page_doesnt_exist']);4 {/ v0 Q: U) k% w) d; r: m8 ]
- }
8 e! H8 l: v! q* k$ a2 {/ Y - $mode = $pageProps['defaultController'];
$ y) ?; I7 D- ~2 Q6 c( x$ x - }/ ]' R/ ^. v4 `. |1 `5 ^2 L% \) l
- ) e0 h- {4 [' K* n7 W: [1 D. \' @7 v
- // 調用相應的方法
' h( |" a- p2 e1 x4 l7 d1 Z - return $this->pageObj->$mode();4 N' M4 h4 a( N) S' w+ O9 P- m
- }
: _6 M- h, }- c. _2 ^7 }/ f6 } - , E' i) ?$ i2 D1 n1 C5 m7 A. G
- protected function showError($message)& m# ?% {! s$ C
- {
' f; X. q; j% |- A4 V4 Q; Z! Z4 X - return view('errors/custom_error', ['message' => $message]);; z9 E6 b6 T5 F$ C5 |$ ~' w
- }& ^9 p* i' g. I$ t; Y) |- c
7 j( { h" }/ R8 `- protected function isModuleAvailable($moduleId)
$ o/ h% h, S. d6 s: p7 I - {, p |6 x$ `- B. k8 U6 g4 i
- // 實現模組可用性檢查邏輯" l6 a$ w8 Y2 p2 A+ B6 \
- return true; // 根據實際需求修改
4 @& y: q) c( M' e - }* [' D& Q6 l. E! V
- }; A I" C5 Y9 X0 w, T
7 g% k s! A9 l- // app/Controllers/Login/AbstractLoginPage.php; ^. Q `9 f1 r1 w6 d% `
- namespace App\Controllers\Login;
+ a& n3 i) I5 e* z% o' D" R - % A% `; {! \9 H& B$ _' _1 Q* P1 t) q
- use CodeIgniter\Controller;: b& a' U k1 D/ F1 W$ |. I: U
- 6 p2 K8 k" Z0 f9 m3 [
- abstract class AbstractLoginPage extends Controller
" B& [5 H$ g% ]+ F - {
+ |# k% L. M1 v( N3 `5 r - // 實現基礎登錄頁面功能3 g0 j7 J! S7 b0 p% v
- }. S& Z: I4 ]3 b- {/ A4 |
- : V' W: g. s) i* p) M8 ?8 v3 h0 R) e
- // app/Controllers/Login/ShowErrorPage.php
9 y- H# O- G! y! q3 E" ]* _ - namespace App\Controllers\Login;
" [5 G4 K- U: y Z4 R6 D - $ ~) Q, K- x! ^7 u
- class ShowErrorPage extends AbstractLoginPage
4 B% d9 ~5 F; i, N# \# [ - {
9 ^* Y. |: x1 [# ~( T* v - public static function printError($message)
8 I: v$ G; D/ l' C6 C/ i4 b# _2 b - { M/ H. d: _1 [" n& a
- $controller = new LoginController();$ b& f" `0 s3 q
- return $controller->showError($message);
- M- K/ K8 e' J6 l8 Z - }) g" p, g. G7 F2 j: d
- }
. c! F9 e$ i+ z0 z0 K; @, U
Y$ H7 f3 K$ ?& {- // app/Controllers/Login/ShowIndexPage.php3 W+ S z [+ ?* {4 ~- y" X
- namespace App\Controllers\Login;6 b9 d( d' b$ K& k0 q
- 4 U0 }/ k% ]; T
- class ShowIndexPage extends AbstractLoginPage
# m9 H- f) p# u - {7 F9 [/ Y% L+ O: F% H$ X: D
- public function show()
7 A, ~% _: }& F - {8 G. n$ G" c$ s) G
- // 實現登錄頁面顯示邏輯' d# R5 |& F% v$ k
- return view('login/index');
2 F4 F$ r' \! h9 J2 p/ G } - }; q$ P$ P) f0 u3 _7 Z/ b; T3 g
- }
" g& Y& h: q) ~, h8 {
複製程式碼 |
|