等級:25 - 爐火純青 經驗值:0 / 246 魔法值:14936 / 14936 生命值:6%
升級
  100%
TA的每日心情 | 奮斗 7 小時前 |
|---|
簽到天數: 5943 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
% e* p+ ~0 t2 p7 R. T0 d! v4 B; bAI 就是站長的最佳幫手。1 v A" \2 J2 s1 S
7 K; Z2 u4 h0 ?* T5 H$ _1 W. s5 i. i# t9 H! T
這裡的「新架構」是指後端的架構會有大變化# H# ` ~, T; R, I# s" c+ n
但前端的 UI 介面玩家不會感受出來有何不同
6 U9 W1 s7 ]+ n; t
5 Q/ }( h, h0 ~8 ^; ~
! A$ d7 j& a1 P; a) S; O9 K為什麼站長要改成新的獨家架構?! W, q+ n! [! J6 G
就一樣由AI模型來解釋清楚吧。
/ z; m# y9 {5 A1 ?3 G( \4 b: @1 C+ a
" R3 T! ^9 h4 z; V讓我分析一下使用純 PHP 和使用框架的優缺點:; D3 A/ D! e9 k! F: s# T3 z. m
純 PHP 的優點:
" e1 P- |5 y4 B1. 性能較好 - 沒有框架的額外開銷
" O3 |7 R- c. C0 \' Y6 s2. 學習曲線低 - 只需要掌握 PHP 基礎知識
: |3 F4 f) p7 d7 R' S* p! q! A3. 更靈活 - 可以完全按照自己的需求來設計架構 h/ P& K- h' H: L) a
4. 代碼量小 - 不包含不需要的功能模組* [; j8 }: M4 {% p" o+ T
5. 適合小型項目
: {1 b* I* N+ p純 PHP 的缺點:! T. A& Y: z; X
1. 需要自己處理很多底層細節
& F, z7 _. v2 F$ e. n% C2. 代碼複用性差
, a: A/ `8 m; [% f3. 缺乏統一的開發規範
# ?6 G8 i& c( B, g% C% D* q4. 安全性需要自行考慮和實現: C) U9 m. E) C- \2 {
5. 開發效率相對較低7 x0 @3 F& ^% D% H
6. 維護成本高5 B) W i+ c) u% d+ y# R! F0 U# a
使用框架的優點:- ?+ r% d' N8 B# j- P- ?
1. 開發效率高 - 有現成的元件和工具
6 K2 `6 [! v1 e+ w- _2. 有完善的安全機制
9 B" E: D; f6 @3. 統一的編碼規範
& K% O5 R* [6 A& `; u" W4. 易於維護1 m! o# X6 b! C% M$ l. Q$ B! P9 ?
5. 有活躍的社區支持
0 p# N2 K; S# s7 d U0 ?/ R" C6 `6. 適合團隊協作
# h0 i1 ]) P& e6 q* k+ z7. 自帶很多常用功能(ORM、緩存等)
+ j: a9 ~# T& E0 s使用框架的缺點:
8 F" |' u; Y( s# s; X# _/ z5 E+ k1. 性能有一定損耗$ C% W" {) F) ]/ c4 @9 j4 I
2. 學習成本較高
; M) U" }, Y8 D2 T$ F3. 可能包含很多用不到的功能
8 S3 e! M6 ^! X1 M$ E& D( k; f4. 不夠靈活,需要遵循框架的規範
1 S: q. H2 B9 F2 Z4 }% T) ~5 c# @# A5 Q5. 對小項目可能顯得過重
+ K, n0 ^9 |2 Q* u' M/ C+ p- u建議:- s! m! o9 L0 ^* H! a/ l
1. 小型項目或學習階段可以使用純 PHP( |: A- O+ ]( h+ N' L/ s
2. 中大型專案建議使用框架& f* I" v' N' i5 ]. T$ O$ t3 U0 ^
3. 選擇框架要根據專案需求和團隊情況
7 L' z+ `& b& q& a6 k' y' X4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
$ y: k5 k8 N) V+ Z4 h您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 g5 R0 i4 H* R, H$ g
( }% h0 [' v% }8 \ s% R
( \: @ I" Y, E4 c8 [6 p0 }+ L% L! |3 s# T2 t: J- h
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
1 [% F6 a) _- |# k
- D+ t5 D! | q4 z. q2 p這個轉換主要做了以下改動:7 p2 y/ w1 ~8 g9 C
# H4 K: J6 Q# r
路由結構:
+ d* e. X) x6 J, Y+ }' a5 j; n+ T7 T5 a7 _" N
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下* [5 J) f& G! Q4 N% P% x/ r/ S
支援原有的 page/mode 參數結構
z) o4 i7 M9 ^# Y1 L: {通過路由規則自動匹配到對應的控制器方法
& w5 J u" T1 O, A! }4 _& S5 Q# t9 Q4 Q- e: {6 L3 J4 |0 }% n; v% X
% V1 H" ?! i( ?2 W0 E u$ Z控制器結構:
6 ]9 f5 z3 O' W6 b' F$ ~) s; b- { L% d% O: y
創建了主要的 LoginController 處理所有請求
# M5 ^ b1 _& Z3 y% }, b保留了原有的頁面類結構,但改為符合CI4的命名空間規範, ]0 _9 C. l" P5 O
錯誤處理改用CI4的視圖系統 y, o% u6 }5 @! h9 H7 C" n
4 [. @- Z& W; E" k$ C
% \; y0 {9 M$ a& ]/ l2 c. t& `類的組織:
' I) B9 g# Z; A$ X% g+ d( {7 ?- @4 o n; t- u
所有登錄相關的類都放在 App\Controllers\Login 命名空間下
. Q( Z- c/ @9 {保持了原有的類繼承結構1 Y4 b/ {2 o R* L
改用CI4的控制器基類和特性1 f" ]: Q* E _, v# n% l1 |0 f
" T% t6 i7 x* t+ E" K3 K
6 {% d$ c1 [) I+ K0 T3 A5 k9 Q
改進的安全性:( ?2 I6 I( d( v+ v
& c$ p; L6 h E+ h Q* O: ^使用CI4內置的安全特性
6 b- }, b! g7 A# e8 J更嚴格的輸入過濾
; {6 }& ]( u) [* S v更好的錯誤處理機制3 w. M p' m1 ?/ G$ f, Q) c/ D
, U$ Z- c1 o; B0 j) j
4 f+ h4 z: V$ V& {0 F3 `* c* Z8 c7 t( }9 L4 K2 P3 K! M g/ L4 j
要使用這個新結構,你需要: `4 y% B: `/ ?' F
" z& C( Q) B8 W+ W; V& V將這些檔放在對應的CI4目錄結構中
7 I; {* }% A- u# Z8 q! r確保創建相應的視圖文件
# b5 ^- {$ G* g- h; A6 k: b配置語言服務
/ J5 w P$ `* s2 J+ i根據需要調整模組檢查邏輯8 k6 t7 K r( }0 Y, v) m) P
" i# l2 t( f3 {9 R% j# D$ C; {" l8 w' |
需要注意的是,你可能還需要:0 x0 R" }. n+ p# S: o( m# E) H
) Y1 ^; B) G' z% x& q0 Z
創建相應的視圖檔(在 app/Views/ 目錄下)- X4 W, U+ s4 x* x2 S; ~
配置適當的中介軟體來處理會話; T ~% U: p7 q2 v3 Y
實現具體的登錄邏輯
9 O+ q4 {9 F1 O v
6 ?; c' @: V( Q0 V+ C) `6 q- t {需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?( |3 o5 F6 g3 O9 V
2 K- u; D0 k1 [( L. L. t# r8 @3 h- <?php0 C6 o/ @/ N; G8 Z# Y* }
- // app/Config/Routes.php) A5 z) K3 h1 E" U5 i; ]
- namespace Config;" `7 K; g1 r6 J' Z s
! ?9 i) X G1 r; X) @& d- k, f- $routes = Services::routes();
% k/ l! g& Y$ H/ O* }, k6 V. r/ f - / p) V; f* q. f3 b( X2 U
- // 添加自訂路由規則
9 K- ?& d* F( Q9 q - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
+ O, E/ e O- @1 c - $routes->get('/', 'LoginController::index');
- g4 J$ M! ~ I+ a$ c# H% t - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
8 a0 m" C9 j; A5 E& L# ? - // 默認路由處理1 H8 l5 I2 \$ E$ D2 [7 v s
- $routes->get('(:segment)', 'LoginController::handle/$1/show');
( |: _& ^6 J, t2 q& c - });
4 I4 P' Z- r& C) I
0 n, k0 v7 B8 `2 t9 v3 H* c- // app/Controllers/Login/LoginController.php
! X( {1 s# U; Z; {" f9 I( h8 K P - namespace App\Controllers\Login;
, ?. d: l1 n) p2 x( ]
2 s% b5 R# j* k" w! `- use CodeIgniter\Controller;
9 [) H7 y& v- }* C) b9 \; g - use App\Controllers\Login\AbstractLoginPage;, q* ?. R, l& Y4 p& J# [
- $ l0 P& F- ?( Q+ s$ V
- class LoginController extends Controller& V1 U0 n8 ^$ Y6 k
- {7 ~2 q0 |# L& p7 i' t0 s. M
- protected $pageObj;5 L( Q' N" J3 n" l$ N5 O! G
- protected $LNG; // 語言物件
2 i b K4 n0 V1 u+ b) @- r" `
1 o7 b. `; ]. z- public function __construct()
% E" O! K: b* ~4 C# N6 K4 Y: n - {
( g" V; c6 |# q1 X k; O6 {" i - // 載入語言檔和其他必要的依賴; |, f/ g5 |- M8 x
- $this->LNG = service('Language'); // 假設你有一個語言服務
; @: x3 A0 v# G7 f8 v - }
, x' L' |/ A) @9 R1 B
# s& K! {0 k6 \. ], e; u- public function index(), ^5 ]1 ~2 f# n! Q7 B; t
- {1 m Q# L8 m8 ^2 Z5 M# x9 E6 s
- return $this->handle('index', 'show');7 M+ i' C/ m& I( ~9 G& e9 c
- }
- [ V2 F9 H! k. V# r7 p) C1 T - # w% x4 c( Z4 k6 @) r
- public function handle($page = 'index', $mode = 'show')& O3 O% M' h& F+ Z+ w: V! F
- {
! R" L( ?3 j& J# m' A; j, y - // 安全過濾頁面名稱2 {; }' S; b/ ` @$ ~
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);8 h7 b# W/ ?6 P: A+ b) ^% ~
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';/ E! S; c+ A/ v7 B# m- ?% W! Y
- 4 i: I9 S; j% t d5 V
- // 檢查類檔是否存在
* M$ H- O/ Q* w( c - if (!class_exists($pageClass)) {! X$ }. s" R7 g' p* `) p$ P/ N
- return $this->showError($this->LNG['page_doesnt_exist']);! v2 x1 y# X* |+ y% ^/ |
- }
$ w8 P+ R, B) R) R9 q - ' h% s: g# y2 q' z8 a
- // 產生實體頁面類
5 ^; L! {/ M- o2 W0 @9 ]/ J - $this->pageObj = new $pageClass();$ }3 { N, l" O
-
- }0 j& Q5 V6 C1 o - // 檢查模組要求$ d6 n& V- @: e! x5 V6 c: E
- $pageProps = get_class_vars($pageClass);8 m' C- I4 D: i/ G/ C M
- if (isset($pageProps['requireModule']) &&
8 w' V' E9 H Y/ h - $pageProps['requireModule'] !== 0 &&
2 D* x- ?; F9 p& s - !$this->isModuleAvailable($pageProps['requireModule'])) {
: }! u% n1 q G6 g3 [: Y - return $this->showError($this->LNG['sys_module_inactive']);8 E, _' U4 g [* w, y* Y
- }
& r E( M2 F) q3 C
% c; e: s5 J; K, J! W: d% n- // 檢查方法是否可調用
& N1 q1 Q3 f2 u) ] d - if (!is_callable([$this->pageObj, $mode])) {/ A2 [% V- F6 x2 K" k
- if (!isset($pageProps['defaultController']) ||
+ E2 d2 k! I) s! W, C% C8 h% \ - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
1 |. g! v! F8 G6 V6 { - return $this->showError($this->LNG['page_doesnt_exist']);
# G ~. T2 d% n0 v$ w3 ] - }* x4 ^4 Q: U/ ^
- $mode = $pageProps['defaultController'];
8 j& G0 V& b6 ^& d# @ f - }
3 A1 ~; F b. C" z1 ]! z9 @4 G* O - , g; }4 Z) r1 N s- Z
- // 調用相應的方法$ `" _ [# o( C) ]! W
- return $this->pageObj->$mode();( M8 a. R- r, |, |# A) b3 g9 q3 f4 U
- }/ \- X: x3 Z: _/ q) v+ _
- 3 a5 V1 U9 l) _
- protected function showError($message)! e4 \3 b% j0 r* Y% L
- {
( r$ i& T+ s; F& p) N - return view('errors/custom_error', ['message' => $message]);: r" j9 M X" g
- }
" V0 M/ U& O" u- b* `
, B( B; V% y1 u' w6 j- protected function isModuleAvailable($moduleId)7 @! D1 M% l3 F7 X+ S
- {
- |4 c$ V6 X( O* r - // 實現模組可用性檢查邏輯 M u/ p2 E5 p) R- f
- return true; // 根據實際需求修改: x$ n6 ?$ M& E$ l& f- x
- } |# V& L4 I! T2 L
- }, P0 T+ j8 I) ^0 C) A7 z5 w+ F: w. Y
- 2 y& ]& ?6 i4 m8 L' R- ^# O% f `9 o
- // app/Controllers/Login/AbstractLoginPage.php4 x' }0 T: o4 \3 N% {! u
- namespace App\Controllers\Login;
/ K: M6 ~$ R6 A- P. S( p" Z
, `) E9 v' V# G+ @$ h! |: d y- use CodeIgniter\Controller;; X, e6 A" l: e; a [* O
- $ `* U" c3 w% @0 |; ^. E
- abstract class AbstractLoginPage extends Controller
+ i* x8 k, K& S# U - {3 n# U& r- R1 c
- // 實現基礎登錄頁面功能 `$ b! x, z$ ?5 U% P. t6 x
- }
6 n1 [4 r% C9 R1 A# n0 I4 c - / N G" q+ {+ C* s
- // app/Controllers/Login/ShowErrorPage.php
* c o B1 x+ R: S7 _ - namespace App\Controllers\Login;, d1 r' B7 N6 e
- - L2 U; P8 U( S8 f
- class ShowErrorPage extends AbstractLoginPage
- V* @/ H* m P# R- G - {
. g* a1 |: i s* Z/ w- J - public static function printError($message)9 r- v, ^. w$ X/ ^& p0 A5 X
- {/ Y& F) |: c$ J
- $controller = new LoginController();
( _. W& C& u- e; P" R - return $controller->showError($message);3 w( q8 v: p4 J5 W) C$ s# b
- }5 ]8 s s' Z) B! s0 b& E
- }& a9 Q0 }: Z) Y' _0 g. L
/ T1 K7 ^) I$ D: A7 w X- // app/Controllers/Login/ShowIndexPage.php2 {' L. w: e2 L# N# A* I) M3 `8 w% s. H
- namespace App\Controllers\Login;# A8 P8 ?' |8 ]& o2 _
- + _; [: K8 }% C; W* _6 R
- class ShowIndexPage extends AbstractLoginPage
7 g9 P# i$ ~5 O2 J0 B1 i - {. m7 t: S9 O" \# H0 c# ^
- public function show()
9 _: Q: w- M' C# [; y - {
2 j$ }9 E! g9 S; m0 ] - // 實現登錄頁面顯示邏輯8 e* E! \, E. @% A5 z
- return view('login/index');+ Y7 ^# `( H& ]: R7 i7 }2 h9 e1 b
- }8 i' B5 b4 I" ^& I( [0 x; c( t! V
- }4 q) M, o K" ]4 K, i+ a9 c
複製程式碼 |
|