等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14808 / 14808 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 13 小時前 |
|---|
簽到天數: 5899 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致1 Z5 Y; @/ V, J* U
AI 就是站長的最佳幫手。
* o1 `' O' [% u# {, d4 C& Y
; H# F. q$ y( k+ U# p$ y j6 v- e0 z9 @ m. z& x
這裡的「新架構」是指後端的架構會有大變化9 J y7 N# l. N' `* p
但前端的 UI 介面玩家不會感受出來有何不同
# x; g( [5 y& S& C0 Y: ~8 J
; H) P* c9 e2 X. ?% _ [& j- w' O2 ?4 T6 i6 X9 x, Q9 q
為什麼站長要改成新的獨家架構?
* {: J& l& r( V7 `. v' ?就一樣由AI模型來解釋清楚吧。, \! m/ v/ m0 G) m9 B
: q" s8 o7 b% z7 u9 r8 A6 t$ O0 y0 \) ~8 [6 N/ x( v' h2 l
讓我分析一下使用純 PHP 和使用框架的優缺點:- [( V! D/ z D" N! t; I, ^3 R5 C
純 PHP 的優點:
1 l/ t' y; a$ O1. 性能較好 - 沒有框架的額外開銷
: p9 [+ s& c4 N4 ^) R3 T! `2. 學習曲線低 - 只需要掌握 PHP 基礎知識
) k0 ~' f; I8 C. ~1 i3. 更靈活 - 可以完全按照自己的需求來設計架構4 J ?' t8 h* Y1 C* E
4. 代碼量小 - 不包含不需要的功能模組
) S& O" n+ z3 c1 f# C) F- i/ g0 Y( H5. 適合小型項目4 Y; h1 t; e/ M' b
純 PHP 的缺點:, ?1 _6 s, P6 [4 W" r6 Q( ~, ]' ^; F* h. K S
1. 需要自己處理很多底層細節% x& d& [! Q8 @8 |3 y% B4 z/ N }
2. 代碼複用性差% k( n9 I8 z3 k, u6 O, x5 W
3. 缺乏統一的開發規範
$ m7 y0 S5 l. `# C2 f4. 安全性需要自行考慮和實現+ Q5 B/ `5 p5 M; n& D, P, X4 J
5. 開發效率相對較低5 f( |" ~4 E1 l; G& S' |& U4 v
6. 維護成本高; { M: x: e4 M! T& J4 j
使用框架的優點:2 K5 _# n5 F# `* F I% b: T
1. 開發效率高 - 有現成的元件和工具0 `5 S1 E* ^ O3 p. k) T [; N( s3 A
2. 有完善的安全機制; t" l) C3 Y$ [# b9 U% m: B
3. 統一的編碼規範8 W- i- O3 |% A2 J9 f
4. 易於維護$ C2 l% D, K: j. X f/ P8 X
5. 有活躍的社區支持2 ?6 p x$ N2 N8 b
6. 適合團隊協作
" S+ X- D, h; `2 _! A) O7 n7. 自帶很多常用功能(ORM、緩存等), t: O8 i, J* a3 U7 W- U4 {6 C
使用框架的缺點:
& J k& Q4 \1 M$ y& l( A+ Q1. 性能有一定損耗
& _; z2 u2 c& c2. 學習成本較高/ N, B$ @! O* e) @$ Q* U' t6 e# {
3. 可能包含很多用不到的功能% L& }8 q, k+ u! z' B0 C% A; n1 F
4. 不夠靈活,需要遵循框架的規範 y% ~# E" Z l7 u5 |/ O
5. 對小項目可能顯得過重
( [: P- e% T. I% {4 l& d建議:7 K" @2 b, Q- F" [% W" [
1. 小型項目或學習階段可以使用純 PHP
( d$ Z# H3 k$ O2. 中大型專案建議使用框架
B4 Q$ S5 r; a @# ]3. 選擇框架要根據專案需求和團隊情況
3 X. S; ]3 E& f. I( p7 s4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
3 R ^. r! X5 w$ ?" e您打算開發什麼類型的專案?這樣我可以給出更具體的建議。, p7 X0 {9 u, E' ?7 \6 s6 b
: Z5 |; U( q7 a5 K# e% j
# n3 d# M5 Y; o, [2 R& O$ w, t! r' l+ J2 b* j1 N3 e0 B0 I
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。1 s3 t) C. ^# X) Z8 |
+ O- t: L, G9 N1 F3 |
這個轉換主要做了以下改動:1 q7 s- U7 O9 _. _6 d
C$ s5 b0 |; z d# w
路由結構:- y7 X5 ?* a. o$ r: G: P
; p3 z. I1 [9 K" |使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下- u2 w3 @2 ~, J' ~
支援原有的 page/mode 參數結構# I( S$ @( r; o" @! K' O
通過路由規則自動匹配到對應的控制器方法
M: H6 u9 `. S7 D. G: |# B, \* g9 [+ u8 }# Y
) U2 `- d# P5 b( G1 b控制器結構:
+ B' ]: w8 _7 U$ I. ?, c" ]* G5 v+ y: ^9 u: B/ s j# ?3 m
創建了主要的 LoginController 處理所有請求
7 }+ V$ o9 {+ B9 m; }7 r5 m. `) w保留了原有的頁面類結構,但改為符合CI4的命名空間規範
2 o' D* t, u4 V# e. p0 E# X8 A% {7 @錯誤處理改用CI4的視圖系統6 G% a0 w$ X% p' f; l' w; o* @% n
+ B9 r& @2 m0 {+ r; U
7 E# d; X) X, V- D! D8 n類的組織:" c1 M+ |! l- Y; e2 {
) T8 ^, U) h* _) e+ W2 R
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
7 v( _- j% h" {2 Q2 n1 L3 i( [保持了原有的類繼承結構
* W/ q5 m9 @3 g0 t G改用CI4的控制器基類和特性
* f: h) t, ]7 @9 U( @, L3 L- q! r3 l6 r& g0 c. V) p* Y
. g8 w7 t* y4 J" {7 q) C改進的安全性:
' F$ H: j9 R# ]: S: |7 R5 s- n* f1 |$ u7 @, l% n
使用CI4內置的安全特性: K- ], ^7 i' l: p
更嚴格的輸入過濾
. @6 @1 `4 i1 v# e1 M+ B更好的錯誤處理機制
, ~7 u5 Z. c; x, b' m; g7 B+ r6 k, r- h
* b3 B# m3 C' S3 }( W' B
8 [) g( }4 C! M0 [* D( C) S要使用這個新結構,你需要:2 b! @$ j- R; K/ i8 L; [7 K
0 @3 M1 ]9 R" K* ]2 V
將這些檔放在對應的CI4目錄結構中
# y' Z( t/ G5 }/ }" U確保創建相應的視圖文件
+ K; Y2 e) A" B; d( p8 ?% {配置語言服務
2 u5 W( o w! e: g: n' a, R9 X根據需要調整模組檢查邏輯 ]/ C, |7 T3 D( |! \* D
, c0 H& M5 R/ R3 L
需要注意的是,你可能還需要:
9 ^6 P$ o$ v* Q3 n- R/ }3 g. @. s+ B
+ O: r. y' s2 ~; k# `創建相應的視圖檔(在 app/Views/ 目錄下)
" F6 O: T2 R+ p8 a配置適當的中介軟體來處理會話
9 j2 f/ V5 s2 w7 u實現具體的登錄邏輯7 |$ V2 c, O: X9 l5 Z
/ D! a( L7 c6 T4 a" ?( O5 [
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?4 i( x& F- o' q5 I8 n
: ~: G o; q! _
- <?php* ^, Q& ]* Z7 ?: W! o6 R$ |2 l
- // app/Config/Routes.php
' k% k( [) h; D8 ~$ {+ T - namespace Config;& o4 Z$ Y m, P& A
- ) S- R5 Q3 i& S; P+ R
- $routes = Services::routes();
: L/ V( y- I5 |% i' h; e8 i - " U q, {) n8 P. n$ D L7 D/ o
- // 添加自訂路由規則. t% W6 l8 I' U. G4 o2 m+ S" ?
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 O8 u e* G( Q/ a E
- $routes->get('/', 'LoginController::index');8 j- J# d1 c! T4 N3 g/ I6 f
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');! q5 B0 M+ p' ~ g, D7 q
- // 默認路由處理& n( Y6 t) R. J+ V' U" S# m. l
- $routes->get('(:segment)', 'LoginController::handle/$1/show');. Y9 ^) Y4 x' J" t+ o! |
- });
) i! B( Q8 @8 ^7 {! k! K - + @' T6 p" |6 ]/ \" h8 g0 n- X
- // app/Controllers/Login/LoginController.php& k9 j+ R# J" n3 D& E4 z* v$ a% z* ?3 g
- namespace App\Controllers\Login;: R' e- F! E9 n4 {1 d
- 6 I5 Z$ s; {1 a$ I
- use CodeIgniter\Controller;
) s& H. x; w4 x. o! T) w - use App\Controllers\Login\AbstractLoginPage;: k4 W7 G6 O: z3 t/ k, E
- 1 N( w/ p7 e" {9 Z' G! v
- class LoginController extends Controller% n3 j3 T/ @5 {* A
- {1 Y) v2 c5 z9 x- w7 u: P$ b
- protected $pageObj;$ t- v; x! w) Q; m5 C
- protected $LNG; // 語言物件
. ?$ S, u1 `' x ^
% M' Z/ }& F/ v* ]0 o5 c9 s0 k- public function __construct()
, y0 m$ B9 ?- Z' A! Z; I - {
& U3 R* V6 q. `4 E! j7 N - // 載入語言檔和其他必要的依賴
6 z1 `" K, ^9 N# Q7 ]0 S, }) \+ y - $this->LNG = service('Language'); // 假設你有一個語言服務7 @3 j# e1 _# h, T. f
- }( }; }; q+ K+ k
- 8 w F/ B# X6 E, [9 a. [# o4 N
- public function index()
X* W; k* c1 U4 d8 X - {
+ C* o/ u) k" N7 H - return $this->handle('index', 'show'); g7 }5 ]5 `: ?5 c! f
- }) z* X' _3 B8 F6 E; S, V! N0 a
- ! L: n8 Z) V6 b/ ]/ W+ z& Y; Y* Z
- public function handle($page = 'index', $mode = 'show') q8 X: C o8 A: u j9 w- ^
- {. m# F' x7 ?; W& ?
- // 安全過濾頁面名稱* ^# f3 A$ \8 S3 d4 t, K
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
: R, b4 F7 v( Q5 t - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
0 G9 \3 F* ~4 d! ~) W! R) {8 t, z - 2 ]3 c1 Y1 H" O: @2 o
- // 檢查類檔是否存在
7 f& U# w: H+ U9 t% x - if (!class_exists($pageClass)) {
6 A, Z3 s) p4 w2 R L - return $this->showError($this->LNG['page_doesnt_exist']);. m( d5 @. Q: [) _* V
- }
q7 t- h* T4 v; }8 @% R4 K$ I% J1 { - 2 ?9 c1 o; L# h7 R/ v
- // 產生實體頁面類
$ Q4 D" U7 f3 Q3 [6 x% m - $this->pageObj = new $pageClass();0 K( @; |$ _( ^- s% k
- : W. l3 @. ~- h( \/ ~: S q3 j/ |
- // 檢查模組要求
& l% q7 L8 Y' ~2 p - $pageProps = get_class_vars($pageClass);
# ^1 H. P9 w; z6 q% v" q - if (isset($pageProps['requireModule']) &&
: v4 j9 b# f! V( |# [* s* y - $pageProps['requireModule'] !== 0 &&
4 S5 J/ L/ P& P+ E- ^2 J$ ^, { - !$this->isModuleAvailable($pageProps['requireModule'])) {1 J* i/ {0 D' [
- return $this->showError($this->LNG['sys_module_inactive']);
" e9 c( |5 Z; v: X/ }" O. a - }
+ W% Z. |0 a( n. U - 5 e; Y: @7 U% p6 ^7 a5 e: s, S
- // 檢查方法是否可調用
0 P( i A3 K- B - if (!is_callable([$this->pageObj, $mode])) { L: U# R; n2 u; n. P" F3 v
- if (!isset($pageProps['defaultController']) ||
: m! W/ g+ e! i5 e - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
( w) ^2 }) x5 ~7 J - return $this->showError($this->LNG['page_doesnt_exist']);
! U" r/ s1 u& @" H& P - } v8 C* b) `$ D: h( ?$ T
- $mode = $pageProps['defaultController'];' h+ J0 W& ]' e! w
- }
7 v5 T$ F, g5 D/ f- h - 6 c8 S. t$ r+ D/ H
- // 調用相應的方法
; K) G W: j" O! a2 g: J& t - return $this->pageObj->$mode();
% C0 d5 \* F0 N6 F - }5 L/ ?6 J) Y) ^1 J. p( I
9 R/ x6 u# {3 y: ` R( d$ ?- protected function showError($message). H: @! x+ o+ I
- {
: Z, l, k" Y9 U; L) m - return view('errors/custom_error', ['message' => $message]);
o Y0 u- l5 B( O* g! f/ @% I - }
$ J( ] s( J; n1 ?# n+ ?
! O$ g8 K% v. Y4 W. f' c$ t3 W- protected function isModuleAvailable($moduleId)
9 ^0 a, v/ c3 _, O& B& R8 i# a - {
: q0 J6 w# x3 V& I6 G - // 實現模組可用性檢查邏輯; Q5 I. g, n' t @
- return true; // 根據實際需求修改+ i5 d7 e7 H2 T+ y2 D7 b" `+ u
- }5 e( X* C! E. N* v" `/ H9 G& e: S
- }
+ G5 q0 l. ~* s
% e7 ~8 T7 O/ \; Y* d* w" F# s- // app/Controllers/Login/AbstractLoginPage.php7 x" K4 S2 e% F( i( C1 t
- namespace App\Controllers\Login;! d& ]' g0 E) ]! G" i
! `* T7 \: }6 X' x- use CodeIgniter\Controller;
' y/ G) K. g2 _ - 1 n. V c7 x, _
- abstract class AbstractLoginPage extends Controller
; Y. O m( w5 v0 k" A$ h* z$ W$ X% ? - {
2 M+ X7 A0 a8 m5 j2 F5 ] - // 實現基礎登錄頁面功能
9 l3 Z q* E) ]+ }* R3 g - }# J" y7 s/ G6 q3 U1 i3 i
- 0 W6 P) [$ n8 M7 f' m5 j
- // app/Controllers/Login/ShowErrorPage.php
( [* P7 [. e- C {3 z" f - namespace App\Controllers\Login;
) E0 E' N2 P8 _/ C, ^7 G
. v3 n/ x$ E6 P# q) B7 C( m- class ShowErrorPage extends AbstractLoginPage, s; @ D5 ~$ Y
- {# X5 A) Z0 y3 _0 [7 x
- public static function printError($message)
7 ?1 D9 s' x, O8 l' R( C" ]& {& Y# ]/ Y - {
% s! d4 t1 v4 T( n - $controller = new LoginController();$ o5 k$ }) s+ g/ Y
- return $controller->showError($message);
8 w8 c# \0 z7 Z; {1 B' G* F3 b- G - }
0 U4 I; r. K9 ?! h3 j2 m - }* [9 x$ Y/ b* J& x4 J( J
/ b8 f) d8 }9 W/ s3 A- // app/Controllers/Login/ShowIndexPage.php
, |( }( k1 ?' B7 j6 L - namespace App\Controllers\Login;
* N8 {) f/ M. s& B ^ - 7 _" P" W+ j* D+ t' X8 @7 s
- class ShowIndexPage extends AbstractLoginPage
% o5 v, [* n% |% W5 k - {7 ~) ]1 m+ U0 g# x- m
- public function show()
# @: M7 Y4 B$ N - {& b3 i" O* }! }
- // 實現登錄頁面顯示邏輯8 K, M& J6 S1 o+ l; K
- return view('login/index');
7 w# U+ x7 m, A. {( V- q5 ~ - }4 a2 C* m- t- |% Z+ n+ N7 n
- }
3 E& }. _8 K K5 {. W$ e
複製程式碼 |
|