等級:25 - 爐火純青 經驗值:0 / 246 魔法值:15239 / 15239 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 14 小時前 |
|---|
簽到天數: 6055 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
q$ }. U/ D+ O) F4 F, b9 Q% N# xAI 就是站長的最佳幫手。
$ a# c+ s9 ?- K" o/ d$ {1 z2 Z1 b* N; D" B
: K# @2 q" M+ _* f R7 l9 R3 K
這裡的「新架構」是指後端的架構會有大變化' Y% _1 C* i0 I9 p' m0 P8 k J
但前端的 UI 介面玩家不會感受出來有何不同
/ r# M( ~4 c/ S- O- N* d; V6 M8 X0 |8 z: q l7 `
2 `1 R! |" v3 U+ |2 }/ N
為什麼站長要改成新的獨家架構?
. a4 \' r% I( e/ |! N+ z* s就一樣由AI模型來解釋清楚吧。
1 n" w: K6 V! s6 c" i
^3 P! u+ g6 ?7 z/ i, O& @) u4 r7 ^
讓我分析一下使用純 PHP 和使用框架的優缺點:6 [8 Z7 O2 q2 B/ |# G; w
純 PHP 的優點:3 Y0 p+ u! u; f/ X
1. 性能較好 - 沒有框架的額外開銷
# s6 c; V$ Y5 a# W6 n2. 學習曲線低 - 只需要掌握 PHP 基礎知識
' t9 p z$ f% p y' {1 S3. 更靈活 - 可以完全按照自己的需求來設計架構2 Q7 j; [, `( [( O, |$ A; _! ]
4. 代碼量小 - 不包含不需要的功能模組
2 R+ H7 o" w2 ]6 R. K5. 適合小型項目% A7 z$ r& T1 _% T0 W) N6 T
純 PHP 的缺點:
; q( q1 V( j2 c' {8 t9 T1. 需要自己處理很多底層細節, k$ p+ `: b9 g% C' X! o0 a1 t8 B t' K
2. 代碼複用性差
i4 S# |9 O+ O5 q$ e6 @3. 缺乏統一的開發規範
2 D5 f" J+ m- V; G, w8 K: p4. 安全性需要自行考慮和實現
6 m. f6 Q# l+ Q5. 開發效率相對較低- o6 C. s$ M+ f5 c, Y. j
6. 維護成本高6 T0 n" i& ]. W/ e
使用框架的優點:
m9 A- e7 h) v4 O) k/ \+ a1 W1. 開發效率高 - 有現成的元件和工具
" h0 u0 R! ^2 a7 r2 T2. 有完善的安全機制- q$ ~) H( V7 S$ n0 l( }, x5 e
3. 統一的編碼規範# }' r; J$ w- q. N
4. 易於維護5 `+ _: C% w7 A6 n8 K A" s: b
5. 有活躍的社區支持9 L3 _) s% }( b3 |, D) @7 I9 I
6. 適合團隊協作, o1 t6 p4 [) `) g% [: H3 d- @$ }/ ^
7. 自帶很多常用功能(ORM、緩存等)
, X# x" l/ T" D: K* f使用框架的缺點:
; E5 D, z2 Y8 v& `/ R1. 性能有一定損耗! ]( u; }( p6 J' C
2. 學習成本較高" q/ f. O+ Z' z! f/ x9 d
3. 可能包含很多用不到的功能
' N6 ~2 C+ f% M4. 不夠靈活,需要遵循框架的規範; a- E B7 `+ y8 |0 `
5. 對小項目可能顯得過重
$ o8 @# f9 n1 A5 d0 p7 {( ^+ b3 Y' ]建議:8 C; X: s0 U% @/ s' \
1. 小型項目或學習階段可以使用純 PHP( P% c/ P- F; z
2. 中大型專案建議使用框架
1 Y' n y& Z8 i# a3. 選擇框架要根據專案需求和團隊情況
6 L% @& F5 J, C2 ^2 t5 h9 ~4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
7 p8 e* B, E( g, ]& ]您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
1 m0 [2 U9 R5 v0 ~9 d' W" i6 i7 p, a0 ]
2 Y7 O4 k9 Q0 @2 e2 W; v
; W: e7 a T6 ?" D我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。$ ^0 @, t3 G: T- H9 ]
& C7 X& d; B/ F0 m. j
這個轉換主要做了以下改動:; |% R& t- }& ?: g
2 }2 P; A( R1 T2 H& H. H; x
路由結構:; ]8 l+ k- ?- T, m" W/ ~$ `
0 n& c. K3 t& E- [ L6 _( V
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
" N6 K% h4 n* w$ o& x支援原有的 page/mode 參數結構
& u: R: P0 r- l1 g* Q4 u6 D通過路由規則自動匹配到對應的控制器方法
+ W. s, c, G/ b3 w' V) g( x
4 [% a& K) A8 J' w$ E7 G9 t9 o! l% t S0 V" Z
控制器結構:0 J8 a b1 g# J2 Z% f* L
4 J- W% I6 C% ~9 K* Y, k創建了主要的 LoginController 處理所有請求: f1 p1 {0 a% z3 b
保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ q, t6 Z5 L/ b d$ a8 {
錯誤處理改用CI4的視圖系統
' g2 Y, \) G5 V0 @% F t; K- A2 o- }- b, g+ S r% q1 d' V5 F, w
$ p) X0 ^) `" d- b p9 V類的組織:
. ]! g+ ^$ O2 W% z g) K
8 q, _# c* k0 `- Q a9 b所有登錄相關的類都放在 App\Controllers\Login 命名空間下! L4 g8 h* U% ]1 D2 i
保持了原有的類繼承結構
d2 {" Q& n9 R. m, i2 ~改用CI4的控制器基類和特性. h/ @: E8 k0 m
; u$ o& S A' w
7 |3 |; V$ x/ y- ]+ ~ t
改進的安全性:
6 b* S! \. e/ {( P3 |2 q9 \8 B9 N1 G. U* H: N) q
使用CI4內置的安全特性 [1 J, ^- n; O; G5 D1 K7 J% p
更嚴格的輸入過濾
8 |9 U* J9 b% o- \1 }9 W3 N更好的錯誤處理機制
# l1 F- I( @3 |8 a
; }4 c. f8 V/ m$ [; V$ _7 G/ E: p
! n; D: _0 I& s$ f. N- U" q$ e0 @! m$ O: ^% |: u7 b p+ p1 S
要使用這個新結構,你需要:
@+ _- N4 f" {8 e- v' v) X1 O' |+ P1 E
將這些檔放在對應的CI4目錄結構中+ Z8 q" q( J4 `& i1 v6 h
確保創建相應的視圖文件' @+ a, C+ h+ L* C/ L& y0 b; _( c
配置語言服務4 z, J4 h: G+ P: F K$ z. h) X2 `
根據需要調整模組檢查邏輯9 V- ?0 J; V: p, }' T# u$ v& E9 I
! T7 x5 S5 t/ D% x2 f: i# [5 ^
需要注意的是,你可能還需要:
, ?7 q' j( `3 I. H$ Z' N! E; O% ~* O9 F9 L3 Q" g5 m
創建相應的視圖檔(在 app/Views/ 目錄下)$ k' o4 ^: c( R) `- h3 v# r! V
配置適當的中介軟體來處理會話
: K) T, S3 p9 j1 W$ H6 Y3 P/ m$ B實現具體的登錄邏輯
7 o0 k% C% w5 k9 w0 \
; h, l4 ?9 F. h; ]1 V- o/ P需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
|" ]# a+ Q% E6 Q/ z7 H( N, m# o1 z7 G$ b8 A/ Y7 X; T! P7 E
- <?php1 R3 _, F7 r) b. r( f
- // app/Config/Routes.php
% f$ D& J, i, ^5 e' m - namespace Config;1 U4 \2 B, |1 O! _
3 s; `- A' M- o& n9 f c9 D- n( @9 n- $routes = Services::routes();
. C: K" G4 M& _' t - 6 R8 \7 B! U( U8 k1 u% \
- // 添加自訂路由規則
$ p2 ?; p8 M" C6 i - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
B2 E; s- a c3 W9 y9 A! d - $routes->get('/', 'LoginController::index');
2 B+ s, A H+ L. n1 T7 o - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');) {/ k! G E8 ^+ \7 d6 A1 l
- // 默認路由處理
+ _1 Z" D; S& |! ]) h - $routes->get('(:segment)', 'LoginController::handle/$1/show');6 ~& S, n; |" P9 D( L
- });
3 d7 p* y- n$ e2 }+ H" s - ; J% W! r3 B$ `7 {' N5 [
- // app/Controllers/Login/LoginController.php# f, W7 i: \% ~% h# Z
- namespace App\Controllers\Login;3 a. ^" z4 g9 r1 p7 _# p
- 0 L+ E; _' T6 s+ l0 e1 K. j
- use CodeIgniter\Controller;
% L& N ?' g- ~0 @( n( |# x - use App\Controllers\Login\AbstractLoginPage;
" |/ q( B2 @% g1 x9 P% j2 L - . @+ G2 e1 H$ s) V$ d( c
- class LoginController extends Controller* q0 y$ j5 I! y# ?5 k/ N1 O
- {2 z6 S9 R- ]0 p
- protected $pageObj;) E7 g0 {. H. p9 g0 N, F/ e" s' h$ y
- protected $LNG; // 語言物件0 `3 ~7 L! |' n) r: h
' A# e4 O* S# O: l: W- public function __construct()
0 W# m3 Y% ?7 P, L - {
/ P" X1 J9 ~( @. C. { - // 載入語言檔和其他必要的依賴, g: B( Y8 r; @: ]) w/ W: x, K
- $this->LNG = service('Language'); // 假設你有一個語言服務# w. f/ S2 x( i9 Q8 ]
- }5 b; F, Y* |8 {3 M8 M/ Q) j
- ! p$ {7 I$ t5 z; B9 s2 |
- public function index()
& g$ Q: M- D1 ` j: P6 d - {
+ t1 X7 n7 H3 _( d! { - return $this->handle('index', 'show');8 I9 `8 l# U0 _* R% l% U
- }
0 c: J& b, y6 ~2 |" N7 F& q0 d/ P
! Q' _ p9 F. }$ c8 a- public function handle($page = 'index', $mode = 'show')8 E ~. b6 A. ]; `- b* `5 b
- {; {" {. l" p% U) s
- // 安全過濾頁面名稱
5 w+ G8 @. R0 @' Y - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);/ u6 o* s5 e0 I% @3 ~. ?! }
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';1 Y0 w3 j2 @" ?# [
- 6 V. [& b5 h1 I3 d7 H
- // 檢查類檔是否存在
8 T# l! C( R, R4 W. Y - if (!class_exists($pageClass)) {
. ^" {0 Q* ^. y' I' F7 n - return $this->showError($this->LNG['page_doesnt_exist']);3 {+ H2 J( H, ]5 S7 n, t; _5 Y
- }9 f& B1 f, z! k; N' @/ l: N8 O5 S
- ' z- S- n* j5 h' U+ { E
- // 產生實體頁面類
/ R" j! R2 Y0 s - $this->pageObj = new $pageClass();: R& {9 d1 B# k# O4 W4 n
- ' ]2 d1 e3 O2 J6 u
- // 檢查模組要求9 d* T3 s# r- z! Y
- $pageProps = get_class_vars($pageClass);: ?- J& | [2 f+ i* ~* R0 k: H
- if (isset($pageProps['requireModule']) && 2 ~$ `6 L+ L: ^
- $pageProps['requireModule'] !== 0 && ! f7 _$ ^4 X6 O# `0 f
- !$this->isModuleAvailable($pageProps['requireModule'])) {3 z! Y) d7 p7 S7 g- q4 X
- return $this->showError($this->LNG['sys_module_inactive']);! Q. Q$ w$ l* u9 I4 P# c5 H& T2 v
- }
2 e+ H) E4 K3 B. p" P
- [. _7 U- W9 w4 Q, H- // 檢查方法是否可調用6 R) j0 H, F7 h, Y
- if (!is_callable([$this->pageObj, $mode])) {
, A; h* m7 x8 _, N: n - if (!isset($pageProps['defaultController']) ||
o/ X* d8 M7 s - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
7 p8 h0 H# p% N: v8 C# J - return $this->showError($this->LNG['page_doesnt_exist']);4 @, R' y/ B7 ]4 x; E4 L% g
- }& |: e0 ?/ m5 f" l3 W
- $mode = $pageProps['defaultController'];4 O2 u9 T+ H, |
- }& |/ I" Q$ Q7 \6 b3 ^# S5 U" L1 z
- 9 ^" ^* V1 M) z/ ]
- // 調用相應的方法
5 B9 o9 T. Y; R* [) s - return $this->pageObj->$mode();
5 O7 ]5 [4 a: k! D/ F - }5 b C. B/ q0 \) L: w* a9 u" B6 Y7 a
r" q" w% z R$ c- H: Z) o. w! E- protected function showError($message)
- z! ~' ~1 C& x, N9 t - {3 A1 s: A* e4 m2 A% w: N1 {
- return view('errors/custom_error', ['message' => $message]);
% I9 ^( D4 P1 L. o: h - }
5 V; k" J8 V. x3 G9 U% ` - 4 H' B& H8 V7 t2 ~4 C
- protected function isModuleAvailable($moduleId)* {3 M1 ]3 p/ Y
- {
9 k3 n& K P* u5 }) x5 l - // 實現模組可用性檢查邏輯
8 P! ~( q" M, l9 | - return true; // 根據實際需求修改+ o L, d' {8 z- c* E# M1 d
- }2 w& H# Z8 V2 Q6 x% m
- }
! \3 G9 J7 t8 n2 `+ v6 V, N) S - 5 R# n. X! A$ C% p$ X/ l
- // app/Controllers/Login/AbstractLoginPage.php
1 b1 |( ?" w: M - namespace App\Controllers\Login;- P4 H$ H& C/ |# g9 d: a. }: h
- & {+ z8 u! U+ N2 V Z K
- use CodeIgniter\Controller;
; t6 X6 B& e' i ? - 3 l2 W* }& |7 Y. ^
- abstract class AbstractLoginPage extends Controller% j6 ^6 O# U$ e9 J3 ]( n
- {- h! @5 q3 D' O Q
- // 實現基礎登錄頁面功能
1 K, ] g8 ~+ M7 x7 w - }
! d0 N6 S" e( d$ _4 x - $ z+ g" d& O: J! Q7 x6 L/ G% s1 Y
- // app/Controllers/Login/ShowErrorPage.php7 F. b6 h, ]9 o
- namespace App\Controllers\Login;
3 C0 g% }# T0 i$ Y' F
" r5 e' e7 ~6 q+ w+ B- class ShowErrorPage extends AbstractLoginPage/ O \$ L4 ~% s- F A% W
- {7 q" O3 r+ h/ x; U
- public static function printError($message)9 o* N3 `+ c6 Y
- {
& _& u3 H7 P6 d, I0 u - $controller = new LoginController();
# [7 b3 H0 F: l+ v1 S% s - return $controller->showError($message);
# S+ j- l8 n# \5 F - }
" Z* m# m; _' S" P3 g1 F, g2 S - }7 ?% F$ k( z. A3 i' E: V
$ q1 G+ G, ]2 a: Y- // app/Controllers/Login/ShowIndexPage.php' g3 W0 n: o) g4 q: N
- namespace App\Controllers\Login;0 h R$ |" @! Q9 o6 M
! K2 I; Q7 K" [* J4 w- class ShowIndexPage extends AbstractLoginPage4 A0 y$ @0 J( ^5 y5 J4 y$ x" Q
- {
4 ~! b0 N# d7 k: e9 c7 P - public function show()) Z; o) C1 P+ O7 f- p' H" R
- {8 B' h% t# N9 B! x
- // 實現登錄頁面顯示邏輯5 | u( K7 E$ u' x, j% h! t
- return view('login/index');
! N; U3 F/ }- g* o, b! s5 ^, k X/ V - }
# i+ w% J, a* a& {" Z - }
% t( P* p5 m' q) ]
複製程式碼 |
|