等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14395 / 14395 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 昨天 00:46 |
|---|
簽到天數: 5789 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致1 V/ C) S8 l3 o$ i5 F
AI 就是站長的最佳幫手。
( W2 E# g8 ]- \
9 e2 ?1 m0 y# b$ K0 E; a+ Z, Y
7 Z7 |1 [4 ]0 g/ b4 o% z2 z這裡的「新架構」是指後端的架構會有大變化" U+ Q' z+ M7 h/ G/ l; g3 L2 @( A
但前端的 UI 介面玩家不會感受出來有何不同' H% E- G7 B) s- [. C$ N
' Q q( S: S* t# @
. H: G; t/ A7 g% [
為什麼站長要改成新的獨家架構?
0 o2 C. Z- Z+ |6 O$ m* g! Q: Q就一樣由AI模型來解釋清楚吧。+ h) P+ } }7 \% e$ }& I1 f
- M7 e1 ~& H8 D" t4 Z
4 l, V' B2 @6 l讓我分析一下使用純 PHP 和使用框架的優缺點:
* x; I) P$ G$ h6 X純 PHP 的優點:' _& S7 C) g2 v5 T( p q. W9 U
1. 性能較好 - 沒有框架的額外開銷8 L0 P. |; j- f/ y, L4 N1 I$ C
2. 學習曲線低 - 只需要掌握 PHP 基礎知識' A, h- j0 G5 e e9 C) ?
3. 更靈活 - 可以完全按照自己的需求來設計架構
) s6 ?5 G3 y1 Z: j4. 代碼量小 - 不包含不需要的功能模組
, x3 Y+ m: S5 ]8 \. c5. 適合小型項目
2 z7 E( m! k1 ~ _0 i2 V" w純 PHP 的缺點:7 u8 Q! U% m9 v! ]8 N E( r+ ~
1. 需要自己處理很多底層細節7 p# J! m' q5 V: C. E
2. 代碼複用性差
- S- Q! Z# s- H& \. L3 {3. 缺乏統一的開發規範( W# }$ x* K) Z' G3 t
4. 安全性需要自行考慮和實現8 R+ U2 b% r( h0 B
5. 開發效率相對較低" M1 m6 I$ z l9 j
6. 維護成本高2 m3 E4 b. ~1 z$ _" A) R, r7 a% k2 b: ]
使用框架的優點:
, e5 u# Z! J* I6 A' o5 n1. 開發效率高 - 有現成的元件和工具
& c/ @# K( e6 |$ @2. 有完善的安全機制
; E+ d4 b) e# C! V |3. 統一的編碼規範
9 p7 S& Q9 w6 `( z6 }2 E- p4. 易於維護
1 V1 G8 e: e F1 R; G9 c- E5. 有活躍的社區支持
- ^% b5 H) Z3 I- I+ X2 G* p5 U1 S c6. 適合團隊協作
' _* q( I" M6 b- h x2 P: }' M5 N7. 自帶很多常用功能(ORM、緩存等)5 e- j" q* k$ _8 M
使用框架的缺點:
" J( s: f4 j5 V5 W1. 性能有一定損耗" K3 q; v- W+ R( p; c2 h. t& y8 V
2. 學習成本較高, j' S# ]& S/ O k- Y9 @8 w
3. 可能包含很多用不到的功能5 W$ Y1 K, ]5 i) P
4. 不夠靈活,需要遵循框架的規範
/ E) M7 M1 T: F9 ?9 u% t1 r5. 對小項目可能顯得過重* ?: r- M6 N8 v, V! W, {
建議: ?" i" T7 V% J' v1 u2 \
1. 小型項目或學習階段可以使用純 PHP
0 t- v. ?9 G+ T2 D$ [0 i; {- F- l/ u2. 中大型專案建議使用框架+ |+ M( d' o5 g& S
3. 選擇框架要根據專案需求和團隊情況7 Q1 p- J& e8 a( s1 x
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇; k! B- Y& S R/ d
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
' m3 v: E1 K: a4 A% A; q: }
: a6 ~2 p' J6 e6 S' C2 k' H) n5 A" h& h& ^
3 b B- t% c$ \6 `我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。4 _$ V. R" P/ L' h* o
! m' C0 v1 O2 ~# t1 y0 `! p這個轉換主要做了以下改動:2 L3 p) b b2 J# N7 s
% T$ t: t0 R% k路由結構:4 v: e0 f0 Q6 A6 W* U
/ C$ v' s2 Y9 I4 v# o
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
3 c+ p, [9 b2 x6 x {! T5 \* |8 q. D支援原有的 page/mode 參數結構
; v& X2 H; J+ d( y8 E通過路由規則自動匹配到對應的控制器方法
1 m4 ~+ m, q; S- r
0 T& B" N2 R5 S, m9 ^
$ o, H- g: P. l& h9 [$ c$ Q( ?7 v控制器結構:
: |0 f/ `; f' r4 i O: s N B5 a* u4 _- ?. o$ T! j7 A9 ?
創建了主要的 LoginController 處理所有請求* _: w& V) g9 V1 A5 B, E
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
; M2 e8 t1 `( z, |- e: P. M' x錯誤處理改用CI4的視圖系統. E3 ^4 r8 e2 O+ c7 H
* t0 J( ~- ^% m ~6 J4 L
& B$ Y% r- @, G: a8 [; P類的組織:
3 N8 v' U# Y' k8 [: |8 z0 Z. d( c& ~# o0 q L
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
! E/ a. r2 `6 e6 H% ? f) {5 c6 @- _保持了原有的類繼承結構
- k( K; G& Z; d9 Z改用CI4的控制器基類和特性
) S, o' e6 n w1 B9 w
* r: l4 c6 {. [0 B& [3 | L
) A9 |5 I' R/ }+ m改進的安全性:
2 Q; \! k: J8 C' m) J6 C9 y/ G6 e U) X4 D# S* E; x: v. `9 q( i
使用CI4內置的安全特性) [! `6 s! {9 n% \' }9 y: }9 t
更嚴格的輸入過濾
! i0 r R5 ^, a' I4 P更好的錯誤處理機制! [) n; K, z$ t8 z
( ]( s* B& \6 |8 C* b! U0 l, a
: N9 a: f! V6 e; z4 Z8 K
+ i) f0 i- D8 k) U7 v
要使用這個新結構,你需要:
* m' k Z2 N0 q% z3 F/ ^& a4 _. M4 S8 |0 k) g' h
將這些檔放在對應的CI4目錄結構中
# U% D1 |. B' y4 f5 }確保創建相應的視圖文件2 m' I- I9 `* {' Q W+ y9 J) x1 o
配置語言服務
6 M9 E% p' R! q0 E; W {根據需要調整模組檢查邏輯
- {4 X+ y! k% d9 @) |1 W! O) O, l- T
需要注意的是,你可能還需要:
7 h' s R! Y3 {: G8 B
: ^0 n( Z/ T- Q' n4 y創建相應的視圖檔(在 app/Views/ 目錄下)/ v& s' u H* E8 I4 w
配置適當的中介軟體來處理會話, `+ |) y- ~( r; D, [& I E& {) r% u; x
實現具體的登錄邏輯. {5 m* a0 V l- L
& C; \$ c8 _* H" W
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?0 x+ }% f% f0 x# I+ o
3 b! q1 D+ o% J; C k+ F
- <?php3 x( J4 K% t" S0 D/ M& _
- // app/Config/Routes.php4 ~& \$ H" n5 O) e; t. t0 b
- namespace Config;
6 _7 @9 q& |4 g$ A _ - - `4 H4 m. a' l4 w2 a
- $routes = Services::routes();
7 _7 s& H* [/ b: ~8 l( f; _ - & U+ \, w9 F$ ^/ n/ i9 A! ~
- // 添加自訂路由規則
( c3 m" Q l$ ?0 I- _ - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
" _( \4 e4 `/ m& Q7 x( x' Z - $routes->get('/', 'LoginController::index');8 M- D5 @" p" d3 b( w+ a) j
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');& N9 z- @. k! U% Q+ l5 s& E
- // 默認路由處理. E0 O7 c8 R, T
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
; U6 n t* b3 Q" `. Z - });! D+ R e( L; t( p. X5 j
- 4 R9 `" H9 W. g
- // app/Controllers/Login/LoginController.php4 F3 O* f k7 ~/ \* K% i% S% v
- namespace App\Controllers\Login;
% ^0 f1 y3 \0 P2 p' p
9 ?+ Q/ e, C- L- \0 h, Z- use CodeIgniter\Controller;" Z/ r) O4 j' ^+ Z* l0 n* {) ]
- use App\Controllers\Login\AbstractLoginPage;2 ]; F0 s% z- k5 @+ L, s: {
& n. k4 b- t- `( `. m: l5 V* E- class LoginController extends Controller2 Q( F7 N4 k- o
- {
( M2 @) i! }" }7 H - protected $pageObj;
0 b7 ]: b% t+ A' D) O; H: @& g - protected $LNG; // 語言物件, w1 Y# X, p! B) Q
- ( k* Q$ x5 g G
- public function __construct()
$ I" j% e5 ?. p5 c# s& | - {9 y2 T% `; S/ g. {9 o$ h/ }* Q
- // 載入語言檔和其他必要的依賴6 p7 b) Z! i' e
- $this->LNG = service('Language'); // 假設你有一個語言服務
$ W8 {$ w' r/ k/ J - }
+ {: t' q6 Y, j. I' I. S) p - & X' @+ n% {4 o6 z* L: j
- public function index()
) B& P! s( Z" a" Q7 t7 X - {4 e5 k' d& |; H0 @0 I. K
- return $this->handle('index', 'show');
7 ^7 H7 o* [8 y7 m" G8 ` - }0 t, r% t- L4 O2 B$ `4 y$ N5 B
- * ]7 ?' }& z; Y& H* v
- public function handle($page = 'index', $mode = 'show')
8 K0 _9 y# W! p( Q; U! o - {. A0 n5 b) _! m5 G# Q+ M3 v: V; P
- // 安全過濾頁面名稱+ @6 D. Y) d5 T/ Z
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
* }9 {; n% [; L- ~; h7 K - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
! ]- P+ x+ @- R1 H: X -
9 o5 C7 C9 T( [0 g1 X) Q# P! Y - // 檢查類檔是否存在
3 ~9 A- ]/ |5 Z3 I; S; N! Q, L) K$ I - if (!class_exists($pageClass)) {
5 a& e/ M$ D. y) F; ~7 E, ` - return $this->showError($this->LNG['page_doesnt_exist']);
+ O+ L" N, r4 A/ ]5 S( y; ^' P - }# c. j2 u! v0 b
: h4 x3 F# q8 X( r* G7 w4 ?- // 產生實體頁面類
) U3 o5 O; p0 J1 N. t - $this->pageObj = new $pageClass();
6 v6 ]$ r; s9 \ -
; L4 @- T# J) B4 H - // 檢查模組要求5 [* ?6 f) G% z+ a$ I; {
- $pageProps = get_class_vars($pageClass);/ `7 w4 g" E V& q7 I" c( X
- if (isset($pageProps['requireModule']) &&
. @; U6 Q7 z, t! {/ `- S4 R9 p$ S - $pageProps['requireModule'] !== 0 &&
0 J- f+ {- H) t! M; e/ J7 [& O - !$this->isModuleAvailable($pageProps['requireModule'])) {' \3 r3 ?8 c b9 Z0 m) S$ [! w* J
- return $this->showError($this->LNG['sys_module_inactive']);2 O3 q; `! I( L r3 j
- }
- S/ G9 t& {0 X0 G) l: v0 t8 C6 c9 n - 4 n& g/ u8 y3 n8 k) X2 W, r
- // 檢查方法是否可調用7 x* T3 |) E$ ~# P
- if (!is_callable([$this->pageObj, $mode])) {
2 {9 d4 `1 O7 ^, D( s, a' R - if (!isset($pageProps['defaultController']) || 0 G9 {# c, w0 C* ^! ^* J; h
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {! P5 Q4 C' C; B m( U' Z8 j
- return $this->showError($this->LNG['page_doesnt_exist']); E( W0 \: L# B; O
- }( [6 p1 ]& n f! j6 ~1 k a: {3 [
- $mode = $pageProps['defaultController'];5 S0 y& K1 F! _3 W$ |5 g
- }# ~) z9 M4 a( W* \/ R/ c
- + c* |4 \7 u- q. d& @! |
- // 調用相應的方法8 N: L! i8 _* B2 g
- return $this->pageObj->$mode();
5 s# v) I. N% m& ` - }
! G4 V+ ?. P, m0 K# z2 [
- L3 R# I/ u0 i) P* [3 @- protected function showError($message)9 {! q6 L7 k4 ^1 M: c9 Q
- {$ T7 H V4 f& }( l7 u2 p* v/ `; W
- return view('errors/custom_error', ['message' => $message]);
- |2 g) M( s o! X& P2 u J - }
5 s6 g! m3 f( \5 [$ f. d
+ k- k" k' j* y7 F- protected function isModuleAvailable($moduleId)
# X8 c0 n8 q! y$ Y - {. B& W/ ^0 o a
- // 實現模組可用性檢查邏輯
6 b% s2 @0 p" y! B8 v* S( O* N7 r - return true; // 根據實際需求修改& l: k# q/ J# P4 b, q
- }" b3 w% ~ \4 D/ U3 |
- }
% a: A( d. m8 P8 S% `
1 L8 ~! I1 f6 _; \) O" _- // app/Controllers/Login/AbstractLoginPage.php0 _" ^3 ?8 j6 F6 P: Q8 T
- namespace App\Controllers\Login;
2 P8 Z9 \+ Z; s% @. G% k - u, [4 q8 f4 u3 w8 ~
- use CodeIgniter\Controller;
1 Y6 y0 e: l( X$ k. { - 0 j# R y/ R0 |* \
- abstract class AbstractLoginPage extends Controller
# w# L- ?0 _- l: \9 f1 \1 R5 R; ^* o - {
/ X6 |6 K, ? a5 W: z' M# X - // 實現基礎登錄頁面功能2 N+ x5 `8 ]5 ^# Y% b/ n
- }, g# s4 j7 o% }. B! H
- " ]5 D- O7 T0 U7 c3 Q
- // app/Controllers/Login/ShowErrorPage.php
1 b) [& v6 k* M4 T - namespace App\Controllers\Login;0 T# i$ |1 ]) X2 X# l
3 {3 K1 O0 B; x n+ Q. W! |- class ShowErrorPage extends AbstractLoginPage
# h3 h! W; @8 _: W% V) _6 z - {2 L0 O; k' M- e
- public static function printError($message)% ^: C$ q& U/ D- A9 ~6 Z% u
- {* f ^8 h7 [* B' W
- $controller = new LoginController();* A6 b2 C: z* Z8 C5 l0 g5 H2 S
- return $controller->showError($message);' o7 B. u/ X1 K2 e7 R! ] Y
- }
* T# F4 y; c8 m3 {( M$ I1 d - }
% u: h2 |; K1 n; q
& S, a- ~# W" {5 D' f4 g6 u- // app/Controllers/Login/ShowIndexPage.php
* {9 @, b7 n+ a - namespace App\Controllers\Login;; N* c7 I) S3 R. G3 b
" H6 O' Q9 i* A8 N [- class ShowIndexPage extends AbstractLoginPage- p; `3 p! d; _) E) z# B5 x
- {3 m9 V |6 H5 e5 y
- public function show()7 I* F# a$ q- B; m
- {
$ X$ a- @: g) I, G - // 實現登錄頁面顯示邏輯3 i5 Z8 [0 ~" F. r* ]7 b
- return view('login/index');
, h0 _5 `* n; ] o - }
+ _0 b5 T! G1 p) F+ \. o% a. j - }/ z0 p( C- p) E* ?& _/ T: V$ T* w9 C
複製程式碼 |
|