等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14187 / 14187 生命值:5%
升級
  100%
TA的每日心情 | 慵懶 13 小時前 |
---|
簽到天數: 5712 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致% y2 ]- ^$ b: O q
AI 就是站長的最佳幫手。
4 ?' A' Z2 H9 V9 D9 e& L) b( h$ R
2 X' @! ^( b$ s3 [
7 I: I; ~; {* q+ T2 J! `9 ~這裡的「新架構」是指後端的架構會有大變化, Y) F* J$ e# e/ D: c$ c: F
但前端的 UI 介面玩家不會感受出來有何不同8 _/ G+ S9 A7 e5 {; q
9 V2 e/ _' }( w! F7 f. t. k) H- K7 Y" y4 c: V
為什麼站長要改成新的獨家架構?
" u5 V8 y7 W8 q1 s3 q( c就一樣由AI模型來解釋清楚吧。% X- N. w6 C' S$ M. ^" g C- M
' m t3 |" a/ P4 ~. c7 y3 b+ N$ O* `/ z
讓我分析一下使用純 PHP 和使用框架的優缺點:* G$ ?& y) u" f5 R
純 PHP 的優點:
; ^' o/ Q6 z$ \6 a9 F1. 性能較好 - 沒有框架的額外開銷! k: y& Z6 a( v8 A e( B
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
* M2 ^! O5 P2 [8 J. a3. 更靈活 - 可以完全按照自己的需求來設計架構
; ]$ `1 Z% h- g; a- {3 y4. 代碼量小 - 不包含不需要的功能模組
/ S& p6 z$ S9 o g7 {' |! V# O5. 適合小型項目) W# M/ Q2 M) m; w
純 PHP 的缺點:& s" H0 t$ m5 g
1. 需要自己處理很多底層細節0 `) o* a7 {2 p7 ?; \
2. 代碼複用性差
: q+ N/ U8 x0 J% e( q4 _# Y3. 缺乏統一的開發規範! n' `! N2 Q" c h
4. 安全性需要自行考慮和實現
3 f8 ]' X* r. k/ X5. 開發效率相對較低" a0 k* S" k! T/ @
6. 維護成本高
6 r. Z7 G3 z5 S0 j+ M使用框架的優點:
2 v7 H3 w! y! }% ?& I" k1. 開發效率高 - 有現成的元件和工具
/ H" B' K3 |! L7 C* s e2. 有完善的安全機制. I8 z9 |' ~$ a3 N
3. 統一的編碼規範
' @2 t' J/ Y5 C3 l4. 易於維護+ J3 V0 s0 z& a2 D& c
5. 有活躍的社區支持, A+ h9 x2 h$ ^! I
6. 適合團隊協作( L; n7 J( Z1 ]5 _6 |4 d4 Y. j
7. 自帶很多常用功能(ORM、緩存等)
+ Y# h% C- U- B. ?( d% S9 H使用框架的缺點:0 {0 i) T! A3 s2 l8 p$ z: f, A0 F5 I
1. 性能有一定損耗9 j8 S! ^: ^' M: A, a2 ?! x% R5 h
2. 學習成本較高" X" Y. c9 E4 {. F9 y/ s. @: k
3. 可能包含很多用不到的功能
# C% B y* F( I/ @2 Z) F8 }" d! K4. 不夠靈活,需要遵循框架的規範2 m+ k# }( ~* R5 g2 R* d! h
5. 對小項目可能顯得過重! _& }' @! Q2 a1 o, n( T
建議:
9 B: g/ ?' c) c% [; \5 F1. 小型項目或學習階段可以使用純 PHP3 e0 I. m) V& M* U+ k8 f
2. 中大型專案建議使用框架
" P7 p% |% f- z7 f6 d3. 選擇框架要根據專案需求和團隊情況
% l2 f$ S' L3 _4 Y, l8 |- d4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇& T5 o. q+ I! p9 N2 f; {, A9 D
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。6 c. Z: Y5 E! D% d ]6 E) K; F* C: n
1 Q" u& A s7 N# m
# m" H- g) S2 ^, x1 ~" B y+ s* x8 \- z
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。0 C8 {* v6 i/ J; J9 W
& o- [; V2 R' ^' Y這個轉換主要做了以下改動:. b [, s1 C3 S4 J5 s) ~/ q9 Q3 K. n
i$ d1 P* t3 O, `路由結構:0 e" K5 l) s8 z2 [% G1 v* i
# S! U2 f {0 E! T' ~( O使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下2 h. G( q9 }2 C! k& N- W% y
支援原有的 page/mode 參數結構
# g* `9 P5 l) I3 N& A8 a/ r通過路由規則自動匹配到對應的控制器方法% E3 ^# I3 X- m$ y8 S
3 M/ G5 g7 W: q2 Q) G- ] W& T2 L
' O* Q, ^ L) ?+ U# j4 h2 P" {
控制器結構:
7 N+ y# I" P/ v* V( B, R0 ?8 C9 o# Y4 s8 |
創建了主要的 LoginController 處理所有請求5 a, d' z J: Q% f
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
5 r, P. D3 E# N9 B3 ?錯誤處理改用CI4的視圖系統% I8 O- b/ O3 ?! ]
+ y( F0 d6 v7 H' r
- ?# Z7 S* M/ I& f2 F# A5 x類的組織:+ b$ B9 A, U" l& p* e
! Q5 N8 a6 t5 n6 V
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
. H$ ?% ?( |) l$ i9 M6 ~7 G B/ M4 ^保持了原有的類繼承結構
H5 v* X, c1 n' u3 i J& B改用CI4的控制器基類和特性 s, ~0 y1 F- a9 y2 l( F, v5 ~4 ^' R
$ j' p6 M; B* n3 b* h4 l/ {/ h. s" C4 p! ]% M
改進的安全性:
3 f. s% X* h% `0 Y a
" I- F8 _2 `. P( K0 \使用CI4內置的安全特性
$ ^' y, s# H: v* e8 o更嚴格的輸入過濾
0 N! g0 }! @1 d# }- [' A更好的錯誤處理機制
' G8 j( Q1 d3 x1 D2 \+ j3 f
' x. M$ T, k# ~* o! `
2 X5 ^+ n4 R6 ~. v& f: e
4 X# t) E% Y8 I- w) {0 h8 u- |/ W; i要使用這個新結構,你需要:
" t5 k4 A, V, L1 M; y& P& d: v/ _! s3 P/ x
將這些檔放在對應的CI4目錄結構中
( @1 {6 W, n. o; D6 i4 @# `確保創建相應的視圖文件
G+ c; {- m3 a8 |# ~配置語言服務" ]1 Z& _/ f8 k
根據需要調整模組檢查邏輯
9 w. P+ f3 Z& J
0 a) s+ d/ V2 ~; _; V需要注意的是,你可能還需要:
8 f# _, ^) y- J! L4 [* L: P- Q6 n @( o) o( I
創建相應的視圖檔(在 app/Views/ 目錄下)
) g! _8 l p5 _# Z配置適當的中介軟體來處理會話% \ r8 F' V/ ~- T+ @& Z& f
實現具體的登錄邏輯0 N4 R) n; ~7 {# T y# [. h- ~
0 f$ b& _0 D$ s9 H需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?9 m& a1 F) @ f9 V" p( r( u
. v i$ Y& w7 b! ^, u8 {- <?php5 c0 O3 n" `0 n, ^* P3 o, n
- // app/Config/Routes.php) m$ u& d/ z$ K1 ]/ Y* p% T+ Q
- namespace Config;: _1 U: @% V. O
- 5 C' A0 Y k* `( |! w! h# N5 u
- $routes = Services::routes();
6 H g. K _/ ?& ^0 g: |7 S& C - / J5 D/ ~9 ^. I! Y4 H
- // 添加自訂路由規則
$ W( x; n* z4 D2 I - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
/ }6 W4 o l/ J( u4 ] - $routes->get('/', 'LoginController::index');
7 J) ?' n2 r: V! Z - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
( O i5 C' o5 M, a) L" K; m; m5 n9 m - // 默認路由處理
8 r' r6 _8 ]3 J+ c - $routes->get('(:segment)', 'LoginController::handle/$1/show');1 o/ R* X2 T( o$ k% }4 |! V
- });
. p$ m9 ?' W- n& v. Q - * O, ?! ^% f, P+ d7 {
- // app/Controllers/Login/LoginController.php
4 U* M; x& s3 D9 i% w - namespace App\Controllers\Login;
1 w5 v7 {# a) e2 Q; }, r% k! Z) E - 4 p5 C9 ]5 D8 ~0 |6 W3 G
- use CodeIgniter\Controller;* N# Y4 ~+ @9 w+ l# [7 @: m
- use App\Controllers\Login\AbstractLoginPage;
) U4 E& C! _# i" @& I9 v* ?6 e) ~& z - 7 ?& V3 K. k; p4 \
- class LoginController extends Controller8 O( L2 \4 X5 V8 w
- {
4 {8 y Y+ P+ N+ q, R6 E& ~ - protected $pageObj;
' k2 K+ n! f( J7 k - protected $LNG; // 語言物件
. n/ j' F$ x0 \& Z+ T' r
7 l* @ c7 v+ ^2 B- public function __construct()
) F' m, j2 a$ l6 X) q$ `+ d% _* N - {
6 G" P, {. {" z+ q% v7 c - // 載入語言檔和其他必要的依賴
3 o/ H3 i- p& g5 g/ r$ a! O - $this->LNG = service('Language'); // 假設你有一個語言服務
/ M3 y |" O: o! B, \0 z/ B - }
, J& Q, W! w: ?& ? - 1 t+ r! i* x& P+ i9 M6 ]# n
- public function index()
! M+ B; l$ c& @# c - {% Q4 x! x. ?4 y- V# `2 K' P
- return $this->handle('index', 'show');) U( C( o6 M8 B/ [# V2 W
- }+ b' c$ c! ]) r' r \! R' l, i+ @2 e
- 0 q( O- d' K9 L! D8 a1 _/ l9 O
- public function handle($page = 'index', $mode = 'show')* c! V! W4 @# |( j6 C& @: S5 w
- {
! j6 E' Y h8 k - // 安全過濾頁面名稱8 f- c$ w1 G6 Z' {. H4 W6 w
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);% U! h- v6 q2 n1 H e4 b- x
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';, y$ f, N3 @& ], N4 p) K
-
) B- w2 A4 J. ~& ~1 }, F( K4 O& ]2 ^ - // 檢查類檔是否存在! F/ I7 F+ a, F. [( l5 {: S
- if (!class_exists($pageClass)) {) z! V& D9 _ ] \" G7 W
- return $this->showError($this->LNG['page_doesnt_exist']);
! U) `1 c8 A, D9 z8 f - }* U' Z* F0 Q+ X( ]
- 5 c7 i: E# s# B. M$ \1 \8 w1 E3 x
- // 產生實體頁面類
6 O9 {" e6 r% U, |0 `, K; y - $this->pageObj = new $pageClass();6 e1 W; I8 K. x$ [2 L3 h2 h( I5 ^6 h
-
( s# Z8 d/ Z2 P a+ I$ A5 v! n; R+ D - // 檢查模組要求
% ?$ B5 Q! r" o& d8 _" t2 w6 } - $pageProps = get_class_vars($pageClass);
* L7 K7 m) S7 C, S# p J& e - if (isset($pageProps['requireModule']) &&
$ v, I: h, l0 E" ]3 f1 h- v- i - $pageProps['requireModule'] !== 0 &&
+ F& n/ @. N6 C7 X& z - !$this->isModuleAvailable($pageProps['requireModule'])) {3 G6 e4 m6 m. ~9 E
- return $this->showError($this->LNG['sys_module_inactive']);
) p4 y+ t9 P+ ^2 G - }) D Z( [3 F) z, Q3 v! [$ h, w! W
6 Y+ J' q# C& w$ O- // 檢查方法是否可調用& q8 w3 Y( X* G) l
- if (!is_callable([$this->pageObj, $mode])) {
7 W6 T |, I% A q0 T+ N% \ - if (!isset($pageProps['defaultController']) ||
3 ]9 U: N1 v8 s. j. \ - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
1 U, b4 B' I% d# q. D& N' d8 m - return $this->showError($this->LNG['page_doesnt_exist']);3 ^4 c. V9 d3 }8 T# F( {
- }
1 }' p0 ~6 y+ T9 A! _; C - $mode = $pageProps['defaultController'];+ ?* {9 v: o1 C: f/ c n
- }, N- x8 {+ ? U5 _
- ' c# u$ ^ Y# F* h; i: ?$ P0 u+ P y
- // 調用相應的方法3 |$ n4 [" E, k/ }8 T2 u! c
- return $this->pageObj->$mode();
* _4 e' I4 @$ d5 _0 [9 G2 v1 j - }
' ]/ W6 P$ \% m4 k: T
3 S/ f6 |! `9 [, v2 r- protected function showError($message)1 e [& J. s) B. G* P
- {/ T4 e' H% P9 P, D4 i
- return view('errors/custom_error', ['message' => $message]);
$ [( ]0 C- L/ ^ - }8 v4 \9 I6 ]4 [$ F
- ' s3 B1 F' v" w7 O4 R1 b
- protected function isModuleAvailable($moduleId)
7 G$ H6 f# h+ D$ o: v - {' b( v8 {; Q0 e+ U1 A- Q
- // 實現模組可用性檢查邏輯
$ V7 _3 h q* @' |$ F& c/ ` - return true; // 根據實際需求修改
! N5 _3 F' E, _. r0 D X" { - }" \( L+ K$ ?# z3 ?. t+ I$ ^
- }
9 J [. c3 j3 b {6 S! I1 e0 [ - 3 C5 L/ e1 R9 f: @6 B" Z
- // app/Controllers/Login/AbstractLoginPage.php0 `7 ~5 x) ?- R9 b' M4 t0 G& Q
- namespace App\Controllers\Login;
9 Y; N! w9 ?) p4 e0 U - " n& s9 n: X. e# b9 j! q' I, d- k
- use CodeIgniter\Controller;5 t1 l- f; J* U9 I3 \
8 O2 A$ N- r( u3 P2 V- abstract class AbstractLoginPage extends Controller4 V* x& r+ z$ E! A: s
- {. o* y3 o" S; _) c
- // 實現基礎登錄頁面功能
- x! q2 c( I" B0 M9 Y& {8 F - }
& [ ]/ @, n! Q# j2 {
* u' Q5 x# p& [9 u4 }- // app/Controllers/Login/ShowErrorPage.php/ u* y0 @4 U3 i) S0 v9 [! j' J5 q$ Q
- namespace App\Controllers\Login;
6 P( B: `" q7 H, s6 N+ V - * G# u0 l3 ]' {( K. S- ?' r# ^' k
- class ShowErrorPage extends AbstractLoginPage' y# A8 R2 N2 Z1 {- t1 c. c, Y
- { J4 q6 Z9 m& @ _* O/ H
- public static function printError($message)) L \( [% K4 P9 a: w( z' N
- {8 k! G: L0 E' S$ m$ w
- $controller = new LoginController();
9 J1 b6 m$ @$ m9 t; y - return $controller->showError($message);8 ]3 I- {1 h& p9 U
- }+ b2 U$ d2 t, `+ \: h
- }
8 e2 V& O0 n0 I, H) O
# N- T% V+ V% x; E- // app/Controllers/Login/ShowIndexPage.php
3 K4 @+ x1 r% F8 [, l) ]4 Q - namespace App\Controllers\Login;$ _9 x+ S( N& S. b. r0 ~
- # w+ c; G4 K0 {% ^
- class ShowIndexPage extends AbstractLoginPage- F7 \7 n" L$ N) K* D) b
- {
6 o7 W4 s3 U: G3 i. t" ? - public function show()
2 ]* Z+ M# g P6 V0 l - {9 v% _1 n4 C8 s9 V
- // 實現登錄頁面顯示邏輯- G! Q# K3 w" X( z: Z- j
- return view('login/index');
( P- x7 H5 f. Z5 T! | - }- I1 z" l: U) y! q) A8 g
- } Z) k" Z5 G; P3 \# Z. i* E
複製程式碼 |
|