等級:25 - 爐火純青 經驗值:0 / 245 魔法值:13994 / 13994 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 昨天 01:18 |
---|
簽到天數: 5641 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
$ X* C8 P& ]2 c- W6 d' }AI 就是站長的最佳幫手。
! s- T G% t2 C9 n) C6 C0 I# }; S' D. H2 ^1 m( g
8 F$ V% R1 ], \! c# V3 [% G這裡的「新架構」是指後端的架構會有大變化
4 z$ [, l' v7 {5 D& Z: `$ @但前端的 UI 介面玩家不會感受出來有何不同' T2 [" k. H/ T9 ]
8 |- w' {8 v* ]; p \* u, R
' `1 {: i' c, D/ Q2 b1 r2 t
為什麼站長要改成新的獨家架構?
8 }$ o3 g9 g" H& H& W就一樣由AI模型來解釋清楚吧。% Z- B* I# m F9 b" K4 Z0 C
3 c1 n! q% `1 L' ]! X
# L$ A, s B5 z# p* O/ Q* _
讓我分析一下使用純 PHP 和使用框架的優缺點:( z4 J. p ^. ^' n; K8 c2 r
純 PHP 的優點:
! t8 s6 Z3 J8 I# x0 x. W1. 性能較好 - 沒有框架的額外開銷6 e! B, G7 Z5 c. D5 g# W3 o4 T4 d
2. 學習曲線低 - 只需要掌握 PHP 基礎知識( s7 U: ]: Y J1 g1 M
3. 更靈活 - 可以完全按照自己的需求來設計架構, t- Y1 h4 i& N' M- w
4. 代碼量小 - 不包含不需要的功能模組
' Z: L$ N) R) }/ H1 c; A9 Z& Q5. 適合小型項目1 J# p! p# S+ S' k
純 PHP 的缺點:
/ ]: N/ b' Z, ~9 Y1. 需要自己處理很多底層細節# Z* g) O1 G, r/ c9 b0 X
2. 代碼複用性差" A( N1 V4 B- ~# o5 g7 L' B
3. 缺乏統一的開發規範) b: b) A$ J- j4 |- e2 n( `" z
4. 安全性需要自行考慮和實現8 N) |, c8 L9 V9 R
5. 開發效率相對較低
' b C2 v8 ?$ p: p+ I& x; j6. 維護成本高0 f6 _( _: k! u2 t) g: Y
使用框架的優點:
. S& g7 @5 [0 b! {2 w4 }1. 開發效率高 - 有現成的元件和工具
* _4 R8 J Y: k8 R, ?) E' Q2. 有完善的安全機制
5 J, ^1 E. u4 z. F3. 統一的編碼規範1 L7 b4 I1 \" b2 k& T1 \" {
4. 易於維護" G$ y( i) M- Q5 S/ B+ t! n
5. 有活躍的社區支持
) f8 t3 A! j( c5 y' a% V" g6. 適合團隊協作
- W1 n+ Q b+ K- j* A! P$ L7. 自帶很多常用功能(ORM、緩存等), @2 X: _5 J7 `" p6 @: a
使用框架的缺點:- ~1 j& P& f. T
1. 性能有一定損耗
3 `3 \# f( S: M$ {2. 學習成本較高( }/ t4 @# h: j% I7 Z0 O; x$ Q) L6 H
3. 可能包含很多用不到的功能; t" [- W- f. U: r& D
4. 不夠靈活,需要遵循框架的規範1 j' c* f& o, u
5. 對小項目可能顯得過重7 W7 P- [9 ?& @
建議:8 B5 F+ ?0 Z' w; f
1. 小型項目或學習階段可以使用純 PHP7 C* H) Z; \4 d( W$ W' D9 u! C
2. 中大型專案建議使用框架
0 M) P1 x# Q& R% }% s6 ]& h/ {3. 選擇框架要根據專案需求和團隊情況! b" e1 b/ H1 y/ ?% Q1 P2 f
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇/ A/ r7 ? A9 ~6 R& P. _4 |
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
# C, k" `( V& g; u* D( ?( T8 U& ]( t
% F1 M3 q, d" J& h. Q6 v
2 k# N+ |; u+ X5 q7 F我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。8 [: c9 O) ?0 v- y$ e! H- k& W
) y" e+ P3 l' {: b% n這個轉換主要做了以下改動:* r0 E/ T; S% F+ ?# U7 S
3 T5 L' [$ n) ]) Y路由結構:1 N( o% W6 _# G' @+ H& J) |7 A
8 [/ \% X: R6 h$ n* X8 z. h
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
0 t* a; v3 E8 v7 R. p支援原有的 page/mode 參數結構
4 r" l- u5 d6 ~' R# e( u5 c7 r; s通過路由規則自動匹配到對應的控制器方法
* v r$ L( B) C9 n$ B
* W2 V& R2 m1 K: ]) _* b: h8 x+ b, c$ |/ x
控制器結構:
9 x: {2 N8 x; x- y+ j9 U
' J- T/ p" P2 W: n; m) l創建了主要的 LoginController 處理所有請求/ ~" O; R1 n) {* Z
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
* s7 K6 ^# `1 D3 E錯誤處理改用CI4的視圖系統, i. a0 a& g" Z. j5 s7 \
2 Z7 z2 M. I1 `0 h' W$ D- b: s, z+ O: P: z; [
類的組織:3 X; j! y3 r; M8 G
0 q9 ?4 F m" { e. F8 t
所有登錄相關的類都放在 App\Controllers\Login 命名空間下! v, S9 N7 ~" o; F/ t/ D/ e$ F( [
保持了原有的類繼承結構6 X) u' L' g$ |( P6 @
改用CI4的控制器基類和特性
# y* ^% [( z3 s
# u" ^+ P: j4 c( R" C0 G
6 I) }. @, T+ j/ R' w+ \改進的安全性:
* E+ o ~$ H; U( u: Z7 c! J4 |
/ ^/ P5 z% V, x! C' @# G使用CI4內置的安全特性
( _- _; K% k9 f0 r8 m( H更嚴格的輸入過濾! p0 h( n @0 D
更好的錯誤處理機制+ G! s, _1 K4 k6 O0 v
: O: z" c! [; }- q* l# s
: B* j) I$ m2 j. F4 u* m- p+ F2 O. W' \' | v; Q
要使用這個新結構,你需要:. o# ]) _$ C1 O- A
: k* }) h( t T# W
將這些檔放在對應的CI4目錄結構中
! g: _. |+ J8 i! v5 C: d3 o u確保創建相應的視圖文件
2 E" }6 k- ~- C; @1 ^( `7 k配置語言服務
! u. Q. U0 Z) ], k+ `3 X5 o根據需要調整模組檢查邏輯
# V1 x# K. l) b- o2 s5 H, t \
2 ]2 W& a# a2 i! {: K! L9 o需要注意的是,你可能還需要:
; @8 Q' k7 H3 h) l3 l7 j- h5 ^
+ {' u7 n+ x- K2 J/ H創建相應的視圖檔(在 app/Views/ 目錄下)
5 O) T4 C0 ]% \& Q9 {配置適當的中介軟體來處理會話
3 m$ X+ ?9 c4 V# ~實現具體的登錄邏輯
2 j) C9 J% ~" m7 Z' r+ Q
# D) S8 J3 o' I+ r e/ L需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?- |0 {. @& L& B; R8 U/ G
3 o' F( d+ X. U) B) M' z
- <?php4 N- X& Q8 e2 E5 Q
- // app/Config/Routes.php
2 @( z# X7 F9 M" c - namespace Config;, ^2 X7 l1 E, D5 B
- ( f5 H6 C5 ^3 }2 ]3 j6 d, q
- $routes = Services::routes();
1 w4 E$ h; g1 B) \* w g - ' p: w& c5 B, h' n5 M f' j L
- // 添加自訂路由規則& j! R% C6 k7 ~6 {, b" i( g' \
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' v; @! H/ O4 a8 p
- $routes->get('/', 'LoginController::index');, A: K* S* H. f+ \
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');$ L v9 a% e' N1 |8 I( W5 r
- // 默認路由處理6 ]4 z6 I4 t# Q! B
- $routes->get('(:segment)', 'LoginController::handle/$1/show');: t; Q7 k. Y6 U9 s! t6 v
- });) \$ J. _; A8 C p' S, \0 \3 O
- 8 t3 x( O4 z1 E' Q: k) W& j
- // app/Controllers/Login/LoginController.php
& d) k7 J. h* @ - namespace App\Controllers\Login;
8 }' a# U1 Z6 b# C7 i - 0 w1 K$ |- a) G S4 V
- use CodeIgniter\Controller;2 t* T# |( n% J2 |0 w* e/ ^; I
- use App\Controllers\Login\AbstractLoginPage;
/ q$ w1 e$ k: j* |
$ e+ K! ]2 R: \6 W- class LoginController extends Controller
6 u: D( t% D0 I2 t* ?6 X1 ] - {
0 Z. M- Z$ N6 t d% K" \ - protected $pageObj;3 b7 I1 K% W, m( |
- protected $LNG; // 語言物件: J7 U' l$ j0 p, g, E5 T
- * d* f g% N. x; }/ y) _! r. [
- public function __construct() ! \) e2 Z) |: s& F, r* Q
- { c: W( ^ h" H. B( {
- // 載入語言檔和其他必要的依賴- ^) T1 ?- s/ E. f% _
- $this->LNG = service('Language'); // 假設你有一個語言服務" D. q0 \9 F7 @: s1 K3 f
- }
* r5 {6 S7 Y) {/ K6 K$ a7 J# U# y - ) A: t$ i- a& H8 p) l
- public function index()* f) h2 ^; M$ y
- {! Q% ?9 B3 x6 E1 J+ j2 H) A, }
- return $this->handle('index', 'show');
2 M# N/ s T8 R8 R- A: j/ L - } ~6 h4 J8 |+ r
- " C) |# f& l% C' B" J4 z" h
- public function handle($page = 'index', $mode = 'show')
6 f% o" w. a+ i4 X - {
5 e6 ]4 ~. V, @! }& ?; z2 f6 X - // 安全過濾頁面名稱
8 ]; y: g! I- r4 f1 D2 [* B - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);) r( f% e4 O. T% O# o
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
7 X) f1 B- p$ a( \8 e" q m% H. G -
; D# Z8 N( T6 H& ?. x3 n - // 檢查類檔是否存在
3 U9 W6 ?& g4 ~- [0 M' D - if (!class_exists($pageClass)) {
4 F$ K% s) I- e4 H. I - return $this->showError($this->LNG['page_doesnt_exist']);
& O% y" E7 X" w* R+ F% B( W - }! `: z" B5 O! r# ?$ T
& c4 m! \' X5 _- n8 T- // 產生實體頁面類
# l+ J+ f) R% n$ \) u0 S) } - $this->pageObj = new $pageClass();# ]+ S/ e! f: @' n
-
% n- p, [( h2 S, v" w4 m - // 檢查模組要求
3 f% S! ^! w7 F$ r - $pageProps = get_class_vars($pageClass);
/ u) g- C5 V: U: G$ X- U- |. C5 J - if (isset($pageProps['requireModule']) && + A! P6 A: c2 l7 {( [* e
- $pageProps['requireModule'] !== 0 && $ K; j B) y2 \/ b3 R) T0 T7 [
- !$this->isModuleAvailable($pageProps['requireModule'])) {
8 ~' |+ x; [ C/ J7 G$ L4 }# x - return $this->showError($this->LNG['sys_module_inactive']);
0 c" j9 N* L7 t* F3 q" h3 R - }
8 q, V8 L% T H1 E: a: m
& J |" r. p) e Q8 ^% x% F. f' f! K8 C- // 檢查方法是否可調用9 h4 V0 J8 D- I1 s. s
- if (!is_callable([$this->pageObj, $mode])) {# k" o! Y% ]# e7 x) Z* `
- if (!isset($pageProps['defaultController']) ||
+ _5 T. [9 Y; ^( {6 A - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
E+ d* M% z; A' q7 x" M - return $this->showError($this->LNG['page_doesnt_exist']);
8 p N4 ]) x4 j f* }# X Y4 G# y - }3 v! W( Q( I4 e2 O8 Z
- $mode = $pageProps['defaultController'];
+ T3 d, f% F. M - }
3 b; t) z6 P+ @4 T$ V8 } - + I3 i* }% W' w
- // 調用相應的方法# U: H$ L5 s8 c$ V! u$ Y' i' ^
- return $this->pageObj->$mode();
5 Y, z- g* T! D* l7 | - }
" S+ P$ W+ z0 Z - $ d4 Z6 _( e1 z" W
- protected function showError($message), n) D, ^1 k5 X1 ~
- {" k4 [, J/ L$ G1 i3 @8 C! x
- return view('errors/custom_error', ['message' => $message]);% b6 D2 c E9 Q
- }
5 l, g9 ?0 R# B
% u# y. c4 X$ P- ~' p# P7 N5 |- protected function isModuleAvailable($moduleId)+ b0 J9 N- z$ k' w# c
- {
' f- q: I4 e F8 C: t( X - // 實現模組可用性檢查邏輯. ^1 O$ p2 f/ L" \: W3 C: a
- return true; // 根據實際需求修改( G) c* ]4 l/ B3 L' B% O- A+ o) N; p
- }, D c* N# z% e5 W4 g+ b
- }0 {8 m' w+ h* P
- 7 U' x; j D9 p
- // app/Controllers/Login/AbstractLoginPage.php
+ l9 E% h3 U4 @6 G0 M - namespace App\Controllers\Login;
4 J( A: F4 z! J# D* Y6 K8 J - & L6 t# A u7 E$ }' _& l
- use CodeIgniter\Controller;
6 h5 L2 q6 R. V! C - / `+ k; j+ W/ \" c; j5 e
- abstract class AbstractLoginPage extends Controller% O4 O, O9 a" `; a
- {
9 H9 c, z3 y: b2 R. O4 j - // 實現基礎登錄頁面功能
) ^1 s6 q8 ~" n1 D& j M - }8 y$ P, f V, ]0 f+ z
! p' a' T1 V- p2 V; ?+ f' A- // app/Controllers/Login/ShowErrorPage.php
# M, q9 f, V" u& k+ _7 y5 b- [ - namespace App\Controllers\Login;* w6 ^( u5 S- v+ o, ]6 ^
% }$ D# ]4 }0 k- class ShowErrorPage extends AbstractLoginPage
' h- r9 {& @& e# Y - {( H) R7 I5 S, Z( Q" p' M9 g( q5 {
- public static function printError($message)# k x$ J T9 w' H
- {6 Z* N. K9 W* [ B8 U8 U" W7 U
- $controller = new LoginController();
1 N* O" s. {# T; u2 M+ I - return $controller->showError($message);) v* d6 z S; v' N+ k X% P/ l
- }
1 }, j" ~4 S8 c8 P) @) g0 f - }
9 ?3 E; k8 H3 g) c: [8 I6 @) s" E3 k
1 a; d; H1 p% ]) |4 Z2 \$ N- // app/Controllers/Login/ShowIndexPage.php# M) A* a$ I4 `9 s6 t4 \
- namespace App\Controllers\Login;
[8 s2 f; [5 e' s: m - # w* t( Z, T( e: r- U( Q. n' r$ f# {
- class ShowIndexPage extends AbstractLoginPage
$ |% J4 @ a5 h6 [- c5 V - {
$ W% b5 Y3 k1 d" G& n - public function show(): T+ f3 h# X: n8 O0 w7 r5 y& T4 K% R8 s
- {; ~: D+ L# f8 v [% E
- // 實現登錄頁面顯示邏輯; R- y' J1 ?1 v" }( _# w# N7 C
- return view('login/index');
( r7 w, u0 J a4 q2 p7 u - }9 ^8 v/ O- n. |3 v& q! \; T
- }
" b6 Q! K5 r2 a9 X* r
複製程式碼 |
|