等級:25 - 爐火純青 經驗值:0 / 245 魔法值:13940 / 13940 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 昨天 14:52 |
---|
簽到天數: 5627 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
. w+ n. Q8 G6 i: P% S; Z8 eAI 就是站長的最佳幫手。' G0 a' Y9 X( ` G, T; L
3 n' K5 o( U$ h% ~% s$ T3 K% T
2 a) c0 @8 D* o) k這裡的「新架構」是指後端的架構會有大變化
N3 h- g6 B' `) A! e但前端的 UI 介面玩家不會感受出來有何不同
1 t( H, l* h* z1 m* f* q+ L$ c- \& E* ?* ?" I' w
7 E5 h0 l4 N3 L9 V1 v
為什麼站長要改成新的獨家架構?
* a4 m8 Z# ~/ u就一樣由AI模型來解釋清楚吧。
2 f) ^0 r& H" k9 C0 P0 e* X
; ?6 o- ^* i$ n3 v9 d
8 t+ y J$ J# g# L4 ?* Y讓我分析一下使用純 PHP 和使用框架的優缺點:! ^6 A' d, L) }2 v
純 PHP 的優點:2 u% T( N3 F; A/ |# q
1. 性能較好 - 沒有框架的額外開銷
) w. D+ ~; t/ A! a9 V2. 學習曲線低 - 只需要掌握 PHP 基礎知識
0 n% _6 v5 Z, l$ ]2 L3. 更靈活 - 可以完全按照自己的需求來設計架構* j, h- K2 \* `4 c. }$ N
4. 代碼量小 - 不包含不需要的功能模組. @" k& B/ j/ X) {, b* Q( X# @
5. 適合小型項目7 e0 N. H1 c. P' x: Z" N
純 PHP 的缺點:
" f: m9 x& f- r3 @1 U( ?1. 需要自己處理很多底層細節
, U6 V4 f3 o m# Y. L2. 代碼複用性差' r) K$ H& V# ? ^
3. 缺乏統一的開發規範
" D j' `- J# }4. 安全性需要自行考慮和實現9 T# U) E" [8 O1 t
5. 開發效率相對較低
% V+ U% i4 Q2 h- R6. 維護成本高
2 `. Y: G7 ~* t: |" J% w! Z( I使用框架的優點:
9 g" a# Y( \" [" o. V1. 開發效率高 - 有現成的元件和工具
; L# J) s) y: A$ N% p. H2. 有完善的安全機制8 I+ M+ P# a, Z* C. x" H
3. 統一的編碼規範
$ T: R* }* @) |/ z% C4. 易於維護+ E: X" J2 X# M3 N2 N6 U
5. 有活躍的社區支持+ ?4 w3 S0 V7 {4 G% @
6. 適合團隊協作
. k2 ^7 }' H: T: D7 y: T7. 自帶很多常用功能(ORM、緩存等)% v$ b/ P6 y# J" g, Z8 I) h; H
使用框架的缺點:9 c7 P# y" ?* g, `
1. 性能有一定損耗
" B5 y% X9 f$ l5 k4 c& e w1 k7 d2. 學習成本較高
0 _$ v# b: K9 G* G3. 可能包含很多用不到的功能! c7 @* K- n ]
4. 不夠靈活,需要遵循框架的規範
J- o0 u9 R6 b4 a5. 對小項目可能顯得過重
8 X3 p9 c! I* v) Q3 y3 y4 C/ J; x. {建議:
" K* x+ \2 P1 ^: l8 v+ w; |! q1. 小型項目或學習階段可以使用純 PHP. r6 I; @& p( P; U' D. T" z
2. 中大型專案建議使用框架
' T! y3 R! S* D9 l# v0 {3. 選擇框架要根據專案需求和團隊情況- T! O5 O4 |4 Y2 C; e( O
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇, d8 h( d' X" A/ ^
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。8 x/ [+ B$ i% @
4 h% F) S9 w" l0 Y. b5 \# \4 g* X/ \
5 L) h# W: }5 V( @: {- ?
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。/ P4 A2 m! o2 N3 D; w/ [
6 h8 @+ W2 L0 V) f B* p& H: X$ h
這個轉換主要做了以下改動:7 k/ z9 U, V4 b7 F* e9 O
( k; m! m" [9 v J( g
路由結構:
8 S" R+ a6 C/ C7 z3 z# _2 B9 e, k, T
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下8 P& g$ U: a! ^ o" W
支援原有的 page/mode 參數結構. h6 o& z7 r7 h
通過路由規則自動匹配到對應的控制器方法
* h9 B" r9 B7 a% j
$ ^5 z( k7 g9 h( F- m1 S( o; {9 M. A7 ]
控制器結構:
. r) J8 G H$ g0 L% N$ `5 \, ~. S; x9 k2 H6 b& a5 Y# j9 y+ N
創建了主要的 LoginController 處理所有請求+ x8 W4 t0 ]0 g6 X/ _
保留了原有的頁面類結構,但改為符合CI4的命名空間規範
8 b% _! O5 n( z8 G$ K錯誤處理改用CI4的視圖系統
7 \* n: `1 k6 |9 ~5 h6 i2 J
2 W6 m7 r0 A+ B8 B* c! w. V
6 A+ |" e+ W6 R5 u( D4 n( \/ e1 y" w類的組織:
; g$ n5 U( y) e1 B ~8 H
W; F8 G: ^4 |/ w+ b" r, R! ~所有登錄相關的類都放在 App\Controllers\Login 命名空間下
7 p4 {9 N. P: R4 X% t! v7 }' `% _保持了原有的類繼承結構
. d5 R' |- P! D改用CI4的控制器基類和特性
$ d e3 V( }2 [5 I" e9 D% ^) Q. z4 t# m, u$ ~) y- F1 @
5 y3 c: V6 j% T3 Y- y1 K' ?改進的安全性:& e0 v9 g/ ^* E, w& e! `
6 @2 Z5 E4 x: D+ g+ _
使用CI4內置的安全特性9 ?* z) u& d( c- ~8 c5 Y
更嚴格的輸入過濾4 s8 x1 Y& {- M
更好的錯誤處理機制. A- k/ R) [' q% y2 G6 ?% {
0 j; ^$ r P8 ]; |1 `
x V+ }4 L/ k! w- P* n" _
9 e# c8 Z( R8 s; A) {1 ?/ L& F要使用這個新結構,你需要:4 K# j) z& {, C, \( L9 |
9 B4 g1 z# `2 o: X8 {" T2 p: q
將這些檔放在對應的CI4目錄結構中' Y7 s9 z e# T5 C1 E$ w
確保創建相應的視圖文件
% ]0 u( X2 {0 } H% S; D0 Y' y& ?配置語言服務8 _) J( ~$ @' W; @
根據需要調整模組檢查邏輯
# Z, t* n. W0 f7 {) Y8 _* h& c/ G7 [4 P2 a3 z0 K1 N
需要注意的是,你可能還需要:8 `9 w& O; X8 i$ @
W/ O) @! O5 B; T創建相應的視圖檔(在 app/Views/ 目錄下)( l8 e2 K5 w( o. r5 T
配置適當的中介軟體來處理會話- @5 w2 X, V/ T# t; _; Z
實現具體的登錄邏輯* x' ]/ ? E$ X- E5 i' C) T
7 M* \1 j; v9 O7 V需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
, ^5 S) r; c, n$ ^1 {. L, F$ \; Z$ Y# z% d" ?
- <?php; q1 Z( m9 b+ Y2 W: f k
- // app/Config/Routes.php6 _; z$ Z' R6 o* f; [
- namespace Config;
) ~ V4 R" Q3 u; g! t2 C+ l
" i' k" @- ^3 g B5 N3 R% h, O" j( L/ \- $routes = Services::routes();7 q% W5 i Q+ { F
- " V' [6 a2 h% l5 D% K' S2 M* [
- // 添加自訂路由規則
+ c+ v$ g. E8 x7 f H - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 D r" t$ I5 g4 q8 y( |
- $routes->get('/', 'LoginController::index');8 ^7 \& Y# I, i9 Y$ x( L3 D
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
) g: t! Z$ K+ D- e* x - // 默認路由處理
' d, T6 Q# F. Z. `% j' j& i - $routes->get('(:segment)', 'LoginController::handle/$1/show');
, ^0 g5 h' c: T* x% s' D - });# j# P0 V7 z# j1 e" o6 y' D
- " C* g; g3 Z8 E- J% O; w M. m
- // app/Controllers/Login/LoginController.php
$ t1 x/ o c$ j - namespace App\Controllers\Login;: s+ {0 n# |; h
- U2 z! ~8 p! d3 k+ x9 F) ~- use CodeIgniter\Controller;
2 I* w+ P7 p; e - use App\Controllers\Login\AbstractLoginPage;
1 z3 i' }; a1 x0 B
. F2 ]# x! K4 y5 U- class LoginController extends Controller) h: ~( Q4 _# J1 F. \* l9 B
- {) Z: ]8 z/ `3 ]7 t& j' ^7 `
- protected $pageObj;
1 w; c, [% f9 |+ j6 @ - protected $LNG; // 語言物件3 h) @7 f( u0 A* S/ W& I
- % F% {* o4 u, @% |7 c
- public function __construct()
' i# F$ r% S3 r1 f( Z2 L, S - {6 }1 Y- v+ U1 p( y8 |+ G! `
- // 載入語言檔和其他必要的依賴) O! C) Q3 e. T2 O7 S7 Q, R
- $this->LNG = service('Language'); // 假設你有一個語言服務
& Q4 t. S, U# P) Z" k- ? - }9 F8 `+ d8 K+ O; ~% r
- 7 H3 B U# a2 \* f( c/ a- }
- public function index()
$ u0 R2 L) m/ ]% r3 ~4 y# ] - {# E& s9 O% Y" v& T& Y/ p% g) k
- return $this->handle('index', 'show');
4 J7 [* l' a; q - }
! f% Q/ M f3 A3 X V, K: k - , j: _4 ~" Z8 g) L
- public function handle($page = 'index', $mode = 'show')
0 ?, q0 o/ K0 r5 s - {
! z& S" `! o; ^* y) V - // 安全過濾頁面名稱9 a9 U3 v4 W, V# [+ b5 b
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page); V l( f. U4 C7 P2 N$ M+ d
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';% O' N8 Q+ H* z1 L+ g5 I' p5 n+ A0 H
- : t H# x! V7 R/ {( F. ]# t
- // 檢查類檔是否存在9 U) g7 `6 `) R& t' n
- if (!class_exists($pageClass)) {# N: |* ?* w# z S: u2 l$ p
- return $this->showError($this->LNG['page_doesnt_exist']);
* N. l* u) V: {1 O V - }# c: a. X' F3 d7 N9 _
- # O* P1 |8 s2 D V9 d: E
- // 產生實體頁面類
! W9 L( b( Y1 A7 ] - $this->pageObj = new $pageClass();2 F, |9 w2 c" ?/ J
-
% _: `% d5 z( ] - // 檢查模組要求
7 @5 v) Q& L! v- C3 }1 z$ t: R! x3 M - $pageProps = get_class_vars($pageClass);, w' p' r: G, V* q5 I( H, g4 A8 L @
- if (isset($pageProps['requireModule']) && " v5 H k2 j% R! k1 h6 E- ]
- $pageProps['requireModule'] !== 0 && i1 y9 ^& N! X- Z: E8 q3 X
- !$this->isModuleAvailable($pageProps['requireModule'])) {
9 k* \1 _6 J) t/ v* h - return $this->showError($this->LNG['sys_module_inactive']);7 z) d* C+ f$ B: r. V9 E6 [
- }7 f5 R( R }+ r' ~1 ^0 X% G* ]
# B# l% `) A9 M7 b& x- j" L- // 檢查方法是否可調用
; Y+ A' v ^0 T- c. n [; D - if (!is_callable([$this->pageObj, $mode])) {
M- S' Y8 g2 w S) D; X - if (!isset($pageProps['defaultController']) ||
. m9 g/ R. O) {5 e9 Y! S8 q) y - !is_callable([$this->pageObj, $pageProps['defaultController']])) {, g! T8 _2 h! A5 x% L. z+ O. v, v
- return $this->showError($this->LNG['page_doesnt_exist']);& H, D8 Q& R4 \7 S
- }) I s. M7 A1 N! F
- $mode = $pageProps['defaultController'];
4 R: C0 h9 m% F8 w; } - }/ _9 R3 k9 t* T: U7 a. q: x
- 7 r) S* ?5 }3 k/ q" [ x( ]
- // 調用相應的方法( g. i, ~: J. ?- c8 O4 O
- return $this->pageObj->$mode();4 A7 i1 F6 \' ]$ ^7 T! `5 F
- }
* B0 r4 f8 @+ h! e
* \4 X, U2 C4 E1 O! o$ F, V- protected function showError($message)
# t5 W1 W8 j5 U2 f E w' {" L - {
1 { y8 |5 h/ E - return view('errors/custom_error', ['message' => $message]);
3 Z7 P& O# [* @. F* O: {, x; {" I8 a - }
: N% U6 t! @3 _0 J
8 @' q! u+ c) W7 {# L- protected function isModuleAvailable($moduleId)
( L- V9 g2 C/ O# H7 n1 E6 `0 P - {
5 v5 v2 W8 d! @6 f; D8 ], s - // 實現模組可用性檢查邏輯( H, X7 V: C3 H/ s6 E, n- |
- return true; // 根據實際需求修改
7 B$ W; o7 _, c3 Z - }& X8 a: y/ h, ^, d# _5 n/ Z
- }
7 h% | ~2 R; Y - % B3 q5 f+ H6 y
- // app/Controllers/Login/AbstractLoginPage.php
3 g& r: d8 I6 m- q- E2 w - namespace App\Controllers\Login;
4 f) ]8 o$ D% ?9 n$ Z' d/ G7 d1 J - : o# N; R; |; A/ G, r8 S' M Q
- use CodeIgniter\Controller;8 N( v l( |% z+ y6 V
/ j m& x1 ~1 x! F8 S- abstract class AbstractLoginPage extends Controller
* Q v& i0 B7 v B8 B - {
, L. Y: O7 a9 m2 I - // 實現基礎登錄頁面功能
8 g0 Y3 H. m" k. k - }
0 p: X# ~- ^( e: s
* _- _5 M1 u4 `, c& |" Y0 w9 o- // app/Controllers/Login/ShowErrorPage.php
. l0 i+ _, @/ Q' V$ F( u5 Z - namespace App\Controllers\Login;# y9 v8 w d9 e+ ^/ i. ]3 x4 q4 X; h
: F& X [: i7 ~7 _9 c# l* y9 b- class ShowErrorPage extends AbstractLoginPage" Y$ ?7 Q, o1 P7 O. k
- {' A3 K. z0 z/ j; U n5 D* t w. \- s) _
- public static function printError($message): V( W; G8 p! w' p+ ?7 u, @1 ?
- {7 ]. d. b: Z2 C$ ~
- $controller = new LoginController();) Y' _* j0 |5 e: q4 h+ T/ i
- return $controller->showError($message);. j U; C- }# K
- }$ g. k ~3 l1 _3 V! y
- }
% @4 G! r* |' K T: E: N
/ E% m7 R5 D7 [2 [: e! z- // app/Controllers/Login/ShowIndexPage.php3 d) M4 r. d, `. F" m4 J
- namespace App\Controllers\Login;5 M$ b- J: U$ z2 B$ Q
1 ^: m4 Z; d( {' I0 v- class ShowIndexPage extends AbstractLoginPage* A+ T6 U: V" N; ]
- {
& F$ E# }* ]3 k" D - public function show()
* J' Y, J' w6 C6 Q6 S. ?* Z5 q - {
' F2 P- P7 \4 I* C$ Q) b9 ^4 J - // 實現登錄頁面顯示邏輯# U. |0 v4 g4 @" m( ~
- return view('login/index');
* G3 r2 W6 S/ ^' } - }
9 w; n$ l7 E8 I, R - }3 g* ]% F5 q- [3 W
複製程式碼 |
|