等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14473 / 14473 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 11 小時前 |
|---|
簽到天數: 5816 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致# Q# N1 y" U7 s# }$ k+ L: Q! {& K
AI 就是站長的最佳幫手。
- ~7 |9 M1 x; |! a2 N2 _
# M: q1 ]/ z. E% b! O
9 }9 u2 y$ M6 {# m# |這裡的「新架構」是指後端的架構會有大變化
9 |- r1 M u) F. U! B' t) q但前端的 UI 介面玩家不會感受出來有何不同( j% ^ d5 Y, o" ?& I; F+ `
: X' _$ y" ]1 o
/ F6 W" a( r+ `- Y. d; Z為什麼站長要改成新的獨家架構? R4 E$ L9 M& A" ~( M
就一樣由AI模型來解釋清楚吧。& P/ ]6 d+ i% e
5 t! _7 n" A# Z' L( p% _' `8 t
" N t+ j' U7 D! S- P: O+ K
讓我分析一下使用純 PHP 和使用框架的優缺點:
* V8 J8 \/ D$ Z3 ^8 x純 PHP 的優點:' v# D( }6 @+ m5 U
1. 性能較好 - 沒有框架的額外開銷
& {" z% W8 p5 s' C7 K& C) Y% O2. 學習曲線低 - 只需要掌握 PHP 基礎知識- A* d' H$ W9 s8 h6 b
3. 更靈活 - 可以完全按照自己的需求來設計架構
' E; Y+ X" G8 C ^0 U# }* y. j4. 代碼量小 - 不包含不需要的功能模組0 X5 t! E# a/ N. E6 A
5. 適合小型項目% L" k6 E1 A6 {6 k" a
純 PHP 的缺點:
2 {+ T3 }7 q" N% E1. 需要自己處理很多底層細節. m. V- t( g$ U! i+ V. `
2. 代碼複用性差9 A% Z9 b2 f3 h
3. 缺乏統一的開發規範
9 J" Q/ O& o4 S7 b" R4. 安全性需要自行考慮和實現
) K% F3 _: ?0 ]! t1 B* A" }' M6 S5. 開發效率相對較低* y: P! j; r1 [) i8 ]
6. 維護成本高; J* s; K. r" {) w3 n# e
使用框架的優點:. L. `) r1 O6 Y; v" |0 v( o" h% \
1. 開發效率高 - 有現成的元件和工具# T5 \! v+ E0 ]. q2 R
2. 有完善的安全機制( S5 ~9 P7 k$ y6 |/ i& H) p
3. 統一的編碼規範" u& Z. B: C9 Z! H2 I# |
4. 易於維護, U. g9 w7 f" j2 N8 G+ X
5. 有活躍的社區支持( b T P+ Y' H4 p) Z
6. 適合團隊協作
: \/ x n" D, ]: r7. 自帶很多常用功能(ORM、緩存等)$ C. f& w' X, d h8 U
使用框架的缺點:0 C0 ]2 M# P; x, L5 |# X0 V0 Q
1. 性能有一定損耗3 n( N6 h3 \0 f9 D/ k' f& U% ~
2. 學習成本較高
* [0 ]( `. L% D/ v- r3. 可能包含很多用不到的功能/ A e4 [/ }* p
4. 不夠靈活,需要遵循框架的規範
# b$ G) ?- J% A* B' `! `5. 對小項目可能顯得過重
$ D' n$ D2 D9 o% m; [8 {建議:( }& l5 j9 P, O- b* M( ^- S
1. 小型項目或學習階段可以使用純 PHP
# a4 J! N! |0 f2. 中大型專案建議使用框架3 [; z6 n* _/ u7 o, Q. e3 S
3. 選擇框架要根據專案需求和團隊情況* l+ K d( |- n$ p7 ^
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇- _$ `1 L% q% L. z! H( H; H9 b( m
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
. u, r: V2 {: ^. R& y0 L4 e
' C0 ]$ g! C4 g7 K- W( k& t
+ L1 F5 p. p p, c, E3 t$ @3 y: ]! t: s: R
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。3 Z' c1 r& V0 D3 l
# J, f7 Z3 a9 [& h) ?/ r
這個轉換主要做了以下改動:
2 D- Z1 I$ B% x/ O% X" b5 P' Y4 W! R, N0 z8 s8 B/ F
路由結構:- j. b8 l& F6 f# r- `/ A' `
. a& F/ |$ }2 e L# d- C5 z& K
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下6 i" n: E0 x) v% P4 P* F& [
支援原有的 page/mode 參數結構
! o9 O; o& ~5 K通過路由規則自動匹配到對應的控制器方法* G. A! @3 c* _$ u. _
, r# B7 H0 p( o( y1 T
* |) ^( t. T' l控制器結構:) w- t1 y$ l( z4 H5 }- |. V N
* W- _& `# P8 A4 e8 A, O! |8 M- P創建了主要的 LoginController 處理所有請求 d# [- l! g0 a9 P. K- z! k
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
0 n$ O! ^, X2 N錯誤處理改用CI4的視圖系統, y) f4 R5 @* U8 `# q; `
6 e0 q6 j1 L' _0 r) `( k' c' b' D0 C7 B0 E4 F# _ ^- D" f8 U& h
類的組織:
7 u2 N- M! k' ]
. h5 ~' r$ W5 V7 N; j1 ?所有登錄相關的類都放在 App\Controllers\Login 命名空間下, y2 g0 {" `& D( b
保持了原有的類繼承結構
9 E/ A& I8 A- Q4 F' @+ {改用CI4的控制器基類和特性
, H$ ^. b( V9 m# X4 \0 P: v8 ]
6 B- q, ^/ ^# w: l5 C: {. M
0 H) s$ J' K3 T7 B改進的安全性:
9 a2 \+ C) Y. r" V
0 f J$ _2 |6 s# b6 k& E) \使用CI4內置的安全特性
* ^6 v& w% K! s7 T7 O更嚴格的輸入過濾
" b$ W& Q K" Y( O9 V$ T更好的錯誤處理機制
$ o# @* H& _9 V0 E9 }# _1 s* P) O& M7 T# x! V5 r- Z( @
, d$ f# y$ A/ W) U" s1 T) o
! \9 b5 f! G) Q要使用這個新結構,你需要:
" j; M; ~) s/ P; _) P! `9 D" j! h9 d* K, P% r! S& o" j
將這些檔放在對應的CI4目錄結構中
* ~# P) F, _* |. H+ l確保創建相應的視圖文件: ?! f2 J: L. p' C
配置語言服務6 e, r% X! @% n0 {! c# p8 N8 i
根據需要調整模組檢查邏輯) P) z0 L" ]# l4 i2 T) k
+ [. h9 y! e$ ?需要注意的是,你可能還需要:! F. n, U2 u, C2 V' {- D/ q2 U& u& F
" t! [ k5 @/ |0 l J% M0 n創建相應的視圖檔(在 app/Views/ 目錄下)/ p3 W0 Q; y. r+ r; H
配置適當的中介軟體來處理會話
' ]% E" O0 e" a$ _$ ]( b [實現具體的登錄邏輯
, \9 n7 ]7 {' ], |
. o' z# `% ?9 Q! k; K需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
: E; C; |, d$ y6 H) }2 _& q1 ~2 V- E* W/ {& ]4 M6 ^# z
- <?php: t( S& ]# d3 i' r3 M6 n
- // app/Config/Routes.php
3 }9 T" f9 H+ u9 x+ _0 ]+ U - namespace Config;
. V* Z/ |7 m8 Y: E- M& n
: G3 {, l6 P1 h B. k& X- $routes = Services::routes();
% H& j0 `% d+ p4 H
7 N0 D8 S. i; D7 b0 h" y+ r+ a- // 添加自訂路由規則% k d7 ^0 Y- b+ @* c) D# y" n) F
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
+ _* D! P+ B" [0 ~9 e& a6 u: R - $routes->get('/', 'LoginController::index');! }- K1 N9 @1 I- o
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
7 e1 }7 G# ]# e7 b4 j: v - // 默認路由處理
4 t* l# c$ j* c - $routes->get('(:segment)', 'LoginController::handle/$1/show');: Y) A1 u5 S$ N) A' q
- });
' x2 ^. `8 p# A- ?5 p - # o# V8 q) c, G5 d( j4 K3 r
- // app/Controllers/Login/LoginController.php
; e7 y2 O) j# t+ `3 S7 B& K* t - namespace App\Controllers\Login;& D" Q2 t7 B: {5 U/ g1 H
- 7 L& D% X$ [/ U! S% r
- use CodeIgniter\Controller;
\ u- P& ^, y - use App\Controllers\Login\AbstractLoginPage;
% A: x6 a4 b" p$ U9 A# Z
) n, m# k: y: I6 t# ]+ F- class LoginController extends Controller/ h# w4 y( \7 u+ i6 m
- {
0 F( a; p9 i0 q; v; m - protected $pageObj;1 v4 v9 x+ G' k: `' c0 c- R% d
- protected $LNG; // 語言物件
3 l! {8 b+ ^+ h2 k) Q2 r- g7 D7 x - ) p! V& n. `: h' }, }2 B" w. g% E
- public function __construct()
, r' b7 I5 N) h& i5 L C( u7 [: C - {
% B7 F. D* }. l. U; @$ @; Y - // 載入語言檔和其他必要的依賴
2 N8 E4 I, b6 V- l5 D5 ~2 G - $this->LNG = service('Language'); // 假設你有一個語言服務
' a [" x7 a5 B8 t4 h - }; Z+ h$ \# u; k# u! S
" V$ @2 E' w+ @; @/ t. i- public function index()
k! W- B# Z: G+ W9 ^ - {9 X+ F: E/ Y3 X2 e% N7 M* L
- return $this->handle('index', 'show');( f4 w8 m# C$ @# T
- }. E$ F Q3 f0 N
) s+ U9 y: P- Z; h- public function handle($page = 'index', $mode = 'show')5 P2 ^8 q& h2 }
- {
# g" `6 `- f1 Z - // 安全過濾頁面名稱
+ z7 T$ e! w0 d6 }% _ D7 C. f3 D3 y - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
# ?: r7 g1 W4 z - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
, y8 k9 [9 ]$ H - 5 w& L$ v' f3 a, Z0 U
- // 檢查類檔是否存在/ s4 J3 G, o3 u/ O' d5 g
- if (!class_exists($pageClass)) {
, f+ L$ O7 i; \8 G3 a+ B/ H - return $this->showError($this->LNG['page_doesnt_exist']);
: m' A5 {; j8 D* U* i X - }1 f! b3 M! D5 e9 K. ]( F/ y
# v' v% U6 T3 | s4 [8 N- // 產生實體頁面類7 B; \4 v/ p" e. L* A. f1 g
- $this->pageObj = new $pageClass();
# V4 x* P7 k W - D- }& B' _" a, C6 \) V
- // 檢查模組要求; r1 h$ V, J1 l$ {
- $pageProps = get_class_vars($pageClass);2 P; s7 K+ z! d
- if (isset($pageProps['requireModule']) &&
" j) `* Z+ p8 q) h0 `+ q" K - $pageProps['requireModule'] !== 0 && 2 x5 u: C; \+ R+ n& |0 C: z
- !$this->isModuleAvailable($pageProps['requireModule'])) {
, \: ?# v1 U: s0 B - return $this->showError($this->LNG['sys_module_inactive']);
8 W& n9 W! d: h c - }+ ~7 T# L, V, S7 p
- : X# B! l) v" u( N" ?! t/ a% N0 t
- // 檢查方法是否可調用5 L6 O' I' E! [1 Z
- if (!is_callable([$this->pageObj, $mode])) {
# H1 J* }9 {. e7 L& v# I' ? - if (!isset($pageProps['defaultController']) ||
; P- p( i! j3 S - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
# U- W0 M7 { C, j% D, m - return $this->showError($this->LNG['page_doesnt_exist']);. l' m3 A [/ @% L0 L: F, g1 W/ e
- }; x$ N6 E% X, Z3 ~5 i9 w1 i0 W
- $mode = $pageProps['defaultController'];
5 y! |- b7 K& e( x - }3 z6 e0 z; g& P+ q8 E" I
9 H+ V% s* r" u- n( s- // 調用相應的方法
! ^& x5 H! x# ]6 m9 W - return $this->pageObj->$mode();" C" i. c1 X5 W; l% e
- }( P! R# p7 f+ ~: @8 q3 \
- 8 x% |, k$ M3 W3 {* ]. x- ^
- protected function showError($message)7 \9 q ~& @- {1 d/ K. M1 M8 |
- {+ p' U% ?! u3 @: |) l% M
- return view('errors/custom_error', ['message' => $message]);, |& O4 C Z& B& Q" N
- }9 n* q( l6 \2 L3 a2 B" E
- 2 C# v% T7 }- l1 I, t
- protected function isModuleAvailable($moduleId)/ Q1 n2 z$ |( ^4 Q2 M
- {) h1 v- l0 `" a& b6 E6 N
- // 實現模組可用性檢查邏輯" P+ ]9 v$ X# ?4 \. Z7 N# C
- return true; // 根據實際需求修改
; Y& g8 L$ v7 z. ]3 {) j7 I4 e - }5 \) h; S! ^+ G& a; C, J9 k. `
- }
' v) M! `# z0 |7 E; g" z9 v, k& w - % m1 H7 v3 X! {5 z
- // app/Controllers/Login/AbstractLoginPage.php
; I; G- H8 [- l' u - namespace App\Controllers\Login;
1 V+ E) d$ d% J3 c1 m; x
; j x% }% y; x/ B, w0 `$ w1 d- use CodeIgniter\Controller;
$ f" Q" C' X( i& b - ! H9 t3 Y* A$ N& G3 b# S1 ]
- abstract class AbstractLoginPage extends Controller2 L& W: R. l% K% M, A1 \
- {5 ^! D& _9 Z* D
- // 實現基礎登錄頁面功能7 r( ~& _0 j% Z+ X9 h8 x
- }
$ G5 V2 G P2 p4 ?0 `5 I! k - ; a S. z9 W. ]5 m) X, ]1 t& n
- // app/Controllers/Login/ShowErrorPage.php5 {3 Q5 U q2 j. W. f) _3 y
- namespace App\Controllers\Login; L5 ?. a3 N4 x$ F/ Y. z
- N: O; T( l* D- class ShowErrorPage extends AbstractLoginPage2 d* G' M8 }" j* Z/ M% C8 a6 u6 a
- {
: b+ O" C4 b' M; L6 }" d - public static function printError($message)( i3 t* C2 V# R1 P8 t
- {
' q8 h4 L0 ]7 Q- K3 b - $controller = new LoginController();
4 q6 d# X; M6 x3 k4 e% `# d - return $controller->showError($message);
$ [" N9 v+ u8 x5 {5 f - }3 G$ f! t; ? w7 g
- }
4 @" z6 F: _" o! ]( S l7 Z
8 r8 e& O+ U) m( d" Z! G! O- // app/Controllers/Login/ShowIndexPage.php0 J) C, T1 U6 U. u+ K- g3 V3 V" y' P
- namespace App\Controllers\Login;
7 O }1 y- {$ ` ~" I @3 ^ - 6 W/ J/ t/ t4 i3 v5 w, k: A* O
- class ShowIndexPage extends AbstractLoginPage) H5 P) j3 }4 D# D* }3 g. B
- {
2 G# _& k% I) c0 E6 J, r! W' J. [ - public function show()
; O% T2 i* n* z5 f; Z! m m7 Z - {
- b* W+ i3 e3 z& I0 G - // 實現登錄頁面顯示邏輯1 z$ c: s4 V7 l* w/ e& H; h
- return view('login/index');; o) Q5 z1 X' U% B: u: P$ R
- }
/ |+ {7 w+ n( H5 |% m1 W - }
& |+ V- b/ ~9 f$ u X, ]5 ?5 l) G
複製程式碼 |
|