等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14626 / 14626 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 2 小時前 |
|---|
簽到天數: 5851 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
+ v# e4 a1 V# a2 p: W( F, bAI 就是站長的最佳幫手。
- \1 C: }9 S- I9 x. _" n
+ d' D7 k: g1 ^0 H$ q9 Q+ ^8 `& Y9 b
這裡的「新架構」是指後端的架構會有大變化' J; }7 {) X( k; s
但前端的 UI 介面玩家不會感受出來有何不同8 `% j* a! {) g4 w4 k1 ~0 H
5 m# w$ U% {- J# O" M& W
6 \+ _: Z3 F9 s為什麼站長要改成新的獨家架構?
* h9 ]' z5 Q' q就一樣由AI模型來解釋清楚吧。: k3 V t/ m9 d0 V8 K* d7 B2 Q4 L
( w: y! L. E) v3 b8 m6 r0 L2 ^- x! R4 q- ^" f/ j/ [! J2 o$ p
讓我分析一下使用純 PHP 和使用框架的優缺點:; O3 D, p [1 o5 o# T8 w* Q9 O$ o& _
純 PHP 的優點:# b# J) }! d( ?* y3 d5 v6 u9 J, o4 Z
1. 性能較好 - 沒有框架的額外開銷4 E' t) M& _3 ]
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
$ x+ N$ B8 X/ U& ~1 ~3. 更靈活 - 可以完全按照自己的需求來設計架構5 f f" v3 Y. j; G
4. 代碼量小 - 不包含不需要的功能模組; [0 C( [6 ]; @( _4 g
5. 適合小型項目
/ z% P1 ^: x" O6 q8 |純 PHP 的缺點:
; t. T1 L' ? s9 d0 H( T8 h1. 需要自己處理很多底層細節
8 b- r# s) T8 q+ R/ T2. 代碼複用性差
, h G7 G( `* d3. 缺乏統一的開發規範
, L8 f- x! j9 q0 m0 \4 s4. 安全性需要自行考慮和實現
7 U" r3 F" z3 n+ W6 o9 v5. 開發效率相對較低( A! O! ?6 L' E; @$ A
6. 維護成本高
q- i& C6 L! r" ~/ [使用框架的優點:2 M$ Y7 u; ?3 k9 w
1. 開發效率高 - 有現成的元件和工具
7 B# S; g3 F" F7 `# b1 D2. 有完善的安全機制, @& ? P2 k+ A' P v' ^
3. 統一的編碼規範
3 @) X6 q8 @- X) l& {4. 易於維護) k) I( Q9 q) Y- s: |' H/ Y
5. 有活躍的社區支持
$ t3 {# m- _+ q% C' J6. 適合團隊協作$ d, o. h0 r L- A' m
7. 自帶很多常用功能(ORM、緩存等)
% E: ]$ G- E. n使用框架的缺點:
- B* l5 ?" R1 r6 S$ _ m" l1. 性能有一定損耗
- U" [; B5 o( U2. 學習成本較高# b" x# P7 \" x* ]4 H
3. 可能包含很多用不到的功能
$ y' W O, c, m3 l9 _( x/ m9 v4. 不夠靈活,需要遵循框架的規範' _% H5 l9 T& c# B% V# _
5. 對小項目可能顯得過重
. {7 S5 L, M7 d8 q- D* {# Q8 ?建議:( Z6 W! Y' ], M+ Q- j; R. @
1. 小型項目或學習階段可以使用純 PHP! p& R/ Z* K7 q3 J _, x
2. 中大型專案建議使用框架
5 S7 j s/ K+ S2 _3. 選擇框架要根據專案需求和團隊情況8 w8 S! Q$ Q- l4 R( Y$ G
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇: w# s' ]$ L, P4 A
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。4 X& O, M9 n; x4 f( o
- K* X t* _9 \- l; ?0 d
- J! I' I3 f- p- Q9 ]& O8 v" y. R: {& Y' X$ T8 ]7 E3 t& O
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。, S: @5 |# `, |& M' O7 `: R
' i: D& Q. D4 l5 Z' y* u這個轉換主要做了以下改動:% n7 ]) ~/ t$ `) G+ J2 d. K2 [6 S# O
3 f9 A$ y1 |) B7 Y. }% `
路由結構:5 H" }% F# w5 C8 ]0 g
: Q- R& [+ q; e& ^/ K. v: Q使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
7 d( q+ W& i0 M0 U8 e支援原有的 page/mode 參數結構1 S3 K Z6 M. ?5 n# s
通過路由規則自動匹配到對應的控制器方法
0 [" W* Y1 ~% c/ T0 H( U1 E: X. m: Z0 W& [# Q
6 \$ E) G. o z6 ~4 ~# E
控制器結構:
; ` z8 T: N( T! \' w, F- G8 N# w2 J* P) |" T" X
創建了主要的 LoginController 處理所有請求
{3 n% a4 { u5 X; ~. F& i保留了原有的頁面類結構,但改為符合CI4的命名空間規範
4 I$ ]. j6 h5 o$ f" G" @ U錯誤處理改用CI4的視圖系統
; N& T4 a3 Q; g% l# J# ~! R. p
/ Y/ t0 k7 K3 @5 w! R; E0 ]2 A$ L$ J) x" p) O! h# ]% c
類的組織:
8 B& m1 x9 U- X' d/ ]) F- C& o+ W' R
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
6 y7 e/ x/ n+ [. j保持了原有的類繼承結構' H1 M, R" d$ _' Y) ~* z8 z
改用CI4的控制器基類和特性6 a) ]' {3 b' ^ w
; ?! ?* b# V- Z G9 r) X6 o
' @% v2 k3 X! z; L4 p! s1 @改進的安全性:
- ]' @! h% B' Z& L
2 `) k0 l6 C! y3 P, @# O; V6 a使用CI4內置的安全特性( b- H6 e- n% a
更嚴格的輸入過濾
+ z3 u( N, l% B, c! d" M: k( G更好的錯誤處理機制& ?' p) @/ f( [0 r
, R- u* C% a' d! ]9 S$ P, f6 ~& j0 a) x, `' ~/ U
! Q, l8 q9 J1 x4 y要使用這個新結構,你需要:
. y- A( c/ J7 p' \% q2 Z+ r' C, e: }& t; _
將這些檔放在對應的CI4目錄結構中
; @0 r1 v6 _* S$ S確保創建相應的視圖文件" `1 {* `8 Y* X0 y
配置語言服務7 z: c: y: L# q0 x: f2 ^6 b
根據需要調整模組檢查邏輯
+ ]1 W. y8 }0 o
7 A. F4 u5 n1 B( y8 U$ V- v7 u2 L需要注意的是,你可能還需要:
) ?$ F( O8 y0 q( Q3 A- R- F' X8 e
% L Y- l+ k5 S2 J! i# b& W9 q創建相應的視圖檔(在 app/Views/ 目錄下)6 y$ o1 @% n' m; I: Z+ Q0 M
配置適當的中介軟體來處理會話
9 t/ @; ^; M; r0 G: h實現具體的登錄邏輯4 }( N( k# @. B: O& ^
$ {3 z: E# O7 R4 Y: u- @2 J
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
; r3 K' R# o# A$ L$ h% b0 A* T9 X
- <?php
1 p/ O& X$ i/ s- | - // app/Config/Routes.php
3 m+ i8 A, Z& w; |" K; M - namespace Config;
& `* N2 R) q, M7 ~% C - 0 A# y( P, H* R
- $routes = Services::routes();
* D' ~4 Y8 `' M - $ \/ ~. p$ p7 S) c8 d, k
- // 添加自訂路由規則/ X7 I0 N8 n0 `* P- |' P
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {" K t$ M0 s4 o+ e' |* P( [
- $routes->get('/', 'LoginController::index');" n$ I6 }2 |) ^# G+ c
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" Q1 G4 ^) z# e" r. a* g' L. N
- // 默認路由處理& {+ j6 [" \8 \
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
* w5 m% b( l2 r1 b u7 l6 l% L - });
& F( c: _( a, Q8 e$ t- ~2 P, a - $ o8 W7 k2 }1 t1 p# w
- // app/Controllers/Login/LoginController.php7 j; u3 G7 t: T
- namespace App\Controllers\Login;$ W2 E8 \% z3 @
1 k) h. |4 P5 ]# F3 c8 n# l- use CodeIgniter\Controller;
: ?& k: @& ^* e$ Y - use App\Controllers\Login\AbstractLoginPage;# S9 |8 K- {" I3 V9 T0 d2 B2 U
- `% b7 p" T, X7 a5 k* v" T- class LoginController extends Controller: \8 y. Q8 K) \3 B3 R, W
- {
) F4 {; q, Q \4 d" w# I - protected $pageObj;; T8 Y2 J4 \, r0 L3 Z
- protected $LNG; // 語言物件5 ]8 I. b N& C' V T; V
- ( O) T! W& M5 `" c# i
- public function __construct()
- _. W; y) Y7 Y - {
$ E: \' c$ U4 O! F6 S - // 載入語言檔和其他必要的依賴
) l! d, W/ D6 J j - $this->LNG = service('Language'); // 假設你有一個語言服務9 n& N8 c8 m4 Q+ N5 y' L8 e
- }6 C) A* S. V( U9 I _3 B
- 5 G/ X ^/ n, ^
- public function index()2 R: i5 u/ w7 f- K
- {
4 H0 x! k0 o$ ~% T) Q7 X$ d - return $this->handle('index', 'show');
% i2 @( C. \5 ]7 c( I/ F - }, x) v! q$ a7 n) e
! U& L( Y/ h! s- a& c, `- public function handle($page = 'index', $mode = 'show'); G& H' @* ]9 w$ f _2 j6 }
- {1 S7 B) `4 X j
- // 安全過濾頁面名稱
" i9 H9 U- v0 D$ h1 L+ a) C+ } - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
+ N# x( l/ w/ s9 Q: {% ^* C - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
; R6 y% |$ m/ g; q' x -
# \) X; L/ ~# R$ D) p) N' i - // 檢查類檔是否存在" _+ w3 U( A; E; Y
- if (!class_exists($pageClass)) {: y6 c) E, h$ }% q% H% I
- return $this->showError($this->LNG['page_doesnt_exist']);& A8 n8 ~3 O( U. _! ~
- }
% T7 O' J- X, K: H Q0 e1 R) u - * O! J6 m* B& ?
- // 產生實體頁面類
+ U$ N; H) v# j6 b& p' C; Y; | - $this->pageObj = new $pageClass();
4 ^1 |7 s; S" P$ x) f" P: L -
+ ~+ Q5 k. z; Q7 }1 o - // 檢查模組要求* t# q/ X- ^0 F4 c" ?+ N; o
- $pageProps = get_class_vars($pageClass);! J( n0 @3 E1 t, Z: l3 r4 ?; b6 x
- if (isset($pageProps['requireModule']) && - c- P- [2 q% `3 V* _* F' p& A
- $pageProps['requireModule'] !== 0 &&
. [6 Y3 K, F+ n3 m) X3 P3 S - !$this->isModuleAvailable($pageProps['requireModule'])) {0 d+ o" F" v/ J% B& K
- return $this->showError($this->LNG['sys_module_inactive']);
% W+ o2 c' U8 B$ y% H7 p* l - }) b9 D: ]" u3 g; I
- ) x. k8 @- \6 Z
- // 檢查方法是否可調用- D# l; I( N% L7 e, @
- if (!is_callable([$this->pageObj, $mode])) {
, I% |& r$ T! r$ U. \ - if (!isset($pageProps['defaultController']) ||
7 w- p5 j$ W @; L1 J - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
$ \# M2 j4 u# e" q; A1 \ - return $this->showError($this->LNG['page_doesnt_exist']);
7 n/ H+ |" b Y - }1 ~: k% l( X% z7 b+ T1 _
- $mode = $pageProps['defaultController'];! ~% c# G% \8 o$ _7 d: K
- }
: n1 T7 C5 j& A5 Y
. w" [$ N" I/ q, h, W3 C1 F- // 調用相應的方法2 Y2 L0 k& J$ i" p
- return $this->pageObj->$mode();
1 P0 X5 T9 N$ E - }& Q7 R$ i! X5 S$ E$ X' E7 Y' t& m; w
% v+ D! |( ~) E5 ~9 o( `- protected function showError($message) F* L7 ?! d* r1 w/ s4 e$ E' m/ Z
- {
6 A1 q( T# k9 k. |) y3 n - return view('errors/custom_error', ['message' => $message]);' ~" S% t7 h) F h
- }1 q6 x! I. L# w8 u
- 2 R- S, u/ ^& V
- protected function isModuleAvailable($moduleId)
" r' F: B( g" D. b0 @4 p% g - {
; P! Q) J. u' W Q% I+ D - // 實現模組可用性檢查邏輯
$ l# A: _) P+ x - return true; // 根據實際需求修改
/ A. D( m' a$ o- L6 ]1 n! T. u - }
! c- h- z) G. y# m3 | - }
7 Q2 i, {1 g& V, \
) Y8 |. m9 ^5 d4 I- // app/Controllers/Login/AbstractLoginPage.php
8 J+ X! Z+ ^, e - namespace App\Controllers\Login;- ]( h5 L$ s l8 L, ]4 V( O
- 3 G" M: e# q' a: E2 U* \7 i
- use CodeIgniter\Controller;
4 y; K+ J2 U/ F, n7 w - # }3 {) K9 b3 ^/ S8 `# b
- abstract class AbstractLoginPage extends Controller
9 W% b5 B; i7 u3 p, G b - {
& i5 m% s+ [7 H9 |- x8 D - // 實現基礎登錄頁面功能
9 g, @2 e4 u( \3 M- V. q8 ` - }
6 G5 e7 \+ D4 C3 _! w
; L8 [6 A h/ ?6 R. a* T- // app/Controllers/Login/ShowErrorPage.php8 E( @# L, ]( X
- namespace App\Controllers\Login;6 q3 E) D5 ?# m6 s9 i7 M
- - c& L9 l4 H9 G/ _9 J
- class ShowErrorPage extends AbstractLoginPage0 e, U! H/ M1 B* J; t( |) E" j$ R$ K
- { v2 P; D0 J, u0 |
- public static function printError($message)
7 K: k. Z, Q, R! E - {
& T' p9 G0 w7 C - $controller = new LoginController();( ?4 S3 B! J4 v8 Q
- return $controller->showError($message);
, h4 n$ J# l/ ~ - }
; g# E1 D! s( x2 r6 y* J* ` - }
! t/ o+ g/ G! x) B* T7 Q
3 _- c) p* e6 [: X6 U* {$ M- // app/Controllers/Login/ShowIndexPage.php
1 {- k( @7 ^* F8 ] - namespace App\Controllers\Login;% Y& l0 d" ?3 P' J, C* w, q
5 O8 y; Q0 i0 n9 u/ z/ s9 ]. a2 v- class ShowIndexPage extends AbstractLoginPage0 Z B3 ]! e9 ?0 y
- {2 B6 U+ b6 j: ]8 Z" z
- public function show()
$ u( Q8 v: ]. @ - {( G, M1 p- Z3 M) }% ?) o
- // 實現登錄頁面顯示邏輯& Y0 t( q f+ D' J" U" g% R
- return view('login/index');& O3 ~4 L& \. _6 M: y
- }/ e8 w3 A, u8 U) l
- }- w4 V# ^8 g% h( x1 w, `! D
複製程式碼 |
|