等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14547 / 14547 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 昨天 00:27 |
|---|
簽到天數: 5839 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
6 b$ c$ C* T* i9 \- o+ A) hAI 就是站長的最佳幫手。3 b4 d. }' A3 h }$ }" A
' w, W- f- H6 q% B; P/ w. ~& W* Y: L, l" c6 ]7 F+ M
這裡的「新架構」是指後端的架構會有大變化, D, _; c. o, z
但前端的 UI 介面玩家不會感受出來有何不同% o4 e6 \2 s3 ^/ |, a. K
4 p' L+ Y9 o% w+ p
/ w# N/ A1 V, o. K* A為什麼站長要改成新的獨家架構?
: h3 K p. F" ~0 n就一樣由AI模型來解釋清楚吧。9 [ y0 Z% K; w# x
) r3 R* f" z |' E j
/ J& Z1 E! E: [6 v讓我分析一下使用純 PHP 和使用框架的優缺點:( ~) R- L! m3 }9 L6 r4 W
純 PHP 的優點:
* s( S' F7 f% K1. 性能較好 - 沒有框架的額外開銷, K$ z* Z# x$ h# @; R' c, b- l. I
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
9 j9 P$ B: c, X% ^6 {* n: W3. 更靈活 - 可以完全按照自己的需求來設計架構9 R7 }/ t8 d6 I) d6 p
4. 代碼量小 - 不包含不需要的功能模組
( q C; x: y/ O+ Y( [ c. z5. 適合小型項目: ^1 H$ ]. E. m1 i% b2 Q
純 PHP 的缺點:
0 H6 ], I! k) ?8 Z$ }; w9 F1. 需要自己處理很多底層細節9 \& o3 y; m! C' }/ X+ M
2. 代碼複用性差
/ R6 ]3 m) k" F3. 缺乏統一的開發規範! k0 R1 [# T+ J- M2 ^7 o
4. 安全性需要自行考慮和實現" M9 {) U: q/ H: E, M ~/ t
5. 開發效率相對較低" a- d( Y0 }, k6 @
6. 維護成本高
) G0 S5 R/ o% ?( `* W9 H4 R使用框架的優點:
0 s" \8 j% i" {3 Y j1. 開發效率高 - 有現成的元件和工具& ~5 G/ S; r2 {" h0 O3 j; F
2. 有完善的安全機制
: G4 Q/ \6 T& m5 }0 n) ^6 }( Q3. 統一的編碼規範* j2 R" G. G! O) C! p
4. 易於維護1 p. g* E! R" z5 u8 u
5. 有活躍的社區支持$ o) n6 u# c, y( [* `5 P) ^- f( H
6. 適合團隊協作: x+ k( y* L) E* X7 F; z! {
7. 自帶很多常用功能(ORM、緩存等)7 ?$ N. y6 [: x+ ?9 v
使用框架的缺點:7 d: s8 B* k4 @& Y: t; _" s4 X1 C/ j
1. 性能有一定損耗
9 L1 |" z! Y3 w, w- ]2 j2. 學習成本較高/ ]+ | y/ M* P/ W" c! U
3. 可能包含很多用不到的功能* T+ b& {0 [4 \$ d
4. 不夠靈活,需要遵循框架的規範" R; V! f3 y9 O
5. 對小項目可能顯得過重: c6 u z; z x, v1 D/ K9 c3 p
建議:
, r% P( t1 e$ x$ g( p. K( Y1. 小型項目或學習階段可以使用純 PHP
5 L: ^6 G6 s7 I4 M2. 中大型專案建議使用框架
+ h* o; {3 K/ r' Q" ~3. 選擇框架要根據專案需求和團隊情況
# o1 T9 }6 U' e8 F5 U( V) Y4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇) M7 [- I! w/ y2 e& ]
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
4 f0 i( y v4 }0 v9 a: [8 E! ^, w4 t, p9 ]# W% J$ k }
) ?) c5 s: p+ R2 E4 t4 B2 S5 f5 r
! ]' r) K, I, C3 @" J我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
* _ ^" k# x0 {% \* K$ s7 r9 W2 u% l' T! ]8 I% m2 m6 C
這個轉換主要做了以下改動:1 `$ p7 @2 w/ T% N, U) C; I1 i
A3 |! ~! Y0 H. j3 J. U! X
路由結構:
* H$ g5 e: K* h# a m2 g9 E
3 N: P& R3 l Y# x使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
1 @' b$ |+ Z+ k/ D( u支援原有的 page/mode 參數結構
2 e! l- ?( l; M# k; i' X7 d6 S通過路由規則自動匹配到對應的控制器方法; @( w& A4 }1 n" J4 Z
& r1 G2 L3 t& C1 J* b+ T
- b' r) i/ N1 f* v# n控制器結構:
0 x. L2 j$ Q2 Q% q: D
- |+ C5 n1 A+ C5 E創建了主要的 LoginController 處理所有請求
Q. v4 I$ y: J" Q, c( T: n保留了原有的頁面類結構,但改為符合CI4的命名空間規範
9 c9 n& F9 U1 ^8 X錯誤處理改用CI4的視圖系統, V8 J- |: g4 b9 h: M2 @
- `% o5 c0 U$ i# B+ ?
; K* a8 o' E8 K! r: @8 z! d1 {; n7 n# M類的組織:
2 ~" \5 S0 c4 g
, c' E6 v1 a3 X% c0 u6 |所有登錄相關的類都放在 App\Controllers\Login 命名空間下4 O8 h H# P/ M% ^$ s) Q
保持了原有的類繼承結構' x( p2 j' `( H2 b! U) G- a% c, @
改用CI4的控制器基類和特性
* ^* ^7 s" \5 V; Y
% U' t' W0 |+ j3 r
/ ~) r) c0 ?" i* Y' [6 f& V2 ^7 V改進的安全性:
6 f F9 ~& g; o# b, V) k/ g2 w# l! v7 f9 G$ c
使用CI4內置的安全特性
: X7 _7 ]& v1 G更嚴格的輸入過濾
0 B' p( Z' }, q/ K; j更好的錯誤處理機制6 m) C' H" I, C6 o, t
, t; p& ]* z1 g" T1 o
5 \6 @, R- W3 a$ @
' M) E" y. m! }8 |3 E- k1 M8 g, z要使用這個新結構,你需要:
9 o t$ f' N; g6 J8 t3 d9 X: K7 B- c3 j8 L) q8 i5 W$ M
將這些檔放在對應的CI4目錄結構中3 @+ d( M) f# p, o) w4 P
確保創建相應的視圖文件
7 e# `0 \5 `9 @. j$ h配置語言服務
$ q2 N1 z9 \' n$ E9 D根據需要調整模組檢查邏輯
6 x, x3 H9 n0 P- l5 n2 ~
2 d8 e9 b+ Y- Z' r需要注意的是,你可能還需要:* Y! `1 l* N1 Y) L( V( R8 @
3 `* X( X6 f: v創建相應的視圖檔(在 app/Views/ 目錄下)7 K! M7 Z G w! H
配置適當的中介軟體來處理會話
3 M) c- q6 }7 r% V實現具體的登錄邏輯8 {8 |3 h6 ~2 K
- ?) B6 }, E" L3 F$ n
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
5 A4 q/ t7 p7 E1 i! |5 p8 F1 }, o
/ M" S0 E' t {6 e/ ?& u- <?php
& i0 a* a5 o7 q. [ - // app/Config/Routes.php5 s0 Q9 S& V; J8 Y8 g- ^/ n, ]. P# B
- namespace Config;
9 ?& c5 W+ t+ j: M! L - % c. V! B# H5 t0 A8 z& n
- $routes = Services::routes();/ V u: f, J6 b' W( C. W
6 E9 ~/ m; D7 H- // 添加自訂路由規則
- M' G) \+ p! k( K- P - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
% }& |; y6 J/ @: C' { - $routes->get('/', 'LoginController::index');1 e9 t5 `" ~' i9 q* r: e* x3 w
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');+ W, Y- S! `, S' \: s2 u1 j5 S6 I
- // 默認路由處理4 e, g* g* g1 q8 x# n' \
- $routes->get('(:segment)', 'LoginController::handle/$1/show');; s1 J' n- f4 B( T+ I% w5 f' z8 z& }
- });9 e* Y( X( X7 I1 T. A1 U+ p
- - ?- F: w- a, Z8 N4 `: k; M
- // app/Controllers/Login/LoginController.php
, [; `* h% H4 B' Q9 g! L# H - namespace App\Controllers\Login;8 y2 D/ e! O. B- h; K3 f
) l. J$ T9 W! H: X- A- use CodeIgniter\Controller;% f/ D+ I x) c
- use App\Controllers\Login\AbstractLoginPage;4 r8 L7 ~& Q' ^4 S5 c! q
- & J) |; O0 p) s6 j: F% L9 x, R
- class LoginController extends Controller( o& U& h) Y2 w) q: _ M" r
- {
' N& r- x# W! i5 l - protected $pageObj;$ v7 s$ U5 X# y' Y% ^6 q# W* z6 U/ h
- protected $LNG; // 語言物件; ~2 Y$ z, v% m3 @. k( R) y% o
- ; J; H; M6 h# @$ T c
- public function __construct()
" a$ b9 T2 K4 e6 N3 x3 i# d - {
; p" Y H( _, P6 } T - // 載入語言檔和其他必要的依賴; e, l; O2 x" E: d
- $this->LNG = service('Language'); // 假設你有一個語言服務) W) l# l) G" q" w/ w. {9 S
- }
+ m; m) L5 ]7 P- B/ S8 Y - 4 x5 J9 n8 k$ a
- public function index()
2 X3 d% L/ e9 Y8 `% W* N5 q - {- ]& ?' Z6 y% `7 I" J2 N$ k
- return $this->handle('index', 'show');6 m2 e. |' G3 k4 }2 t N7 K/ I
- }9 _% H2 K; C1 C: w% C
/ ~5 A( E, z4 _6 X# P! \3 R- public function handle($page = 'index', $mode = 'show')
; t$ {2 o& z8 K* D4 ^7 W# ~ - {
7 `* B* k1 h) z7 c# u( n - // 安全過濾頁面名稱) d3 P- o# m# j, e ^
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);( r. o9 c! t" S7 G6 ?+ |" O
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';5 A+ F7 x |0 x8 L- `# ~9 \
-
]3 F- o' h& w8 h% F# E( X& r0 k - // 檢查類檔是否存在
+ f6 m. O$ r+ B5 T - if (!class_exists($pageClass)) {) G z4 d4 E7 D- @* \/ x2 a! {
- return $this->showError($this->LNG['page_doesnt_exist']); n- i) q% k7 m7 O
- }
" M7 O1 E: G6 F2 g2 d( Y
+ W+ O3 T8 o7 U- // 產生實體頁面類
3 l( j* R$ K5 e- e) |0 n' O - $this->pageObj = new $pageClass();
4 O# A3 q% h! P" G6 `4 D - : L2 V6 D C. f, G! f
- // 檢查模組要求; K+ I" s' d9 v$ H" H F$ s' h" d1 s0 K7 i
- $pageProps = get_class_vars($pageClass);- r3 @, X1 E: |% Z2 B$ N$ e
- if (isset($pageProps['requireModule']) && 8 F1 s3 N- S6 Z
- $pageProps['requireModule'] !== 0 && 6 A1 _, G+ y. r7 T0 n
- !$this->isModuleAvailable($pageProps['requireModule'])) {
' d. t4 Y+ o$ X* c - return $this->showError($this->LNG['sys_module_inactive']);
, X% H0 l2 P' z. u( ?$ ] - }
+ v; K ~0 {/ u5 J - 4 u: A/ p+ t9 N& u) @. Z
- // 檢查方法是否可調用. }& W% `# B q; ]2 @
- if (!is_callable([$this->pageObj, $mode])) {* Y% I# t/ n8 Q& ^* y
- if (!isset($pageProps['defaultController']) || 5 h h. ^ j) M# k: i3 h
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {
7 A7 u: y2 }- P - return $this->showError($this->LNG['page_doesnt_exist']);: I" O) B/ M' G- i0 m1 k
- }' w) F# c1 ~, G {
- $mode = $pageProps['defaultController'];
3 r4 s9 }0 G$ V+ v" ~+ ], n - } A! m3 g5 F; ?: `$ r
3 ?) [9 A& O, h- // 調用相應的方法- G1 R3 _1 Q2 {+ B* q
- return $this->pageObj->$mode();
2 s0 s/ A! V7 t$ a' T - }8 d0 e8 q& P6 B, ]( B& q
- - |7 s9 B% _) \/ [7 \0 c( D5 r6 o' M
- protected function showError($message)
. I& R9 u( P% P9 L" P# i - {
1 p% j* }, h3 O( R2 D7 l - return view('errors/custom_error', ['message' => $message]);% w! I. X. N6 H0 g& }
- }- e2 v6 f, D9 k- V8 v: [5 H6 m
- 2 R% \: q( J" A# X
- protected function isModuleAvailable($moduleId)% h- Q: @4 \$ F, a+ y+ G
- {
' L8 O$ T/ O0 ?9 o* H. X7 M - // 實現模組可用性檢查邏輯
* E/ ]4 |5 }) d, d3 s - return true; // 根據實際需求修改, u) P) G. f; l; D5 T; s7 {
- }6 o! f0 _2 N1 R/ f- n' g$ q, T4 N
- }( h/ k3 p- Q1 Z+ l) W; M" w1 O
- # C+ }9 L+ Z1 e3 t# [+ f- D
- // app/Controllers/Login/AbstractLoginPage.php! O4 n) {1 i" Z
- namespace App\Controllers\Login;
- }0 r5 G* b* q% R - ( P2 U. e7 _- N3 |" V" L& F5 n) J& _
- use CodeIgniter\Controller;4 ~& \# _# {2 Z; |
7 x0 F) W% j# L- b1 D/ ^- abstract class AbstractLoginPage extends Controller
( k% o' l/ O1 n+ J) U9 f - {
, l {8 b) E' T6 |/ w. ^$ f/ u - // 實現基礎登錄頁面功能- ^0 i' W, t6 |1 ^# P
- }
, }2 q0 C! a9 W- w5 n
H& O7 f; `4 d& L. o. z- // app/Controllers/Login/ShowErrorPage.php1 C9 j1 [7 Y/ d. |. @ b
- namespace App\Controllers\Login;: z& Z8 \) o/ Y" S4 f
2 O- V" ^2 ?6 J, k; M; ?- class ShowErrorPage extends AbstractLoginPage
: {* h1 P" E, d6 r - {
& _5 q' u/ v6 K( p2 B3 G: N - public static function printError($message). K4 k1 q) g0 k8 l* i: @
- {9 J' G; l M& I# H1 W+ {
- $controller = new LoginController();
% w/ u# F- M. q: k) d - return $controller->showError($message);) P- n. J2 z8 P/ p/ b/ ]( Z
- }; z! k# ]6 I: y+ B1 ?
- }
% g% P* S/ t! ~( o$ _
, Y7 z) o3 J! g4 Z9 C. n- // app/Controllers/Login/ShowIndexPage.php3 n+ ~5 w. I$ W, j- x7 }
- namespace App\Controllers\Login;1 B, X( a( R7 g- ?* k4 N' U
( ?' y5 S5 }( f- class ShowIndexPage extends AbstractLoginPage" K* N: Y ~4 P
- {
/ e3 _6 z: q. M# u% m5 q% P - public function show()4 K' d8 r* y) K0 e# a" k5 X, r1 F# S
- {8 {* k: y! @6 c4 X' S/ f! v& L
- // 實現登錄頁面顯示邏輯
9 C5 i& ^7 o8 B8 `5 m( }' U - return view('login/index');/ J9 \1 W" h' n" G4 G
- }
) q. V8 L& [- M% ?6 w* s+ } - }
1 q# z9 F. P, f
複製程式碼 |
|