等級:25 - 爐火純青 經驗值:0 / 247 魔法值:15281 / 15281 生命值:7%
升級
  100%
TA的每日心情 | 奮斗 13 小時前 |
|---|
簽到天數: 6070 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
. f8 F, ]7 R; k6 ?' h+ f5 t* c B; lAI 就是站長的最佳幫手。* K/ n5 B! a0 g! r8 T
+ ~3 l' q# h! G6 x# N* ]
+ f/ l3 H- T0 b5 c8 N6 _6 @- P這裡的「新架構」是指後端的架構會有大變化
9 L0 m7 {7 Q/ _1 g但前端的 UI 介面玩家不會感受出來有何不同0 n( s) q% d4 k7 f8 L' R8 n f
& B9 R( j* r+ e, c
: q. t9 Q$ X# y3 Q& ^
為什麼站長要改成新的獨家架構?
; g( m, T* V3 W) M2 ^4 G就一樣由AI模型來解釋清楚吧。
- V& [+ L' @$ r/ C5 k4 e/ Q* K( a% Q6 h8 `: a( f: _9 J
& V' I" n4 U+ p( y: u5 i1 m6 }5 a
讓我分析一下使用純 PHP 和使用框架的優缺點:) a3 p* S# c6 [1 h, S1 |, J# y
純 PHP 的優點: @+ I* u8 K! P0 h2 u* K1 E% |
1. 性能較好 - 沒有框架的額外開銷
6 }2 p$ O2 R1 g2. 學習曲線低 - 只需要掌握 PHP 基礎知識8 f3 q; |! f+ z- x7 i; F( q
3. 更靈活 - 可以完全按照自己的需求來設計架構$ ^0 D# p: u5 t- a
4. 代碼量小 - 不包含不需要的功能模組
; p1 r0 q1 J; n- b: x5. 適合小型項目4 X- U# n" Y* F. a$ S
純 PHP 的缺點:' `9 Z& L6 H1 P6 X0 f7 I6 _
1. 需要自己處理很多底層細節
7 l3 e' f7 a8 f, g4 l! s. W2. 代碼複用性差
7 X$ C0 D! _& ^, ^! v9 \, @9 {4 k3. 缺乏統一的開發規範* H/ E9 g# Z& N0 J' {. n, d* S
4. 安全性需要自行考慮和實現7 D T7 m! K# ~. B: K; }
5. 開發效率相對較低
2 ^/ s9 }" ^, q6. 維護成本高( z" r4 k4 g4 x1 K% _
使用框架的優點:
: r+ p) r) P ]. A1. 開發效率高 - 有現成的元件和工具. W& L) G# T1 r+ p. c9 P# A
2. 有完善的安全機制
1 q# _3 P8 P" ?* ~0 Z" L3. 統一的編碼規範0 a0 v `, ]; r" `) W( M' P
4. 易於維護
$ w" K% [, ?& d& K& \5. 有活躍的社區支持. s' l6 J! u# f6 g3 u
6. 適合團隊協作! b7 r9 [+ a9 ?
7. 自帶很多常用功能(ORM、緩存等)
$ t' s6 W+ _9 ~4 T使用框架的缺點:) E$ i6 Y) v1 p7 k6 Z/ k
1. 性能有一定損耗
2 d. u9 O+ ?1 r# @2. 學習成本較高
# \9 c3 b; M! Z: a3. 可能包含很多用不到的功能
! i, b; P; M$ _8 g2 H6 e1 ]4. 不夠靈活,需要遵循框架的規範; O1 i6 g0 e M- X
5. 對小項目可能顯得過重
- v! `8 J+ h1 e* a0 ^# y$ w9 w建議:
4 D1 K9 F; _0 d6 H% h' L1. 小型項目或學習階段可以使用純 PHP. q ~/ R* R3 N/ C& D" V
2. 中大型專案建議使用框架
7 U9 e0 d3 i* ~, H2 W4 X+ |5 u% z7 Y3. 選擇框架要根據專案需求和團隊情況
) S4 q L' R' _3 \; N; G8 e3 r4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
; s9 ^; k4 a) S0 \3 t. `/ d9 x您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
6 h8 e' M$ W6 e+ J8 y2 O# w. M$ i" B
) g# C5 ^3 v+ v7 B8 J# R0 j8 x0 A) f1 I3 g$ j; P6 ?( Z7 L
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。- ]* i) a0 p" W* U
& J" z6 x- h3 W, ?
這個轉換主要做了以下改動:# \/ q" Q1 ?5 q2 k! a5 i7 ?. f
/ j$ A7 o0 C$ N. F路由結構:
2 J- O3 f: ?5 x) G
# c9 ~' ?3 y' [6 _2 O' `使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下. k% Y% x* z( j6 U
支援原有的 page/mode 參數結構; X" d0 ?; ?- K3 h
通過路由規則自動匹配到對應的控制器方法. u) P1 F& m$ c) i' n. u
& ^* D3 z k5 R0 @) @
8 \, h& E- V' L0 I控制器結構:
1 s. S% N( D( }( j2 s
+ v( o, { a/ O% S創建了主要的 LoginController 處理所有請求
; C) L% y/ Q5 I) N+ N4 H/ m保留了原有的頁面類結構,但改為符合CI4的命名空間規範+ e4 G( A! m# ^$ N0 H# V& j
錯誤處理改用CI4的視圖系統4 z9 n7 T# f# Z, d% D+ b* B' m
9 U8 e5 b$ ~. x& R9 ?
- [, v0 F/ U0 c9 z3 t$ ?6 W( q
類的組織:2 a2 r0 {- t( e, z- N8 ?4 e/ }' \
$ e }0 T/ c+ `" @2 c7 K所有登錄相關的類都放在 App\Controllers\Login 命名空間下
- F' q# ^0 Y6 r. }% ]2 c保持了原有的類繼承結構# b$ ^. p1 R4 H* o! d
改用CI4的控制器基類和特性
+ R8 N" B% F. x2 R3 m. j+ F3 p n" m. L
7 r, `9 }2 M" u! Y; H
改進的安全性:
$ l C3 N4 x, E6 B2 @) D& i& @% ]) U9 N5 b7 X
使用CI4內置的安全特性
! j, D* m7 M. L更嚴格的輸入過濾
! C/ ]( E: T3 V2 M# W. h1 \更好的錯誤處理機制) k3 V3 |, O- b% f& e" S, Z
+ Q( E: e n [" F& b& Q
& e* C+ _, Q" u% i, k% }( p G" Q- E6 ^: O* x! _$ \: h
要使用這個新結構,你需要:
! y" n, ?7 a( h( w8 T- z, ^9 q- |/ \+ ], o. Y3 U W
將這些檔放在對應的CI4目錄結構中
4 k3 V# ~$ K) {3 C' E確保創建相應的視圖文件' ]6 a9 ^* a2 K/ L# V4 l2 F' s! x
配置語言服務; s/ V+ R9 ^. z
根據需要調整模組檢查邏輯
& e1 L4 Q+ o, H @
f' r+ `# i/ Z$ ]8 X; | g需要注意的是,你可能還需要:
5 n ` K, ]! T. u9 n! Z; z
( V' G1 f. l- r# \創建相應的視圖檔(在 app/Views/ 目錄下)
9 H/ T# m& l0 {: T) C$ C% w5 [配置適當的中介軟體來處理會話. ]- G f* g: d6 F4 s
實現具體的登錄邏輯1 U- h2 h! d% H# I! i
+ c5 @5 e8 P% [, c
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?, b1 u$ |1 ^$ X5 c
3 P0 A0 y. X# c9 N+ Q( L' m' P
- <?php
8 W; ^+ D# E8 I+ h# w _ - // app/Config/Routes.php3 p3 I; p7 g6 G8 v. m1 Y( U
- namespace Config;
3 n, a4 Z5 f6 k) {' o+ K/ Z - ! |7 q; B5 l4 M& P8 q6 G
- $routes = Services::routes();6 O9 | o1 x8 x; U1 t
- % ^6 g1 F" Y9 N' w; e
- // 添加自訂路由規則2 y5 S! F; s8 L, H
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {0 Q6 ^, w$ t# z: a$ q
- $routes->get('/', 'LoginController::index');7 L1 z4 N. v2 k, W% ^9 G
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
; b" m r8 {( \) ^! Q: C& t7 ~ - // 默認路由處理5 | t1 @0 J" E# X
- $routes->get('(:segment)', 'LoginController::handle/$1/show');/ s) p, a% t2 [
- });2 d) p3 R+ K Q4 t
- " I8 g) }# B% j0 n1 Z* ^- e' E6 X9 S
- // app/Controllers/Login/LoginController.php; }: V; E- D# o5 f: G) C5 c/ y" S: v
- namespace App\Controllers\Login;
4 |7 i" r: k2 T1 Y& ~, ~0 T# m& W
2 p/ C# ]% R i: U: Q- use CodeIgniter\Controller;4 C7 R* M1 _2 U w2 }0 T
- use App\Controllers\Login\AbstractLoginPage;
% W& K+ |( z4 B - ) G& b* V' V2 Q' ?% ^& _5 g6 N( F
- class LoginController extends Controller! o, N- [ r( F3 i
- {
H# S) o' a. h/ K- n - protected $pageObj;
5 ?. F0 c m5 q' E% ]0 h9 c - protected $LNG; // 語言物件7 @! h, V5 H5 t. ]6 N& J0 P* I$ b
8 t! v& \! s2 a; m! \ x: U- public function __construct()
: X% _7 }7 C, @ z - {
, ^( g4 R7 z2 E; w2 [! h. g - // 載入語言檔和其他必要的依賴
! y; s. }% U* H; D: Z+ t$ z7 p5 O - $this->LNG = service('Language'); // 假設你有一個語言服務
+ q' w7 f2 X O; } - }" O: |# R% @$ p, f* ], ^: }8 t
- m7 {% ^, v M- public function index()8 w$ J- h. p# x# `# V% ^3 q' ^+ n3 K
- {" t0 O g4 B4 p0 y- E
- return $this->handle('index', 'show');7 C. M* l% k6 z5 d% q
- }
9 d! X: X% H9 S$ [8 _) S; |, I
! K [( @( W0 n' r y( X: l- public function handle($page = 'index', $mode = 'show')9 Q( M5 {& d& o) C
- {' B: ?8 R! E L3 |
- // 安全過濾頁面名稱
6 X1 p2 b, H. Y - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
* y4 B p- Z8 T% c7 i - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';: m7 D2 G. X$ z0 c
-
# x- l* s; s" a2 g+ L1 B - // 檢查類檔是否存在9 _. J4 `0 Z% m6 U+ r
- if (!class_exists($pageClass)) {
6 m+ M: s" V, E/ s6 U& a - return $this->showError($this->LNG['page_doesnt_exist']);1 _: O9 C' P. J/ W- s
- }
2 B6 g' a* r: v. _- w
% ~$ s' g5 @: ^- // 產生實體頁面類; _/ I4 b# q; t9 s6 ~
- $this->pageObj = new $pageClass();
' q$ h0 I' |3 D! Z; F -
, Q) Q- }" b1 M2 T* ~ - // 檢查模組要求
8 K1 k7 C$ q0 E9 q1 o - $pageProps = get_class_vars($pageClass);' l; r- j/ p: L- I' F/ Q; T( |6 ]; w
- if (isset($pageProps['requireModule']) &&
6 b- A+ a l! ~! ? - $pageProps['requireModule'] !== 0 &&
) @) |' a4 I8 t! L$ P/ Q - !$this->isModuleAvailable($pageProps['requireModule'])) {
# W3 q! W0 G9 }$ ^ H$ j* E - return $this->showError($this->LNG['sys_module_inactive']);
' L4 W; g, f' Q1 t; M - }
- Z2 s7 l0 J6 Y9 N! z- b0 Q+ | - * j( J2 }# B5 q% r
- // 檢查方法是否可調用
+ H0 h! x* m! b" | - if (!is_callable([$this->pageObj, $mode])) {
' U! T$ ]# v' g3 B- W4 r - if (!isset($pageProps['defaultController']) || 6 m4 [& a* h* m; b
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {* `+ F1 @8 b* K7 h; z
- return $this->showError($this->LNG['page_doesnt_exist']);
- o0 }& x* e2 N; I( W& l - }* g. w6 B8 {1 k* B
- $mode = $pageProps['defaultController'];, V( F' [+ {- U
- }
4 W/ V: `3 x/ i0 @, f! H5 [ - & O+ l2 R& p# A Z( N6 x8 b' ^
- // 調用相應的方法
; q+ t3 \" _9 e7 M5 b - return $this->pageObj->$mode();
# X, d, U9 b$ A v# ~1 p - }
' t$ H5 P; f) V, \" N$ z - ! M% ^, C X& G3 n: b
- protected function showError($message)5 \2 ? J: T' M" f3 B1 A z3 ^' ]$ T
- {" p1 ~6 ^1 \1 z! v3 K% }0 x
- return view('errors/custom_error', ['message' => $message]);
+ }9 ~, f7 q8 v, }: {# K5 W - }
2 e4 o5 p5 d4 R+ @( u" U
9 u @6 ^) t/ I! I- protected function isModuleAvailable($moduleId)
+ D! u7 a+ i$ y* p# K- H! N - {
0 m% G& Z+ f; ~5 j$ v - // 實現模組可用性檢查邏輯0 O& D% s- D; |* j; A! t
- return true; // 根據實際需求修改
( m$ s4 b2 p1 F6 P; F8 S - }
) b5 ]; W, U: J6 H. O# X - }
3 x7 J* G2 I }2 i8 _ - 6 ]9 }4 Q5 p1 _, M/ P2 H7 X s
- // app/Controllers/Login/AbstractLoginPage.php
1 d* _. u1 }1 Z" |7 |6 ^0 Z - namespace App\Controllers\Login;
* R1 R! K& ^2 f: f+ `3 O
: s3 A" s0 Y, x @ \* v" t- use CodeIgniter\Controller;
8 S8 s0 S/ G' j% b
- j% L9 b. j1 G5 R4 T- abstract class AbstractLoginPage extends Controller3 e* b, H1 g$ e9 d1 P
- {, ]* K3 \0 h( U9 F
- // 實現基礎登錄頁面功能
) y K4 `: `* Y( k' _+ v* \ - }
a' x2 F; A9 b( w4 v( ?$ s - 9 k8 R- d, a7 F# H j! O1 G( h/ K
- // app/Controllers/Login/ShowErrorPage.php; \! e$ q, t+ ^4 g
- namespace App\Controllers\Login;
1 L- K) _# r7 M
" T* T" }; v) \* o. Z- class ShowErrorPage extends AbstractLoginPage
$ |- E+ ~3 o( w' A - {
$ P6 `* Z: q9 O - public static function printError($message)9 }1 `5 \& N4 T1 i' K
- {6 g9 m% L# i5 V. N
- $controller = new LoginController();
1 ~9 e4 b0 H: E% U2 P( J ^8 l4 ? - return $controller->showError($message);
4 \5 ?) X9 m( X - }. b. V% s/ n8 B" c0 m. K7 E
- }% X$ B% q- b) y/ Q' `( l
- 7 e5 o) A: H6 v: ~: b' v# d
- // app/Controllers/Login/ShowIndexPage.php* O: U5 ~3 x! M+ Y# V
- namespace App\Controllers\Login;; _) M) C( C9 z3 a# a
- 2 T5 P, E6 X6 m( X! q9 P
- class ShowIndexPage extends AbstractLoginPage4 S" Q. H/ P0 _
- {, A6 l2 C# X O# l8 D6 M
- public function show()0 l* A' K6 I0 w8 F7 H3 P) [
- {
; `- I9 m6 @: E6 z3 q - // 實現登錄頁面顯示邏輯2 y2 l1 u# r; @
- return view('login/index');
! e3 S) F& z# m$ G( m - }
. ^- V% K3 e% H$ K* c1 W - }& P8 o L8 y/ _
複製程式碼 |
|