等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14354 / 14354 生命值:5%
升級
  100%
TA的每日心情 | 慵懶 6 小時前 |
|---|
簽到天數: 5774 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致: } F9 q6 q7 |
AI 就是站長的最佳幫手。 k6 S0 U8 D. G; O1 S. b
, O! P1 V: B+ T- Y' I1 a b" x' k; s) H( _
這裡的「新架構」是指後端的架構會有大變化
" B7 a$ ]' C+ m/ j, s: y! O但前端的 UI 介面玩家不會感受出來有何不同
! ^. `- D T$ h3 M( z5 k
5 `, }. S; m [
: B$ A$ F5 c5 s0 W0 B9 J為什麼站長要改成新的獨家架構?8 N2 K) p- t7 z: y
就一樣由AI模型來解釋清楚吧。
. q& ]: C' E! b! b" k0 X3 u1 A* t. X. T
: ^( Y1 p, e) P* S- y* E! P( c
讓我分析一下使用純 PHP 和使用框架的優缺點:
/ {' c9 ?& m8 [+ U純 PHP 的優點:
H3 K' V* U! g+ R! J- O1. 性能較好 - 沒有框架的額外開銷1 I, C( L4 i# q6 r* d7 b
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
8 w( P9 p% C; t+ _: g1 Q3. 更靈活 - 可以完全按照自己的需求來設計架構
& d# e; z% T" u$ F/ P, t4. 代碼量小 - 不包含不需要的功能模組
2 Z1 A! e8 T, `& i9 z5. 適合小型項目
0 w2 ]9 x* H' }4 ~- y8 D' Y純 PHP 的缺點: Q2 @% }# y0 e6 o
1. 需要自己處理很多底層細節- E' v& b5 b. Z( {
2. 代碼複用性差- ^. l& W5 D( ]
3. 缺乏統一的開發規範
: A) n1 P ~$ t! |4. 安全性需要自行考慮和實現8 u H9 T* p; }; X6 @# I( H3 l3 o
5. 開發效率相對較低, B F# ?- `8 z' t+ V) X
6. 維護成本高. \+ G$ o0 ]4 \1 _# k; m' i
使用框架的優點:
% `7 {" r- C M8 c1. 開發效率高 - 有現成的元件和工具9 `# G# q) N5 o3 u0 F
2. 有完善的安全機制& w8 E" P4 r4 y/ ]0 e& n7 [
3. 統一的編碼規範
( X2 [6 ~8 k: I4. 易於維護
) X* v2 m: B/ S5. 有活躍的社區支持
# t" i. J8 V! z$ [2 M+ V }) j6. 適合團隊協作+ b- z2 J) ~9 U, o* s
7. 自帶很多常用功能(ORM、緩存等). o5 P' s/ R2 Y: _8 W0 q
使用框架的缺點:
1 b2 k, J5 k# E! c4 \! e6 L* g1. 性能有一定損耗7 s$ H+ E! k/ l; t; X
2. 學習成本較高
- n, \5 T/ p6 n* A5 ]3. 可能包含很多用不到的功能3 _# B: O: ~, F3 l. T3 X
4. 不夠靈活,需要遵循框架的規範
& J' A! S; x3 d$ }5. 對小項目可能顯得過重6 F2 Z% q7 h% A, r% s2 i: ^! T
建議:1 e! t" O% z( E/ l$ v' G
1. 小型項目或學習階段可以使用純 PHP
* t9 f+ L* T# z# K2. 中大型專案建議使用框架' O) e' c2 ^4 v# F
3. 選擇框架要根據專案需求和團隊情況
& u6 M' V& V! Z: E0 s) _0 j$ w' ]3 y4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇# H- `. O9 M# q3 k; ]6 R# c2 H9 v* Q
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
1 Z1 `: `9 _( e8 b* V# ]$ `/ t
% X: E* v' M# @8 S2 V8 I+ k
5 y- J; y* s# ~( j. d/ f4 O* B" `! n3 w
; G% Z, l5 v6 ]: p' \2 K我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 e; m& r: g- |* k# G% X/ U2 p& P
J- `1 c" D" P4 z) G6 e: _8 {
這個轉換主要做了以下改動:& \3 A1 y# |9 H/ b( b* u
. t8 c- z9 v( \. S) n! n路由結構:0 v9 @0 I0 v) F; ?9 x
2 e+ s) k0 }' Z6 |7 X$ A8 \使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
1 C: Q, c2 {8 Z+ f4 i" b支援原有的 page/mode 參數結構; u3 Y3 l$ W+ f5 S& g, D
通過路由規則自動匹配到對應的控制器方法
& c6 n# [9 X" ~8 F
8 q0 y1 ]; X* A+ y: S3 l% H, M( v6 r8 e0 p4 m% E+ c) M
控制器結構:( N& |; E- c( }2 n ^3 H: J
% L! X5 C5 G. \創建了主要的 LoginController 處理所有請求% @. N* w- S9 m
保留了原有的頁面類結構,但改為符合CI4的命名空間規範 X- X9 \% q! `
錯誤處理改用CI4的視圖系統& k k8 V# y, `+ _; ~
8 x1 G$ X- T# Y* Z" ]+ [/ y* \
2 [: N; |8 x0 L7 g& L9 u
類的組織:
% C# |' O7 K" E+ g$ Z0 v r1 g2 {" C, z5 a' C; K! D
所有登錄相關的類都放在 App\Controllers\Login 命名空間下. g5 z. F' c4 u* m- d
保持了原有的類繼承結構5 [7 K5 k! b8 ]/ i/ o
改用CI4的控制器基類和特性
& I. d. v+ `9 C- J7 p2 C$ n }0 S0 V4 P% {7 @6 Y
4 W+ y, K+ y S& S8 k改進的安全性:, l1 M; _( C: L! C
4 i) t) c% V) }! V使用CI4內置的安全特性4 m e8 _! U0 K5 H
更嚴格的輸入過濾" g* E* _% w5 O: ?5 O0 U
更好的錯誤處理機制; i1 N) |- E" ^) `
( C* K6 y$ `! |, U' U/ w. v6 y
0 l. d m0 E% n E) ^
+ q8 V, ~7 ~5 q+ i要使用這個新結構,你需要:6 u; B! V1 l* Q4 r' ]
, W4 f) x% h" p+ Q q( @將這些檔放在對應的CI4目錄結構中
9 C' p0 @. d3 a" W* ?確保創建相應的視圖文件# `' ~$ V" y9 E2 l2 f ? z
配置語言服務
5 k. A0 K5 M0 l* T; F, @, r根據需要調整模組檢查邏輯; f! R) v* n$ W6 L
0 N. {6 y8 d! O需要注意的是,你可能還需要:* B) |9 ~+ B8 O3 f1 p# B
L' E& @) e1 Y# T4 Z7 b I! Z
創建相應的視圖檔(在 app/Views/ 目錄下)4 O q& X' J# C' D
配置適當的中介軟體來處理會話
. C' h2 F* [- e X" U& ^% u實現具體的登錄邏輯( c3 }2 ]. }. g* [, }% `" Z @4 k1 ~
/ u. ^1 r" a9 I: o, x8 I
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
3 ^1 `9 P7 V4 e* M: u# v5 D/ r; j$ k/ K$ l5 Q1 y; u) ^
- <?php
5 Z9 q0 z; @5 r( ^+ @ - // app/Config/Routes.php
& d& I. V; ?2 r - namespace Config;* e: i# o3 i0 O% j' D8 Z* K# O! J. s
, v; ~/ w4 d" ^ U; {- $routes = Services::routes();
7 ^6 B4 D' E4 t* r
. K& H8 W# N5 M' Y- // 添加自訂路由規則2 O& h9 X' s( R3 E' i. c7 s( ^
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 Q" K' a; J7 k/ E! G! }
- $routes->get('/', 'LoginController::index');/ L; J6 Z& |$ C4 p' ~1 r
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
9 b' q1 ]/ Y: ?; T a - // 默認路由處理7 ^& h) p B6 p2 k) m
- $routes->get('(:segment)', 'LoginController::handle/$1/show');. ^7 ?7 I, G/ g7 K! m5 q+ c0 y- Y
- });
: ~. z3 u4 N. K" A0 P
" R- p/ j) a% P, ~5 g7 p, y7 E- // app/Controllers/Login/LoginController.php. [/ Q3 h! x8 ?- [, [' r8 a
- namespace App\Controllers\Login;
' `' K, ]8 U% _! }3 a - . v x8 Q1 G. A& Q2 P5 { w0 V: [
- use CodeIgniter\Controller;9 N( ^2 z/ y5 s5 y4 Z
- use App\Controllers\Login\AbstractLoginPage;9 ]# e2 h# n& d8 E& ?# y& U
- ) v4 V- j% N% c
- class LoginController extends Controller; F h0 i% V; a
- {5 t% v6 f! H5 i- X, n9 z
- protected $pageObj;2 C: a3 e* ]- r$ a
- protected $LNG; // 語言物件
) X( o( f* C5 ]; S2 J' O" L - S1 ~/ H3 `/ X( `, c
- public function __construct() ) j: P3 P) c# ^
- {$ C' G4 Z% |7 ^( A- i
- // 載入語言檔和其他必要的依賴
- g# \/ Z& K& T# z- \) H - $this->LNG = service('Language'); // 假設你有一個語言服務
2 _* S1 B+ h% G' X - }- b% {* U7 ]6 U$ _' ?) s6 }; Q
- " G% \8 z5 B y8 n5 a' R3 Q
- public function index()
6 f: n) L3 z, r4 S$ B1 y8 G - {" ~" v" t& h0 q3 h: t1 r( I
- return $this->handle('index', 'show');
8 y1 U. y+ e" L- d4 C% }3 {% H - }4 S" i9 j- [5 n) r6 @8 H
9 }6 p0 P0 U' k* D* a# D8 Z- public function handle($page = 'index', $mode = 'show')& R& W1 @: k8 P& i2 C
- {
+ k( I" P% K8 F; u4 F- k, O - // 安全過濾頁面名稱2 @/ X; ?3 [" e# @" V7 W
- $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
% R& l( h- I5 d% L- O! `. U( g9 D" m9 J: D - $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';8 _/ x; D/ ]- \; A1 M
-
( V% f1 j0 Y* _* U! t. I+ ? - // 檢查類檔是否存在
. i1 @/ \* P; E+ |! H: `: F - if (!class_exists($pageClass)) {
0 R% R0 E# s3 k' w5 i& i0 Z, e - return $this->showError($this->LNG['page_doesnt_exist']);5 B0 ^& [1 a0 t/ c6 D
- }
. N8 [- L; x* m& O7 P+ A+ ^ - ! R9 D. T. H- D
- // 產生實體頁面類5 Q5 ~# Z& @, b4 S1 J
- $this->pageObj = new $pageClass();
9 V2 z0 |) }' O0 k4 o" U -
, N' A: |" @2 Y* \ - // 檢查模組要求2 s7 B1 ` t+ d1 W
- $pageProps = get_class_vars($pageClass);
) R# d- o4 ~+ c2 ^+ Z7 C4 g - if (isset($pageProps['requireModule']) && ! \1 u Y' t l8 r
- $pageProps['requireModule'] !== 0 &&
6 B* P+ J1 T( k3 z8 T" Q& V - !$this->isModuleAvailable($pageProps['requireModule'])) {* P; s0 T2 `, ]9 _, v
- return $this->showError($this->LNG['sys_module_inactive']);8 @' x% U+ f9 ~$ T" @
- }
6 f) p" D1 ]: E1 R% A0 N; R, h' ?! q, Z
) N) M+ w4 m) a0 V/ {- N7 I# k- // 檢查方法是否可調用3 g( U, C; H$ {' F+ i9 z
- if (!is_callable([$this->pageObj, $mode])) {1 e$ X- X% \' b: o2 T! S* X) Z: ]
- if (!isset($pageProps['defaultController']) || 7 p) ]4 ? C' \
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {
% ?& m; E( g* ? - return $this->showError($this->LNG['page_doesnt_exist']);
+ [. m' u, z( {5 _* N( R - }
4 A- O2 y' ?4 ? - $mode = $pageProps['defaultController'];6 e4 R& _ X. \; Z; N: q
- }0 e6 V3 G: R6 x/ a4 L+ ^$ c3 g$ I( W
- . ^5 v, ^" Y* ]# `& B) j5 Z
- // 調用相應的方法& C6 N0 |! Y$ X4 U+ T) o
- return $this->pageObj->$mode();7 q; m* I6 W0 B" Q) r# V: f) u
- }
: }* T1 u' }3 { - # q, X; \- V# d0 p y. Q
- protected function showError($message)
0 `% P) E: j9 I8 ~3 m. f - {) G9 t! |. g( ~& H' l3 a
- return view('errors/custom_error', ['message' => $message]);
0 v% P) X' X$ B$ ?9 t2 j - }
3 O0 x: d" w. P5 ]% A5 S3 t
r, ?- [; R* Z/ y# ^ ~2 z- protected function isModuleAvailable($moduleId)
" z% k1 @. S* P9 S( H" Z - {
2 S6 D2 T' V6 u" C - // 實現模組可用性檢查邏輯0 Q9 ^4 ]4 ?; G/ z
- return true; // 根據實際需求修改7 F/ z( R' w$ Z
- }
# X' a4 L1 }! p7 s6 V3 F: U - }
$ W0 w% i& A/ E/ _9 p! R - + l. w& d: J6 Y! |4 m
- // app/Controllers/Login/AbstractLoginPage.php. q! r1 w: |* ^. p/ F
- namespace App\Controllers\Login;2 t& C7 _: j9 _7 O+ }
3 r/ j. c2 |; \& H" p9 `1 n8 w9 G- use CodeIgniter\Controller;( k3 \1 W7 U3 T' S+ b; @
- % l4 K9 r% d( _# t6 Q/ b
- abstract class AbstractLoginPage extends Controller: n' o: T' |1 Y' K
- {
: V7 B& L' q9 B5 | - // 實現基礎登錄頁面功能
) R# D a4 f6 E8 \+ [3 r& P$ D; p9 ~ - }5 `- t+ ^$ `7 d, k& v
" I5 B7 m/ b( V9 o" M- // app/Controllers/Login/ShowErrorPage.php2 G8 e' C; s, A) {/ c9 G
- namespace App\Controllers\Login;
/ U# o! h; V; K
2 M0 B5 p+ f: O# K( ?5 n- class ShowErrorPage extends AbstractLoginPage6 R. B9 J0 T' T) W, @8 u, m
- {' U3 H, A6 M! x, L
- public static function printError($message)9 p. H2 J+ K& [6 K
- {
( c' t; U0 n6 a% I - $controller = new LoginController();8 e$ E. U; e" ~; v# q3 D
- return $controller->showError($message);" D$ U$ G( q2 }2 x. ~7 I9 Q7 m) H
- }; z$ H3 L C: Q) ~
- }& ?0 \# q4 S8 o, V5 v L/ S! j# x
( n: R; `2 a7 \- // app/Controllers/Login/ShowIndexPage.php7 a2 Q+ m A& q: e9 e) N- n
- namespace App\Controllers\Login;
+ y4 ~1 d# B0 F - & n7 h" h6 L" m( x; E% b& b/ F8 d
- class ShowIndexPage extends AbstractLoginPage
( O) Y: j5 O5 Y4 D3 ?. f - {8 R: L, Z2 f* a' d0 w% ]. [9 s" C
- public function show()+ A9 \1 x$ I( j& R, N
- {1 i C0 f$ ^, n" C, v
- // 實現登錄頁面顯示邏輯
1 t9 [9 Y$ t# ?) X, n- T- s - return view('login/index');9 u8 t6 W' ~ ^% ] p3 S/ F
- }, J5 n, G9 x/ Z( A$ ~4 e
- }. u& K k2 s, a4 {" P: {
複製程式碼 |
|