等級:25 - 爐火純青 經驗值:0 / 245 魔法值:13998 / 13998 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 昨天 13:56 |
---|
簽到天數: 5642 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
# C/ J+ \0 Y$ i9 w* ?; s, \AI 就是站長的最佳幫手。, d8 r' U: I5 W8 l2 J! F3 O' l) ]4 H2 K
+ W& E6 i" s' f) @! q
5 B% [9 A" @1 z% L2 d- R. o這裡的「新架構」是指後端的架構會有大變化! O" f. D' g& w' J& e9 N: V' C
但前端的 UI 介面玩家不會感受出來有何不同
7 M4 `) x, z: Z4 b5 A
% r# I9 e* m5 K! f& D
% \9 C. m ?4 x% `6 p為什麼站長要改成新的獨家架構?
# H d1 a- [( R. `- {' C& I就一樣由AI模型來解釋清楚吧。) ^4 X5 b8 i+ B/ F7 c4 U$ ^; l
" x+ _" a9 g5 o# s2 @
7 {" q) W8 ]4 K. |
讓我分析一下使用純 PHP 和使用框架的優缺點:
/ L5 y- Z6 w2 o; W8 K: ` C純 PHP 的優點:- h4 l) g$ f1 T) N$ |3 g: b
1. 性能較好 - 沒有框架的額外開銷4 _' \. H( G8 S* Q8 j. n
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
% p0 y" v, R# L/ a1 Q& T3. 更靈活 - 可以完全按照自己的需求來設計架構
& j/ k* I) S, Q4. 代碼量小 - 不包含不需要的功能模組
0 W6 ]9 F, [" m$ j: q3 ^5. 適合小型項目0 d; h r- J, ?! l: g# x7 t, i
純 PHP 的缺點:
0 G/ i5 b! _( C: N Y- V1. 需要自己處理很多底層細節' f5 b* s/ \* |. C4 @- C2 \
2. 代碼複用性差& Y7 {, R! f* S( T3 B
3. 缺乏統一的開發規範
+ R( k; l# Q' Z. q: O4. 安全性需要自行考慮和實現
$ v6 K4 x t8 b5 e6 |% L2 P; O5. 開發效率相對較低( o4 X2 c* r, X0 u9 \: _
6. 維護成本高
& n* @7 x' I+ M |' Z( c使用框架的優點:
; h+ j) E2 i" D$ v+ L; S1 R& C1. 開發效率高 - 有現成的元件和工具
- d: a! r1 X+ j- F& Q2. 有完善的安全機制
& Y% K* A. s- x4 {4 S0 b1 \3. 統一的編碼規範
7 x7 M Q7 H* j+ y& L6 J* {! M3 I4. 易於維護
) l7 B L% A7 F7 l5. 有活躍的社區支持$ P4 i0 C, }4 A3 L0 a
6. 適合團隊協作
# N6 V+ p& c+ B# m1 L' ?7. 自帶很多常用功能(ORM、緩存等)( Q3 e- d( [+ O* S& F) l. X
使用框架的缺點:
* k+ B5 @' R2 g5 o# R1 d, f. g* _1. 性能有一定損耗
3 H& `4 m' c) g: a& M# _. g4 u0 \8 K! ~2. 學習成本較高
0 K& Z: X% `& G2 z3. 可能包含很多用不到的功能8 v2 f/ R# w/ B( p. ]
4. 不夠靈活,需要遵循框架的規範5 W4 {( ]# D6 @2 p5 r/ A% K7 ^( Q
5. 對小項目可能顯得過重
* ]& N z5 t/ n- M$ |0 Z) X( N建議:. ?. u$ k* u" N0 B! e
1. 小型項目或學習階段可以使用純 PHP
: Q6 W/ b6 o) ~& q: r: ?# }8 L- ^2. 中大型專案建議使用框架
, V3 M: l3 G" x) ^" v! e3. 選擇框架要根據專案需求和團隊情況
$ \* w1 A3 L$ K% x2 o( _" j, I( K" R9 m4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
" F. z( q, Z" Y1 k) j7 b您打算開發什麼類型的專案?這樣我可以給出更具體的建議。1 a( e; ?( `. M
% K' v) o7 u2 t- E' p' a# X* F9 w# \9 u# q n% y
% @5 l6 Z) I, d1 K- \' O' h$ \我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
$ N. W) B+ }" g# t/ w4 p: \; { A# _) T4 D Z
這個轉換主要做了以下改動:; W% {" f- W/ }
/ e1 ]6 U& z X: r" n路由結構:
" H: R8 K3 T+ b+ X
) x& O) \) a2 r$ S9 S使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
5 k5 m% T; A( b* e/ L% U支援原有的 page/mode 參數結構
2 b; ^! R) F4 i7 i. ?0 o通過路由規則自動匹配到對應的控制器方法
3 F9 O e# n$ ] R
, |) K1 J0 ~1 Z4 A- h& c& _2 D& J) i3 U4 j2 d1 T- _
控制器結構:
n" t* Y1 g8 ~9 f' l G7 C. T5 ~3 L, x, i6 n9 \
創建了主要的 LoginController 處理所有請求% C( \; ]+ V; G+ E' S
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
4 \4 X( q/ v O: V2 s" \' p, K錯誤處理改用CI4的視圖系統
/ d/ ^ ~/ D/ {1 s9 e0 H# Q j: o0 D6 M0 t" ]4 G
5 M5 c' Z( y( G3 ~4 k* B; w( y類的組織:
3 _- b: |* Z, l: p4 Y# Q; u. u- Y5 T6 o# d/ x3 e! T* e
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
! c2 q/ M) L1 y0 I保持了原有的類繼承結構
& p7 h9 d# L- @) w4 e. T改用CI4的控制器基類和特性5 l, V, G0 b: A6 {( {
$ G$ ~4 h' e" X# O4 Q
' m! r, F. W$ W* f) S改進的安全性:* M4 U/ S& a: Z3 f
$ M2 q+ `; Y+ b$ P0 W0 m
使用CI4內置的安全特性! q1 N5 Q- F% F* v
更嚴格的輸入過濾" |' j- _7 [# n( ~% m: |" A8 G) t
更好的錯誤處理機制
; Z1 C: V6 W3 O4 y% C$ r3 B0 i0 E
* q8 i/ m) u/ W7 m
$ h% f8 l% W: A9 [2 _$ ^ p( U( ]/ I* I0 T r& O
要使用這個新結構,你需要:2 u V& w% g% U6 i4 l, \5 |+ ?
g0 ^, V p4 ^& O) i- @
將這些檔放在對應的CI4目錄結構中* ~$ v, K2 E$ U: y2 m3 k- H% W* B' T
確保創建相應的視圖文件
1 w, R4 S) w" Q! ^# F' h配置語言服務
, @$ |, g1 Y0 H+ M* i" p1 l6 n' C根據需要調整模組檢查邏輯4 _ J- J& l. P& g- E7 Z
$ z: }! M2 Y( T. ^1 a; X3 ]需要注意的是,你可能還需要:
) ]# P" s3 d' U% F
: A/ }9 y8 z8 i' }5 v9 e& E創建相應的視圖檔(在 app/Views/ 目錄下) x1 `' x) K% a) S* d8 M
配置適當的中介軟體來處理會話
: i7 B, l9 b. O; n實現具體的登錄邏輯
! O/ X+ I7 }1 j6 V
1 w7 i% t' R1 J5 ]# n( x需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
5 _) |! d1 N* h1 Y/ A! I; e6 N" q4 {8 ^" @8 P" B
- <?php# y7 v% ~" D7 _4 {% p8 ]
- // app/Config/Routes.php
1 r' t* [3 J6 H8 U9 ~ - namespace Config;: h% q2 s5 ~) h! s6 \7 Y! S; g; v" j
# E8 }0 d! o. J: c6 B1 [7 p, m! @- $routes = Services::routes();& Z2 e" e- `' l0 p/ S% B& b! K
! q- M; z0 Y& v: |- // 添加自訂路由規則% S7 d; w: B' i! \' D" H4 `
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
" D) X$ V- y1 j+ w - $routes->get('/', 'LoginController::index');9 q5 c2 g# W; t
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');. u' q2 x$ i3 Y* @7 {" R0 e
- // 默認路由處理# V4 {+ R4 _! {' R
- $routes->get('(:segment)', 'LoginController::handle/$1/show');4 B! [+ s( ]9 O; z0 u
- });
( ]' C- _; ] v( S: P+ n
6 ^% l# ^- l6 Q% b- // app/Controllers/Login/LoginController.php
' ^' V) a- _8 p6 \, @0 j - namespace App\Controllers\Login;5 N4 t, M* _2 J
- S7 \8 L. A8 i( L) L. L- use CodeIgniter\Controller;& U+ s# j! Z Y2 o" b
- use App\Controllers\Login\AbstractLoginPage;1 E9 P8 y* A2 U5 U) \" s
3 ?0 m: S$ u3 i4 e+ y+ T- class LoginController extends Controller* c8 f6 ^% T, Z3 u
- {
+ i5 n+ v) z) T - protected $pageObj;
! k' c+ y( g) [& m8 l) u" i - protected $LNG; // 語言物件
" ]2 Z' a4 ?. v+ ?8 a5 B9 Q
F$ }$ T e* d: g* ]1 g# x- public function __construct()
& a. s) j. V0 J5 G3 u, A - {
: e- Y" w/ y5 {, ]& }) | - // 載入語言檔和其他必要的依賴
- {9 k! m% m/ A8 |* n9 |# j" q - $this->LNG = service('Language'); // 假設你有一個語言服務
" {4 } F8 g9 ~# \* S* [ - }$ `3 X0 Y. g5 b, p) [
" }- E' d* g* w% {# e6 q- public function index()
9 {" j# g9 E* P& Z6 T$ N9 W2 a - {: h/ O1 U$ }! w0 Y9 L$ I
- return $this->handle('index', 'show');
, b: D6 i( \6 a1 _. z& M; d; S& M" t - }+ X. k! s$ a' Z3 ^( v8 P" L
- 0 r; ~3 ~& l$ o! W' z
- public function handle($page = 'index', $mode = 'show')1 v# y& M7 e! u, L& g
- {6 O, c! i! y1 I! O! P
- // 安全過濾頁面名稱6 L( {7 I" x4 e
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
$ V' c- t& v4 b$ y/ @( x! E - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';0 n/ ?# L6 G9 @. A, Z1 Z
-
8 S7 l. n- G1 U: L - // 檢查類檔是否存在, p; H4 y2 V. y# o6 K7 j
- if (!class_exists($pageClass)) { H5 \7 E' K/ }7 T( V3 `2 W9 x
- return $this->showError($this->LNG['page_doesnt_exist']);
* E+ A7 \4 e, D9 v' j# `7 W - }- B8 ?, c0 b. F6 w
1 J, r& r M8 R) R- // 產生實體頁面類
. C6 @4 [& j4 \3 E& H8 M. P" W - $this->pageObj = new $pageClass();
6 W$ f" l8 w0 l4 l0 ]! I - 9 x) _3 `" N5 l. h/ e
- // 檢查模組要求, [! {5 C% i% D7 \
- $pageProps = get_class_vars($pageClass);
# ?8 \4 O" z S - if (isset($pageProps['requireModule']) &&
$ K+ ~1 S, v' q* x9 X0 K - $pageProps['requireModule'] !== 0 && $ t* l( K, }3 h# C) q; D1 B9 r
- !$this->isModuleAvailable($pageProps['requireModule'])) {
7 t1 R1 j3 X4 b# p - return $this->showError($this->LNG['sys_module_inactive']);
1 z! H$ [+ M- C# k4 T - }/ b* k* W+ @* S8 E8 o
- 7 _+ R$ S3 ~+ h7 n% a& |( l
- // 檢查方法是否可調用; H6 [. |! z8 {7 \* k% ^' w! G
- if (!is_callable([$this->pageObj, $mode])) {
- b' a, z/ @1 F+ V - if (!isset($pageProps['defaultController']) ||
5 C5 T8 P" ^! f2 u2 i - !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 l! e0 @0 G. c4 i2 T- `. Q. u
- return $this->showError($this->LNG['page_doesnt_exist']);
' h) X0 P$ \. R; c - }0 }8 [9 Z6 y5 _, f/ H4 f+ H
- $mode = $pageProps['defaultController'];
9 b# j3 l0 j( i6 E e, }+ Q - }
+ i6 J' L5 Z" r- ^8 a - 8 l1 N; _: D7 ~$ m; A
- // 調用相應的方法; C1 H# r& L: L9 b7 v
- return $this->pageObj->$mode();& i) Z; d5 I Z/ K
- }& J8 E* i, t* p7 O
- 3 K$ t6 x" [& I) L: L
- protected function showError($message)
7 B5 a; o/ ^' k' ?- J - {
; w3 k+ ]. z9 _- r - return view('errors/custom_error', ['message' => $message]);
, [9 r# U1 n, { - }; w' F0 S- ^, N' j, ?5 T& {; f$ w
- ' l, j9 C V4 P# y0 A' |
- protected function isModuleAvailable($moduleId)* l* k n% a" z4 Y$ }
- {' R6 D* w- b4 H/ p0 P0 `
- // 實現模組可用性檢查邏輯
0 l* x* V6 |6 E0 q& Q - return true; // 根據實際需求修改
: y' G( [- x) k0 k8 d5 C5 M4 m - }
7 V, G) ^* { k2 u8 z: ` - }; E( \ I0 T$ u7 `
$ L! e; t$ t$ Y- // app/Controllers/Login/AbstractLoginPage.php
1 [. r& ^& _! C( _ - namespace App\Controllers\Login;
- I a9 g: R! F0 F3 S, K. }
0 G: S, J: B6 a6 v/ }! c- use CodeIgniter\Controller;
8 u- v3 K& C. \- |$ _+ O
! X% e; W) v2 r( T9 q! z- abstract class AbstractLoginPage extends Controller2 c3 g7 u: E2 F) d, d5 Q
- {* T& {# ^+ _7 e: F8 s+ K
- // 實現基礎登錄頁面功能
& O2 J) G- I5 ~* v - }
) a; A3 u5 A" W: U, f - ( F4 V# A! l+ X2 A7 e7 G2 Z9 r
- // app/Controllers/Login/ShowErrorPage.php
% q# e P& M- e3 Q6 G7 w& X - namespace App\Controllers\Login;
+ W: d, I' C; |4 Q9 A
# R2 x1 g0 X0 [! L: E9 A- class ShowErrorPage extends AbstractLoginPage
8 G; O, v- Q G% n# d9 a - {
1 K) b7 z- K8 R9 Z' o E b - public static function printError($message)
$ I/ Y! G* I' m7 O6 c S - {
. D4 J8 N3 j/ B9 ?" J - $controller = new LoginController();) _2 V+ d$ x' j0 I" ?" n
- return $controller->showError($message);
9 u3 N6 U* a% x+ k5 b7 Q - }
& B7 t2 w. c0 b, V' }) x - }
# n$ k! |& y4 p: N - 2 a. _6 Z' x6 n
- // app/Controllers/Login/ShowIndexPage.php
& z- q- ~* i! m/ V2 C( I0 k$ r - namespace App\Controllers\Login;4 ~1 p" I) V5 u+ k: C0 F
- 4 h$ _$ {. } E% u' V$ m9 C
- class ShowIndexPage extends AbstractLoginPage% G" ^" ~0 s1 @8 v5 A# r
- {
& G- e) F: b7 G* d' X v - public function show(): L" t. x/ Z& e( B
- {
n5 n' `' c$ W) W' e5 @ - // 實現登錄頁面顯示邏輯8 }" X4 r6 v" h
- return view('login/index');
' c0 `# a: G. |& \: ^8 ]) o1 J - }! u5 \3 w$ J4 b: B3 d3 c
- }
2 H, w# C' \3 O. ], u
複製程式碼 |
|