等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14323 / 14323 生命值:5%
升級
  100%
TA的每日心情 | 慵懶 8 小時前 |
|---|
簽到天數: 5762 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
6 n* U0 J7 H* |$ j! aAI 就是站長的最佳幫手。
; {4 A8 n0 ?6 e) P. [. b6 H$ O% O e$ D
9 m# E3 V2 O- w8 j% c& }# U這裡的「新架構」是指後端的架構會有大變化! J! \4 x+ d" G+ @. c9 E
但前端的 UI 介面玩家不會感受出來有何不同
! @ ^0 i" p! |, c; a8 C4 m& J& X1 {; `
! f; l$ u% @+ `
為什麼站長要改成新的獨家架構?
- i2 o7 ?3 |- J$ \7 k4 s就一樣由AI模型來解釋清楚吧。0 K! D% O9 k5 x& o7 E! Z6 l
5 x! S3 {; P% S2 D( w6 L+ ^2 D
6 i4 R% g3 U7 T# E: i( H/ E# g' w讓我分析一下使用純 PHP 和使用框架的優缺點:# \4 t: ^; ~; ~
純 PHP 的優點:( j4 N3 o0 C- q
1. 性能較好 - 沒有框架的額外開銷* {1 g7 A' B9 C
2. 學習曲線低 - 只需要掌握 PHP 基礎知識" E E, Y9 `) j2 l3 ?& _9 l& r
3. 更靈活 - 可以完全按照自己的需求來設計架構" G) q' `4 O2 q& P6 [# G
4. 代碼量小 - 不包含不需要的功能模組" U6 o2 E7 n% H3 m1 F3 y
5. 適合小型項目
& y( a' N# p0 s( q, K x9 n純 PHP 的缺點:; X9 S& ~( K& E9 e7 P, a" V" B/ T
1. 需要自己處理很多底層細節
/ J' T9 W0 @/ e2. 代碼複用性差* r8 t) n! R7 I+ ?5 h- \9 s5 ]1 b
3. 缺乏統一的開發規範
- o- A$ Y0 j: f0 ~% S) M4. 安全性需要自行考慮和實現( {: I1 Y3 D- V, A. ~# m
5. 開發效率相對較低7 c9 e3 l# X- w% p! z
6. 維護成本高
, Q; ]4 u7 S8 }+ Q使用框架的優點:( P7 K( v5 l) ^+ ?! v6 L$ c
1. 開發效率高 - 有現成的元件和工具
8 b' C" C6 z S+ v2. 有完善的安全機制2 y6 t/ d! n1 c2 [) ~
3. 統一的編碼規範
$ \- N' G4 ^2 \9 Y4. 易於維護
: t% d" h# ?" _" s5. 有活躍的社區支持) [3 Z9 A2 S% p3 z% Z; d
6. 適合團隊協作; F6 g5 g9 T# Q0 H- J
7. 自帶很多常用功能(ORM、緩存等): u% H5 ^8 u' ~1 c F" X4 V
使用框架的缺點:
# V' t- o% i* O+ X. C1 p1. 性能有一定損耗
2 \0 Z k2 E$ {" a4 ]4 C2. 學習成本較高$ D$ N+ R# T$ D C, w( g2 k8 J+ S. k
3. 可能包含很多用不到的功能
: i, Q# P& |8 ]0 c8 @8 _4. 不夠靈活,需要遵循框架的規範
, u( Z" C9 v4 h7 ~. {, G( f* ?' Y! p5. 對小項目可能顯得過重% m8 Q7 b% F& G7 R+ F
建議:
% V# p% t- v* x* t u- B% Z1. 小型項目或學習階段可以使用純 PHP
* i. q" \% R% V$ F" T. q2. 中大型專案建議使用框架6 c! X" l0 }2 T [% U
3. 選擇框架要根據專案需求和團隊情況( @, u4 ~1 a; O" i* N, o
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇% W# M7 k/ C6 S T! _4 w. c e4 j
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
) w' U$ Q$ k9 C5 G& c) z5 H% s' O/ K0 ?1 A- O O
$ Y: T, ~7 V& Q6 S0 g
/ u2 {9 Q, t r: s8 h ^
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。3 n. J! V T2 J; C4 _
/ k7 y+ j1 Q8 I" I+ F" x這個轉換主要做了以下改動:
4 s1 {6 R0 y9 C" J$ x; a2 i
% @1 g9 {7 \$ \9 h路由結構:
9 O, q. L% L9 h
/ ]' r1 a5 i7 P+ @! o& h使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
% S2 [! N& _4 Q3 y$ Z# C; E" B支援原有的 page/mode 參數結構5 G8 n3 O J% d9 M0 J9 u* z7 d
通過路由規則自動匹配到對應的控制器方法
( t, H6 G7 d, X( ~. B5 Z2 K7 Z4 [
# _; y/ q1 N* @/ n4 { G: [0 @4 [( C( b
控制器結構:
. _% m5 ?( D6 i1 C! S7 \
" {8 r/ v& h. l' s創建了主要的 LoginController 處理所有請求8 R0 r- A i% |
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
5 w8 I; R+ R% f' X! n* _: ?錯誤處理改用CI4的視圖系統2 @* c% } X3 W x
" K0 n5 u# z3 y* J8 s, | q; i& i* U# v2 ]3 L
類的組織:( Q1 ~0 V+ M0 p$ s
2 T; [( R# j( O( _; H所有登錄相關的類都放在 App\Controllers\Login 命名空間下( `* u! J& d' G% S& _
保持了原有的類繼承結構
; Q) F+ a9 {- h( H$ F- f) k" W7 l改用CI4的控制器基類和特性
/ B+ g* e. {1 p2 F$ p. K1 t
5 S6 ~! H8 Z8 W( t& {6 P& f* v% u- \' E8 o; ^+ H
改進的安全性:
9 B. }0 X- r9 e8 p8 t7 f" o) N. s# F6 }; F0 f
使用CI4內置的安全特性
3 v8 a! s; q1 ~. N2 u更嚴格的輸入過濾
5 ?: O4 A8 Q) v. ^; c, F/ t+ T: z更好的錯誤處理機制) r& J* @ T5 {: M
& c% R0 x. E; O# n7 _
$ W: M' p: l/ A- v r- ~1 D8 X" |
要使用這個新結構,你需要:
3 t4 s4 H* t: n' E e [7 q1 ~# ?; q( G& [; _# @5 M8 P8 S
將這些檔放在對應的CI4目錄結構中7 T. d+ P1 x( Z% M |5 p& `
確保創建相應的視圖文件
* N: h A* l. N$ \$ C配置語言服務4 S' {8 h+ t2 Z3 _3 B
根據需要調整模組檢查邏輯4 i9 _& e: H1 S9 K8 z, K9 Y
. q" w' P% R- x( V需要注意的是,你可能還需要:
: F6 M/ l5 k {$ x4 N6 o x( ^& }2 r, x9 k( Z* ^1 F- O
創建相應的視圖檔(在 app/Views/ 目錄下)
- z) D7 A4 D0 S9 i6 h Y配置適當的中介軟體來處理會話
& u7 n( s1 D) }* O/ b4 O7 ~實現具體的登錄邏輯$ N- n+ s2 }* B+ H5 f1 |0 S
6 S+ }: T6 k; {; E1 y- n需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
1 r0 m4 w$ G5 Z% b: m
. W& B7 j9 {. ]: f$ j" D+ _- <?php7 t- a6 ?0 A( W x
- // app/Config/Routes.php4 U. E5 b* \0 _! `
- namespace Config;5 |1 c) u. {7 x
( a1 \" ^" S( F4 `- $routes = Services::routes();
, Q/ j# }4 r; K- { - 6 D' w7 y: f( u) k
- // 添加自訂路由規則
# F7 Y7 |- V0 R - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {3 s3 o; N0 N1 \# v1 `. G; j
- $routes->get('/', 'LoginController::index');
$ F2 a( A6 w! E: S' U( b Q4 u - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');& C# G& [* E- n2 ?( L
- // 默認路由處理* _' y, ^3 ~' A1 ^ T
- $routes->get('(:segment)', 'LoginController::handle/$1/show');% L8 q) |6 t- @1 \+ o- [$ I
- });9 y6 X d I' P3 O
- - q) @3 S; o0 u
- // app/Controllers/Login/LoginController.php: u$ W. g! Z0 n; y* G
- namespace App\Controllers\Login;
* X% J4 r9 }" R0 d - + q' Z! G& G, r' r, c
- use CodeIgniter\Controller;
7 j8 |% e8 Q4 K+ J( [: e+ E3 @6 F - use App\Controllers\Login\AbstractLoginPage;
) K) f; B/ P. N8 p - - X9 b( u; \2 Q6 j% n6 e n8 I5 \
- class LoginController extends Controller- C0 M R- `; w
- {7 G% `) w: F6 o; ~5 W
- protected $pageObj;
' l% D& j# O/ q' Z, ]% N" { - protected $LNG; // 語言物件
4 q) ?2 ~# B" Y1 W: D - & \% R+ Q5 d s- q2 Y, O
- public function __construct()
9 @; g) o" T, p1 t$ L+ U8 c - {
! q+ j! O% M1 z' [/ y - // 載入語言檔和其他必要的依賴
, H# L5 t8 Q$ c- s, W/ u - $this->LNG = service('Language'); // 假設你有一個語言服務2 I7 O( i |6 Q. h; r0 q2 I* W7 e
- }
& |. u3 c! L5 _ - / ~% c6 {* L+ a* I F0 F
- public function index()% t) Z% A# N/ C* C
- {3 Z! }; V$ G! c- w! r
- return $this->handle('index', 'show');
+ o& {9 B2 F2 X0 ^* F - }
# v* {# ~9 f8 m2 N: J
& u" N% j% x0 b# R+ ]- public function handle($page = 'index', $mode = 'show')- U5 F6 W$ ~& y# V
- {: [2 x P8 c, r' A
- // 安全過濾頁面名稱; r& w- B& t3 V2 X2 Z6 Y7 g
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);% O/ `" N9 q- A7 ?# @
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';1 o8 Z. |; Y+ H
- , j- P* L& g l2 R+ d$ Y
- // 檢查類檔是否存在
( d5 B- A0 l$ U1 T; ]( }, i - if (!class_exists($pageClass)) {
2 ?7 p9 \: L- k( E( `; N - return $this->showError($this->LNG['page_doesnt_exist']);
! u$ A% ]" L a* ~; L+ |6 Z+ }' z - }
: D; h ]2 I. Q, U9 i ?- c2 _
) C, z7 L7 l* _- // 產生實體頁面類
" ?5 E' s: c& U; M - $this->pageObj = new $pageClass();
) R3 E; A% b0 @ - 3 t4 C$ w# x, c/ X. ]4 r
- // 檢查模組要求 o. L' g& S$ t& k1 l# {
- $pageProps = get_class_vars($pageClass);, a3 z; p1 q8 K7 K; x# L
- if (isset($pageProps['requireModule']) && % x' `& i: `+ L
- $pageProps['requireModule'] !== 0 && , w2 A7 U7 B7 w0 J# p0 q
- !$this->isModuleAvailable($pageProps['requireModule'])) {% j0 | d% E/ x% k
- return $this->showError($this->LNG['sys_module_inactive']);
, k1 q$ w) T. _: y - }
/ Q9 E+ Q' S- }. z c) c6 _ - 7 ?' r$ K& J, J+ G- l( ], }; p, _
- // 檢查方法是否可調用
% ~2 f% K: T7 R8 n' B7 O - if (!is_callable([$this->pageObj, $mode])) {
- ?5 M. \' p+ d, Z - if (!isset($pageProps['defaultController']) ||
9 x* H* K5 T) C3 k - !is_callable([$this->pageObj, $pageProps['defaultController']])) {1 L5 F/ U4 D0 c8 I- ^5 T# J+ L
- return $this->showError($this->LNG['page_doesnt_exist']);
. L0 p( I; ], V6 y: u4 Z3 a6 O& f - }
5 @) f' {9 G9 ] - $mode = $pageProps['defaultController'];
. `- {) z; Y3 ?! \/ h3 B - }
1 [- q5 K7 S+ `4 N; n9 |5 M4 e; v3 l - ) S7 ^1 A) @7 d Y9 e# I# r
- // 調用相應的方法
9 ~! c# i! o! ?1 c, r! ]) a - return $this->pageObj->$mode();" e5 r# m: @* T; `# {( o
- }
- ~& R: J5 i* U9 Y - 6 `" Y9 U! h; b. A
- protected function showError($message)
7 T9 ^( r* F/ N O1 s6 ], S, l - {8 `# n4 v. ]) i/ C0 a; Q
- return view('errors/custom_error', ['message' => $message]);# s8 `6 J5 V) c- A; p
- }. {5 c4 S2 N9 }7 X# j- G$ u$ L( \
- 6 D' ], f- c" ^7 O$ ]; w; |- _2 F
- protected function isModuleAvailable($moduleId)5 C, A, k) w( r$ o
- {/ A* k, }5 L' z$ O4 b
- // 實現模組可用性檢查邏輯
( E% ^! C6 R5 y' |/ @/ x& J - return true; // 根據實際需求修改
8 n9 [# B! Q7 ~/ Z( f9 y- k/ K - }5 @3 C( S* A3 w- _% J1 Q
- }
/ Z# M: @& J% D2 L
$ k$ [5 x% [, I+ \0 ]- // app/Controllers/Login/AbstractLoginPage.php
" Q+ E# d5 ^( ~) E. B- f - namespace App\Controllers\Login;! U6 A+ z7 w- H- @
- : y8 r+ }3 r G( K
- use CodeIgniter\Controller;
- j2 g9 B* R$ A - ; U! _) |: A, c
- abstract class AbstractLoginPage extends Controller
/ C" |' n( N1 S0 c2 T - {% e: V2 N6 U0 `- L+ a- D4 r3 r
- // 實現基礎登錄頁面功能' D+ D) N* Z+ q8 V! P2 A! M9 C
- }
- h ~( M: E4 `& U - , W5 G, o: I& M) o; o+ n* N1 x; M Q1 c
- // app/Controllers/Login/ShowErrorPage.php
. v0 k2 S, K) m - namespace App\Controllers\Login;- {. [ X5 k" u2 \$ v2 S
' K1 w7 a. |: H( E4 w- class ShowErrorPage extends AbstractLoginPage
- J7 }# ]7 I4 ]% y9 i+ G - {+ c! V/ [% u$ ?- w" w8 s6 C8 C
- public static function printError($message)1 t( ?, P0 H9 Y. g* F8 R
- {
' e/ T3 Z* K7 i& H# a - $controller = new LoginController();
# c2 G7 b0 v; h5 @' d% r2 U3 a - return $controller->showError($message);
6 r( J8 p: F2 I; o/ U( x$ @ - }
0 S& v3 p! G" X8 f0 ?# J0 B - }
- e$ f2 ~& p4 K
3 Y) `8 |; z: ^- // app/Controllers/Login/ShowIndexPage.php
! t7 u" |1 M8 n/ A7 C. |! A - namespace App\Controllers\Login;8 V2 }/ f- F: q& ^
- v- j$ u) e( R$ e- class ShowIndexPage extends AbstractLoginPage
- n$ k' u# C" C( D+ T1 p' _' Z/ f - {
6 A$ L. r6 z8 \) R$ F1 U - public function show()
[$ P; W2 G/ y, c0 A7 @9 P* S - {
N$ x+ b: s1 E - // 實現登錄頁面顯示邏輯* J+ c4 | m% M3 l' T0 c
- return view('login/index');
7 _+ W' P( P5 J+ ?1 w2 b* i; i; W7 I - }
T/ y% Z- N5 P2 ^* S1 M - }- \( b( i, A9 I0 {+ c
複製程式碼 |
|