等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14276 / 14276 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 16 小時前 |
---|
簽到天數: 5745 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
, p: C) m1 b7 J0 j8 GAI 就是站長的最佳幫手。
* \) K# @; w) R3 l
6 g9 \) w \0 k9 P3 r- R0 u: L; Y* [
這裡的「新架構」是指後端的架構會有大變化
, \/ ^4 K8 q, ]; q但前端的 UI 介面玩家不會感受出來有何不同
+ u1 j4 e- V0 J& U# `+ l l8 x, q, |$ x
% w W5 R$ z' ` M$ C
為什麼站長要改成新的獨家架構?4 ~ k! \$ n# t# p% Q% }3 R
就一樣由AI模型來解釋清楚吧。
2 ` g6 `- g% _1 \5 z- T8 s4 D0 ~( V3 E7 i: [
: ~) \" I3 E) S: ?3 D# ~0 s2 p
讓我分析一下使用純 PHP 和使用框架的優缺點:7 r% | a1 `0 @* L3 ~3 \
純 PHP 的優點:
5 h, f4 l% b0 _$ i }9 e1. 性能較好 - 沒有框架的額外開銷
0 d8 s+ Z1 t$ r, y- X! I2. 學習曲線低 - 只需要掌握 PHP 基礎知識
: m' O; }; D% U- E! J3. 更靈活 - 可以完全按照自己的需求來設計架構
8 w" Q, C) H/ m$ Q5 a6 ]1 Y4. 代碼量小 - 不包含不需要的功能模組4 V a1 x& A7 K% i+ ^3 v( ^1 U
5. 適合小型項目+ D% c. i! _! l9 R$ S
純 PHP 的缺點:: }& N) `" h/ A, o3 o; w5 T: }
1. 需要自己處理很多底層細節$ z9 n# R4 K+ C9 g/ {; M/ y6 f
2. 代碼複用性差
" ^0 j* @5 n4 Y! o0 ?- T0 d. y3. 缺乏統一的開發規範2 Z! E+ k. Q) ]+ a
4. 安全性需要自行考慮和實現
$ e: Z0 V, H) [7 t5. 開發效率相對較低
5 A" T) b1 W% I9 m' b6. 維護成本高
X. O1 Y0 C; Z( F0 \* W使用框架的優點:9 a1 [$ _, J7 r/ l" K
1. 開發效率高 - 有現成的元件和工具: g% U9 a- i4 S! k) M# r
2. 有完善的安全機制
' N$ ?5 @" y1 m1 F& O3. 統一的編碼規範5 j- L. N0 ~6 m, ]& g2 E% }
4. 易於維護& X0 h3 X! q% Q l& N. T: a, t
5. 有活躍的社區支持- u7 [! i1 a1 h: u
6. 適合團隊協作
4 a6 M: W) j; h! g# L" K4 C7. 自帶很多常用功能(ORM、緩存等) u% G0 ` E! w& l
使用框架的缺點:$ c) }9 A9 d, j- J% L7 J
1. 性能有一定損耗8 q8 ~/ l0 }2 [$ z- t. X
2. 學習成本較高
& M- |& `% K" Y$ v8 |: |3. 可能包含很多用不到的功能- L6 h9 k/ m8 ]
4. 不夠靈活,需要遵循框架的規範
8 P1 E% t& f7 p' i1 C5 F5. 對小項目可能顯得過重
5 l" |! N" k; D0 U* x- R建議:
; ?# T! Q* g8 O7 ~ \) Y) Y% m1. 小型項目或學習階段可以使用純 PHP/ M l* U) }" [5 R; t- |
2. 中大型專案建議使用框架2 N4 y: G; a+ X0 K& W% Q
3. 選擇框架要根據專案需求和團隊情況
, d: s2 P; A, v6 P8 @4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
6 X! I4 R5 c4 d- C您打算開發什麼類型的專案?這樣我可以給出更具體的建議。% H- {( s) j& p! G" u
% g5 g( V* w! F2 e5 q" y
% G4 H5 @" S3 |; p6 L4 I2 `
2 r" j# c; |: ~$ \1 W我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。# A; ]4 ?! _; H
" L" ]' I2 t: \. u% }/ I- E這個轉換主要做了以下改動:+ @6 v8 q( }7 c( T, H9 G% q
; Z% e8 ~& L; G0 y W
路由結構:, ?" k6 T' M3 u. y$ X/ e1 h+ R
( n7 E& y, u. n8 i& f3 v
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
3 a2 E6 d% O3 i5 k9 v, C" I& W支援原有的 page/mode 參數結構) f, q1 @2 F0 s0 w) u. ]
通過路由規則自動匹配到對應的控制器方法/ u3 Q3 \7 i2 ?1 @! R% e) _' _
* @; t f; n% E8 j r, Z2 h6 \/ T% j: l5 ]
控制器結構:
3 ]9 V8 A2 U( G' L6 o, a
: ]6 j- v- j6 l. t7 A2 O創建了主要的 LoginController 處理所有請求6 i* P+ y9 I: V" {; ?+ T! }5 \! v
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
- ]2 S7 C# P* E, ?" o F* z2 T1 r, ?錯誤處理改用CI4的視圖系統1 P( G. C7 C4 r0 Y) v
# v) I, v! t) ]0 D
& g$ ]0 K! Y; o% e( B類的組織:; j4 {3 d/ v& G& x* { P
" M3 X9 d! @+ M& Z0 q/ e6 ]
所有登錄相關的類都放在 App\Controllers\Login 命名空間下( w/ z) O. n# ]" d6 |
保持了原有的類繼承結構% }( H0 n, j$ |. _* X. P
改用CI4的控制器基類和特性
% C/ |- y$ U' r6 Z0 `7 O" f( B- y8 b) J8 n) S! J" j, G
1 L" F8 o) C. N! W" o1 w/ J
改進的安全性:* V: O6 e) M( {( [) g
3 s; L! @. I7 q- c, b6 s使用CI4內置的安全特性
$ b4 i9 X. J o* k更嚴格的輸入過濾/ u& W) K7 w; `
更好的錯誤處理機制; h$ L, ]) g2 B& |3 X
) [( _ w4 ~6 ^: S. G1 ~( ]4 T! X% \/ q- g$ O) @$ G
4 X( W& [" _; a1 e5 `
要使用這個新結構,你需要:
' P$ F; y9 E6 I; M' E/ `
1 i2 m$ D, m! L9 Q6 n- l將這些檔放在對應的CI4目錄結構中
$ ^0 m% ?& L6 f6 s6 a2 E" h確保創建相應的視圖文件
* O7 w3 `8 x9 \: n q配置語言服務
V1 A5 B" ^8 b! u1 J根據需要調整模組檢查邏輯
' V9 N6 p; \/ U7 A; G# s4 W! ?. m( N0 T, L& G7 ]' ]
需要注意的是,你可能還需要:" i. Y2 z& f: \+ R& {3 d0 p5 h+ {& H
# Z9 {% T" C* l) d s- z
創建相應的視圖檔(在 app/Views/ 目錄下)
3 o& U0 x! p7 p配置適當的中介軟體來處理會話
! _1 i* f: w* [6 C3 T實現具體的登錄邏輯. f! U0 A) w% l3 @6 _+ ^; e
6 _ v2 y0 q& [' m需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
# f1 _% L i0 N6 y, U7 d( S' O8 ~. @3 N( S0 [( P/ o
- <?php
& p+ W* i- z, e& w% V. I, U - // app/Config/Routes.php
4 m. M/ ` I+ b - namespace Config;
- U0 ~/ C, z3 {: C
" Q+ t& \2 S! h* ~) @4 X0 T- $routes = Services::routes();
) O+ ]" O* f2 k# J, Z& p
# Z- u5 S% N! Z' \* I& b- // 添加自訂路由規則$ V% y/ U+ u% d- `) ^# l
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' X0 N1 W; z; m) u( R
- $routes->get('/', 'LoginController::index');
$ n, c9 f" Z8 u- }" }4 w* P - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
5 A! k0 j. s& s7 _! e4 k - // 默認路由處理
7 x; D0 h5 t: I - $routes->get('(:segment)', 'LoginController::handle/$1/show');; t) d' R2 |$ \8 n+ I$ ?
- });
" c% ^# W/ ?- d: A4 k: d* {+ n - . F$ I" h3 l7 L% t$ ?2 c5 V, y
- // app/Controllers/Login/LoginController.php
2 U$ k- m0 B- A+ G, [ - namespace App\Controllers\Login;
0 }7 o. b- I$ D4 C4 a
( n8 ], y5 x0 W; m, [! q' P2 W- use CodeIgniter\Controller;
! {) E9 c3 K" v) R - use App\Controllers\Login\AbstractLoginPage;$ ?5 x8 c5 _1 i z
' q; L" f- [: g5 Z! ]& Q& f# `( K% ]- class LoginController extends Controller4 L1 d; r' Q! F( ?
- {. D. o. r- G) Z3 H3 F' f6 m3 U! W4 b
- protected $pageObj;
, e, T8 t7 [8 J4 N# Y/ j: M - protected $LNG; // 語言物件
% ?+ F9 F2 M, F' {5 H0 J. i' [ - 7 M- c9 {/ c9 R
- public function __construct() 0 j; ?' G/ G$ t% n" l
- {
& P# Y0 l* b* a) Q6 q( B - // 載入語言檔和其他必要的依賴
, K" h8 B! Y2 `7 t - $this->LNG = service('Language'); // 假設你有一個語言服務
! `( L2 ?5 j- f4 ~ - }' S: ^7 M% P2 t% c% ?, M
# t8 j& x3 {1 T( J2 |0 d- public function index()# a6 }0 \1 k/ h
- {, n( @) @1 R/ Q6 l( V
- return $this->handle('index', 'show');
2 \" x: u# ^* M _+ o' } - }
& C7 \9 j7 M" Z% e
0 f: |* ?0 }4 A- public function handle($page = 'index', $mode = 'show')! p( f7 H6 y1 e& g; f! J
- {
- H9 b# `+ E( q - // 安全過濾頁面名稱
/ O5 }6 N% e3 s% e9 c3 H5 W - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
3 m% c( P8 S3 e7 f8 @ - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
/ d y& h% t L/ k2 p" _ v - $ U/ b* a: j4 Q& y' u+ Z! A
- // 檢查類檔是否存在% Z+ H3 i0 h9 o% [# z0 f
- if (!class_exists($pageClass)) {& M6 d( d, ^1 o B# F% a
- return $this->showError($this->LNG['page_doesnt_exist']); P! `! J# ]9 i4 Y4 s
- }7 r' {0 ]$ ^1 E" _1 Y# } G5 I
- . Z% U1 W- j$ K* C, K% V. J
- // 產生實體頁面類% }' B( @" f9 \( V# m
- $this->pageObj = new $pageClass();
" g/ i( p) q5 ?, V2 }( t, m -
1 r- E1 R' y0 j' c5 Y, m0 m - // 檢查模組要求
$ m( e( M9 W5 a5 b2 K) ^& S - $pageProps = get_class_vars($pageClass);
, M: f/ u9 U7 M1 w R - if (isset($pageProps['requireModule']) && # H+ k6 H- E; B6 E
- $pageProps['requireModule'] !== 0 && % f4 q) m( h$ |3 ^
- !$this->isModuleAvailable($pageProps['requireModule'])) {
6 G! b+ U" T/ Y/ W& ? - return $this->showError($this->LNG['sys_module_inactive']);( {2 O4 ?' l+ x9 m7 q: p5 b) g A
- }
' t( K4 C; Q( i1 {$ H, g3 h* ]
1 r- q% d0 l8 G$ U: N5 F- // 檢查方法是否可調用
; |& _+ [$ {1 Z# g, ?$ M; } - if (!is_callable([$this->pageObj, $mode])) {
# _3 y# `3 _6 r7 z) p9 F, L* h - if (!isset($pageProps['defaultController']) || / ~& j- M, b/ m4 o: e* C
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {) {* ]& G, E6 k2 C( P
- return $this->showError($this->LNG['page_doesnt_exist']);8 v$ _$ a3 t+ r
- }
+ j! W. e. d2 z1 |+ q - $mode = $pageProps['defaultController'];
( Y2 h2 v1 W, m" f) u- W7 _; H* e2 O - }
6 s, e" l, \$ N2 d; R! z
9 a L0 g6 Q/ I7 `# D- `& L- // 調用相應的方法7 d, w% I- j6 l% N W5 I
- return $this->pageObj->$mode();
# c/ ?% z5 i* l# v. o - }
' t! V# y$ k' O- Z
6 @/ |1 K8 C2 A/ |9 D- protected function showError($message)
& ^$ }" ?9 e, J0 _7 Y2 u - {8 s' ^: L) }5 x$ S% f
- return view('errors/custom_error', ['message' => $message]);
1 B% F6 R0 r! s1 q - }
% N% w4 `6 ~; T7 j- U4 a9 D - 1 [% p6 ~2 D. c
- protected function isModuleAvailable($moduleId)4 v5 F3 L x6 `% P& o J# A) X
- {
) X6 M4 k+ c2 T9 ]% S* z0 i; N6 y - // 實現模組可用性檢查邏輯
3 Y* G L1 S+ S' y - return true; // 根據實際需求修改: M+ n, J) E$ [/ E$ N$ s7 Q8 P" _; Q
- }! ~4 h/ i- X1 _! @
- }
. B* @2 L2 n: ?
( H# Q6 d6 Y% J" n( n- // app/Controllers/Login/AbstractLoginPage.php
& p2 l5 I0 \6 L/ E/ @4 Y - namespace App\Controllers\Login;
1 w y! @, l; e3 E1 i% J - # t+ e, Q; `* L( H- G
- use CodeIgniter\Controller;, k; M+ s6 l* N7 H7 H% D A. A
- # J1 `$ R2 a5 f" j) J% V
- abstract class AbstractLoginPage extends Controller; X) X8 L+ ^' T U
- {5 [/ B9 l# O; m9 E2 W
- // 實現基礎登錄頁面功能
8 g$ |- s% O6 S* a - }
2 |+ W. b% C- R3 h. w& E - ! K: a, f- ]6 v6 W
- // app/Controllers/Login/ShowErrorPage.php
2 L9 g' l9 r; K1 x - namespace App\Controllers\Login;6 G1 p& A+ k% Y+ e7 i
! C, }4 H. N0 G) C! O0 a- class ShowErrorPage extends AbstractLoginPage
! m0 y# Q& {! j - {+ X, O' a4 i, s& A% [
- public static function printError($message)
$ A& h' y. A. O* p7 v9 U - {
* Z1 G3 J6 P- [# F4 p0 ]- M - $controller = new LoginController();7 e( h H' `7 O, I% F
- return $controller->showError($message);
! ]1 a+ `1 M5 @+ c2 i - }
) \) R/ F- f: w p# A$ T" I' J - }
6 P' F& Y6 Z) y9 k! u7 r - 5 }& `1 h9 q$ M3 F
- // app/Controllers/Login/ShowIndexPage.php
- n$ W! ^* \( y7 t* x1 ^ - namespace App\Controllers\Login;3 y5 n u% |$ \, N4 T! d, s
- ) K2 |, j( s, O4 L6 O) r+ h
- class ShowIndexPage extends AbstractLoginPage
3 ?. X+ [5 Y, |; a6 o+ q - {
; F- b9 z( n9 i! h - public function show()
8 c: `' }! f3 R$ l# z - {5 C7 t R# ?" x& n0 W; Z
- // 實現登錄頁面顯示邏輯" b; N) r! v3 F; b
- return view('login/index');! _) O- @6 g1 m- p
- }
6 p& Y( [$ V/ u - }
( D3 s# H7 ]3 @* d+ k
複製程式碼 |
|