等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14031 / 14031 生命值:5%
升級
  100%
TA的每日心情 | 慵懶 20 小時前 |
---|
簽到天數: 5654 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
. K( _. k2 \. y( |0 ZAI 就是站長的最佳幫手。; i7 i% m: M1 w8 T! c+ ~6 J! m/ |
" Q% ?) b2 ^- M6 C" B; A4 M
' k& `" }5 J0 P$ B+ |2 X( l這裡的「新架構」是指後端的架構會有大變化
) T m2 D- | O2 C* W但前端的 UI 介面玩家不會感受出來有何不同
" e6 z. ?: L, w, a) R0 ~1 c' p' v5 D' C, D4 m; w6 p% o' a" w3 c
; P, S* C) H& L) M/ n* V1 _
為什麼站長要改成新的獨家架構?
) v6 {; ~$ W; b! Y, H% ~就一樣由AI模型來解釋清楚吧。; @" i/ @1 P" k0 b% e
( d$ F) ~9 A/ H1 [' P+ N
; |7 _3 @3 ]5 S5 F: L1 @
讓我分析一下使用純 PHP 和使用框架的優缺點:$ s& l0 { m7 o+ Y# p7 l. K
純 PHP 的優點:; X4 V3 ^" g! [, G3 ~+ [$ ]( p
1. 性能較好 - 沒有框架的額外開銷
& t2 f0 P: o2 \: Q9 _2. 學習曲線低 - 只需要掌握 PHP 基礎知識
- u5 t7 S, D0 a: K6 c0 e4 P3. 更靈活 - 可以完全按照自己的需求來設計架構) _$ n8 |8 k& m% ~8 z- V1 ~2 ~
4. 代碼量小 - 不包含不需要的功能模組 D2 Y+ V; F5 D! F( r
5. 適合小型項目" h: q5 K- O' o" u" D" V. ~% w
純 PHP 的缺點:0 F% d1 m; X" e( A
1. 需要自己處理很多底層細節1 u. F& d5 }& F6 D
2. 代碼複用性差
* e) F4 w. f1 o- N! b( G3. 缺乏統一的開發規範
9 S! s8 J Z/ K P# n' T4. 安全性需要自行考慮和實現
" R; d4 x. `: z5. 開發效率相對較低; Y( r3 R$ y- t- L% p) m
6. 維護成本高/ o o& J. F: a* Q$ j' o# V! [9 w
使用框架的優點:* w- B8 H* R' a5 z7 ^2 P
1. 開發效率高 - 有現成的元件和工具
' u0 J, a" q9 P( K; `. b1 L2. 有完善的安全機制0 v& @' X: w$ n% L
3. 統一的編碼規範 i+ i: `' A0 a" m# }- X
4. 易於維護2 ^- E6 `! E* r+ |, o0 u* ~
5. 有活躍的社區支持
) b% @1 p* r; q( O0 h* P6. 適合團隊協作
' i Q' i9 S9 S2 o5 y2 r7. 自帶很多常用功能(ORM、緩存等)
) b7 |9 e2 J' e+ k" U使用框架的缺點:
& w. o6 n% x5 t! w: |. \1 F' x1. 性能有一定損耗
4 o1 t7 e( o( _( n2. 學習成本較高
* i3 b0 H' `9 }3. 可能包含很多用不到的功能
7 G J( `+ N$ i! w# W( F4. 不夠靈活,需要遵循框架的規範& R5 a$ h2 ^* n. l3 ?" t \, [: r
5. 對小項目可能顯得過重' H) F D& n+ h( }* p
建議:& L" M3 L, r8 g7 ?# x, j: d
1. 小型項目或學習階段可以使用純 PHP
9 @* D% k L' j/ v2. 中大型專案建議使用框架" `) m5 G% i& t
3. 選擇框架要根據專案需求和團隊情況
1 {* b( r9 C, P9 _4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
x( z' C: z# |您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
0 U; c$ ^/ f; G# |9 v" v% Y: [6 M' _
5 {. k2 K, ~4 y: e
4 o3 {% e9 L, v' b我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。! a! E& J8 [$ R. i' N2 [
+ X# D: K5 x6 p
這個轉換主要做了以下改動:
9 z7 K" A9 G L" P# Z, J6 K8 R; `: C' X, @2 N+ m
路由結構:
- D! I! ]$ N7 Q9 @
" Y$ U) [. a0 w1 N使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
& X2 I, g- N; \" `7 S5 m( c* a支援原有的 page/mode 參數結構0 ^" Y; E- R" m2 U# B
通過路由規則自動匹配到對應的控制器方法" [. v. `6 |! G2 x
/ c+ ]. f; e, `' T0 c' I$ U$ b$ G( U- q5 x: o0 k0 S
控制器結構:0 B1 ?2 v# P9 O5 c0 c5 u
1 y- w& E% w. V8 ^* y6 k
創建了主要的 LoginController 處理所有請求
- {" u1 ^0 \3 q7 A5 S保留了原有的頁面類結構,但改為符合CI4的命名空間規範 j% a: |! O. s9 X
錯誤處理改用CI4的視圖系統1 r( D, i3 \% s1 I# U0 Q
1 o) ~6 d- {, A! n1 r. }% n. u V8 ~& G2 Q c! B: l4 }; I
類的組織:3 b5 r3 g2 n$ P4 ` n
3 u0 z1 ?3 ~: U+ ]# _$ n. y: Q
所有登錄相關的類都放在 App\Controllers\Login 命名空間下7 a- [6 V5 x# o3 V
保持了原有的類繼承結構- p4 x) ]* |* P' a! {
改用CI4的控制器基類和特性: I% a9 i- b1 B) b' g1 j
: H+ B+ I* T2 |/ T$ j
% a e+ i( p, k6 e7 a, K5 c
改進的安全性:8 g; ^% K- U4 r1 H( l/ \1 V& p
4 M0 _# K% E0 V! m1 P使用CI4內置的安全特性1 K3 r9 o% I. h3 m4 z
更嚴格的輸入過濾
5 b3 T) j% \) E5 t( D更好的錯誤處理機制
* S' X$ M0 c$ H# J" A+ {/ J
% b0 Q: r/ P5 l/ O7 O% W& b7 c8 I' B3 s" K8 M9 l" j' g" M* o# T J
/ ]" ?" R5 [8 m9 C要使用這個新結構,你需要:
* G+ K8 Y) |, @
' Z( J+ c6 r, K9 ~8 l+ y7 H# \將這些檔放在對應的CI4目錄結構中' n9 j8 V2 ?* X! _: C5 W
確保創建相應的視圖文件
! H7 i6 N& N2 T6 X配置語言服務+ t4 Q, I5 L/ H# a
根據需要調整模組檢查邏輯
; K% J& Y! i) O4 v3 n( o( N9 o4 x% Q+ u
需要注意的是,你可能還需要:! n1 r* \( B" U$ O0 i' }
* |: e7 X6 W6 K) S0 Z2 V! P
創建相應的視圖檔(在 app/Views/ 目錄下)
- [5 ~7 s; {/ A+ E7 I. N1 `" C' @$ h配置適當的中介軟體來處理會話/ m; [9 P7 ?8 }/ D2 n
實現具體的登錄邏輯! F. s, Y7 _. k
# ~2 M: m( L+ X8 [# J
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?: h6 m7 R; o3 K4 K( l9 u) M
`( P0 @, F" _" r- <?php
# k# {. y+ Z9 W. T4 K4 |* P - // app/Config/Routes.php0 X2 Q9 o6 ]% f9 x* e9 G0 K' c' h# l
- namespace Config;
* H# N$ ^4 x K. P- f% q - 0 L6 `* p W3 w M9 [, Y# |
- $routes = Services::routes();& {$ @+ p0 O" \% X: T4 A# `: n
- 2 S' U$ c8 y1 M2 B
- // 添加自訂路由規則
* l# J$ p e) F: h - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
^8 N* X( w: w% ^! D* n. e - $routes->get('/', 'LoginController::index');$ k( g2 l: O, _3 S( y% E! ~8 t. a
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
; a4 f, Z- Z+ R - // 默認路由處理
2 k& F4 o/ d. K, _ b W2 Y - $routes->get('(:segment)', 'LoginController::handle/$1/show');
* \) T; x$ F& C5 \5 W- _' ]# w - });3 \8 B6 p. X/ M$ E8 `5 s) q( M
- 2 }7 J3 o4 k+ u$ p9 F+ N; x
- // app/Controllers/Login/LoginController.php& k9 i: O. N% C# S! W9 B
- namespace App\Controllers\Login;
; i/ T# u& C1 {' t - , V7 J9 X2 R% e0 c
- use CodeIgniter\Controller;
0 ?% L1 q, k. C - use App\Controllers\Login\AbstractLoginPage;
! D% ~# m# C b
( P7 m1 _( J9 F0 K- class LoginController extends Controller
% [2 E; S8 }' v, p& y - {1 J# S+ B* b7 ^: ]% O
- protected $pageObj;
7 E# U0 B9 ~: o! T+ ?# I - protected $LNG; // 語言物件
4 ^9 N- z/ ?1 q' k - 7 N: D9 [3 F6 Z1 }: J- ?( L1 G6 f
- public function __construct()
+ Z+ L- _/ O5 [/ r - {
: @! o7 b/ M! g1 W6 {8 o - // 載入語言檔和其他必要的依賴& ]6 D2 ~& P% T8 @
- $this->LNG = service('Language'); // 假設你有一個語言服務: X( t" X2 l1 f, d2 I, [
- }
% `( C6 T& }" h* |
' o; }3 p, O( u G8 p9 `) @- public function index()1 G$ `7 |0 H* c" X7 D: w# G
- {
/ W/ R' Y# D2 B% _" J( } N G! ~* N ] - return $this->handle('index', 'show');
, G5 ~! r; J1 ?; {" o* ? - }
! `3 _6 O" k. r+ b
% Q1 L0 k. ~" e' b- public function handle($page = 'index', $mode = 'show')
1 ]% l" w) P" t% @ ]7 T - {
. C# M6 E2 ^! F+ a2 b - // 安全過濾頁面名稱) T5 R1 X# T9 k: T: T$ [& n7 {
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
, x* W, ?! B) P) e% h" u - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
, b r$ L# y9 L7 {: d -
3 {+ G: J5 x2 b o, ~( D - // 檢查類檔是否存在
, H5 x* ^+ I6 g# N- ]; D8 K0 i - if (!class_exists($pageClass)) {2 R4 y3 r5 _7 i2 }
- return $this->showError($this->LNG['page_doesnt_exist']);* y ?2 s& e% J) C5 _2 F
- }
$ t- Y8 M) }5 q" R) T) [+ N X+ A( Y) X
9 N) ]2 u+ _/ g a0 O" n# w- // 產生實體頁面類
) X2 B' T* X; m/ @; g - $this->pageObj = new $pageClass();
- J z+ M: u9 i1 U. x - 8 j7 @& r4 ^0 f5 D
- // 檢查模組要求
4 C% W s4 I5 n2 U- K; ^ - $pageProps = get_class_vars($pageClass);
- ^3 r6 c8 U) M+ P9 R( P( ^ - if (isset($pageProps['requireModule']) &&
+ B' P; z3 n3 X) |# H7 t& W9 o) O6 y - $pageProps['requireModule'] !== 0 &&
4 g) [( ]0 q2 ?, [4 P( a - !$this->isModuleAvailable($pageProps['requireModule'])) {
0 e6 K4 E% g+ t& e - return $this->showError($this->LNG['sys_module_inactive']);
0 d, n/ l# C3 ~( Y7 Q! e - }+ E, G& ?/ Z& O
- ; U) |) }: e9 P& s' G
- // 檢查方法是否可調用% t3 I- I6 i3 l
- if (!is_callable([$this->pageObj, $mode])) {; z7 t7 m1 x( r q( Q" M
- if (!isset($pageProps['defaultController']) || & W3 p) V0 b6 g- V- } |5 ]
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {
( L4 v4 H* D1 V - return $this->showError($this->LNG['page_doesnt_exist']);. \% b, K: c9 S$ W
- }1 E2 I) C; r$ L3 W# @. c
- $mode = $pageProps['defaultController'];9 k( P9 y* B# e; D
- }& ]9 b; S, Y' T. Q z: ~
: o# ]2 T; u: n F- // 調用相應的方法 {% Z& i* {9 L
- return $this->pageObj->$mode();3 Q' _/ q" \ t* { K2 ^. G
- } C" ]; ?+ V8 S/ h
- ' o* f u- q3 E: l# O9 J
- protected function showError($message)
n$ c) g- `5 `% S. j& O, S" f - {
, k g" u* S( @4 `: l( s - return view('errors/custom_error', ['message' => $message]);6 O3 z- S) U, t+ J. v- v4 l
- }
6 C$ ^. X' I9 ^ J" y& F
+ N7 u6 C( t( K+ _9 Z& c- protected function isModuleAvailable($moduleId)
! ], A. [* `% g4 o - {+ w$ s, F) g3 p; c
- // 實現模組可用性檢查邏輯
+ l: r' d1 b4 q4 o4 i - return true; // 根據實際需求修改
% i ]% o c, d5 o/ X. ?$ m5 R - }! n; P5 L2 z, P2 n: C% }2 l
- }8 p7 y: o/ P Z' r5 o, o
- ) K7 r: O$ K. j
- // app/Controllers/Login/AbstractLoginPage.php
! F. U* l) u9 O8 | - namespace App\Controllers\Login;
3 m8 |& z A" y. c - " v7 C1 D0 D/ @# \6 r3 ~1 \+ X: u
- use CodeIgniter\Controller;9 e* C# @) G+ E7 Z
% X/ }# V( o* p/ d# r: s4 m- abstract class AbstractLoginPage extends Controller
7 j' A- M! h6 ~8 E% P - {
# {" H/ C' a) J8 F6 f - // 實現基礎登錄頁面功能
: V: U! e" u O$ r0 i7 N. R' k1 ] - }7 o" J# A7 K, i' ^) ^
0 g- ~: s5 [+ N1 Y8 E- // app/Controllers/Login/ShowErrorPage.php
% N6 N V4 n, F i2 ?/ P" [ - namespace App\Controllers\Login;
( T+ s6 Z" i0 }6 ]
* J% \7 n* B" A) P! i5 _- class ShowErrorPage extends AbstractLoginPage
) {0 p. w4 ]! R0 W1 b1 v: q - {
: I1 a! G( L* P) \ - public static function printError($message)* C* q1 U6 {, |+ E! I1 e- D
- {; T. L9 x ]. w
- $controller = new LoginController();
3 j/ l& l7 e1 G6 \5 H; u - return $controller->showError($message);
" F+ a8 d( _, w: \0 K - }5 |8 z1 H7 Z f
- }8 D0 T' Z3 P$ m
- . \# V6 p9 T% v. {$ x, L
- // app/Controllers/Login/ShowIndexPage.php) m1 X6 Y$ [( g0 y- \9 V
- namespace App\Controllers\Login;
2 Q- O' p' k9 s+ |2 v7 Y - + o/ A5 z# i' s% l- e1 s
- class ShowIndexPage extends AbstractLoginPage
4 J' u5 m" X j% V7 J% E - {
9 _; @( t- K U - public function show()
8 x0 M+ B4 o5 X - {. T4 n9 a! Y6 Q" f, S
- // 實現登錄頁面顯示邏輯
( o% f# `" h! Y1 D: k8 s {/ l# s9 g$ \ - return view('login/index');
4 Z2 a; y7 z( j q; ]% g - }7 X/ U' C& w' I% @& r& J
- }: y: G( K5 H/ U3 o1 B6 O s$ g# V
複製程式碼 |
|