等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14391 / 14391 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 7 小時前 |
|---|
簽到天數: 5788 天 [LV.Master]伴壇終老
|
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
3 ]) s( b4 E: R9 p# i L5 [$ M* eAI 就是站長的最佳幫手。
' c" q2 q. u7 @$ A9 S+ p: H2 S% k5 t: _' z- U0 T+ E
& V% M& C$ S3 ]+ e) q/ d" q這裡的「新架構」是指後端的架構會有大變化( D- L. q" ]7 _: T! J
但前端的 UI 介面玩家不會感受出來有何不同; p$ l9 r& u! [ Q5 ]
) B( j2 a+ h8 w6 d; H3 i, S5 b/ X o) f3 e5 I9 g
為什麼站長要改成新的獨家架構?
& k. _) }) Y4 P0 T就一樣由AI模型來解釋清楚吧。
; A0 h7 _* s- ~( n" a, A! u
6 B; `" W! W/ ^. o
' [0 l# Q! i8 j# q4 ]" l4 I% {讓我分析一下使用純 PHP 和使用框架的優缺點:
, m5 u& `1 V: q; X% ^% t+ f純 PHP 的優點:/ J/ u) s$ K1 A; H2 L. }
1. 性能較好 - 沒有框架的額外開銷) Y- Q3 F6 L/ V
2. 學習曲線低 - 只需要掌握 PHP 基礎知識
5 T2 n& n0 z; B) t3. 更靈活 - 可以完全按照自己的需求來設計架構
/ @4 G: i. i0 U, l0 P/ e4. 代碼量小 - 不包含不需要的功能模組& c5 V% U. W+ T t* c0 e) E- R
5. 適合小型項目$ {2 K0 a' j" Z0 [ [
純 PHP 的缺點:8 e) o+ r+ \4 w$ x% F
1. 需要自己處理很多底層細節
7 O& Z/ c% W2 r2. 代碼複用性差+ p- Q8 ^, y( F7 F) r
3. 缺乏統一的開發規範- Q2 L0 b% G2 g* `* m
4. 安全性需要自行考慮和實現
% i. B% r/ Q* e' Z _. }5. 開發效率相對較低
" l' |2 `, M- d- @8 l( H1 q6. 維護成本高3 S6 K8 {0 u9 O) l0 K" T; Q# v
使用框架的優點:0 @% D4 p9 u3 }- n& Z: r% b, J7 N
1. 開發效率高 - 有現成的元件和工具$ s3 g) u" g8 C2 X" K( T: M
2. 有完善的安全機制
) L ]5 K2 Y3 U" I/ Z8 R4 c4 Z3. 統一的編碼規範
. Z' Z8 l }# @7 d! S4. 易於維護
6 A; l+ c/ n. M: q# Y5. 有活躍的社區支持
% Y' c2 Q4 N5 t, d# ?6. 適合團隊協作
( ^1 z( z1 J6 e2 d K. u7. 自帶很多常用功能(ORM、緩存等)
6 `0 K% M# X% v# b$ V& r使用框架的缺點:
: r0 G" P8 B7 s' W. i1. 性能有一定損耗
/ q! {& ~( U/ w2 E; j2. 學習成本較高 i5 `1 c4 j5 ~1 |3 o8 q
3. 可能包含很多用不到的功能2 h0 S5 r' r: i5 \) \: U/ w! |( n. e
4. 不夠靈活,需要遵循框架的規範
( M0 ~/ X& u; M: f3 P5. 對小項目可能顯得過重
+ G5 |: U( l: N5 }: W建議:: V9 e8 P' S7 c- [2 H* q5 X Z
1. 小型項目或學習階段可以使用純 PHP
+ {! b5 d3 P; Q2 L9 w" v4 a- T2. 中大型專案建議使用框架7 i( G4 r0 w1 m3 n0 w( f; W8 n# U
3. 選擇框架要根據專案需求和團隊情況
% U; a. j' P+ y- V4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇1 v4 V% C# Y; ~ F
您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
6 f+ W$ U' { h
: S7 y* u% y% R" d8 V' r/ ^
$ v; n$ V: y% C9 G$ P: H& ?- ?' p6 T* h! L4 R5 O9 w; o0 X% |% G) }
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。, b: q0 ]; y9 e+ f) N- o7 O% L- U
2 p' h: | S6 Y0 Q& F0 t7 Q
這個轉換主要做了以下改動:
$ ~+ h2 C# F, v0 N4 I0 }1 }
5 K& n4 `. A* [9 g! z3 M路由結構:
/ }* @. i: A6 z! }; E& L0 N8 f1 O2 q7 F4 _' V5 R+ J
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
6 q- D6 c; u! p& i: o/ i; D& o支援原有的 page/mode 參數結構1 z: @, O# u( i% M- Y, G0 d
通過路由規則自動匹配到對應的控制器方法
, @2 Y% b( \1 q, f# f0 B0 l& e }6 z* \% b/ o+ f' C! u5 W2 ]* m
/ j# A- c& X9 ]/ _5 N( d控制器結構:( j) Z; k- A& B; z6 P T
4 k7 X R7 m2 _+ }
創建了主要的 LoginController 處理所有請求8 k3 r" b% Z' m1 l% |( d' U, C
保留了原有的頁面類結構,但改為符合CI4的命名空間規範6 I, c& K! G- E& H
錯誤處理改用CI4的視圖系統
. U f8 p4 R/ P0 Y( ?6 h
5 U$ R" Q1 f' ` |
& f6 l4 N/ O3 X* Y5 E類的組織:
, K. y2 p, S# N2 y8 Y, l
$ Z! ^" D! }! f8 s# o' t所有登錄相關的類都放在 App\Controllers\Login 命名空間下2 ]4 V8 Y* j/ K; R
保持了原有的類繼承結構$ f' @8 \$ W9 M4 I6 ^) F
改用CI4的控制器基類和特性) ?& u5 ~9 u4 n3 g `1 a
' ^6 Y- J+ m+ j
9 D1 Y1 A& F( [8 J/ T7 l h" w改進的安全性:0 p) W8 }: [, f( A% C+ N) @5 C
2 ^( `) A: X) K7 ~
使用CI4內置的安全特性9 H1 b Y: N& P* }- l1 U% b) J
更嚴格的輸入過濾
_! M9 c! B9 i8 x/ O更好的錯誤處理機制
+ |# c, a. r) v+ W( f% F9 r, \- N9 e0 B
% q6 s0 J. \+ N' k/ l2 k2 t
7 |; _, s) Y$ {( {, v要使用這個新結構,你需要:
* S, C& t$ y5 Y
$ i( w7 a; r# G4 q% W3 Q1 }+ d I將這些檔放在對應的CI4目錄結構中& I' @1 }5 Z3 d9 k$ r7 R0 t
確保創建相應的視圖文件, Z" A( \) c) b* V- }. l
配置語言服務
' K, B7 V+ v0 \) R根據需要調整模組檢查邏輯; z) B# z* J U) `3 P8 r: A
6 D- \8 @$ q8 N) u9 V/ `/ P: V1 q. W需要注意的是,你可能還需要:+ L9 {7 ^; x' s) j
. W5 m4 t2 R3 K3 c! d( x8 h創建相應的視圖檔(在 app/Views/ 目錄下)
4 `# o2 ]; P( S" t* a0 |6 i3 {配置適當的中介軟體來處理會話9 t+ j0 M% R) r( y9 P& A- J0 d
實現具體的登錄邏輯
, S& N5 S. g5 z9 e& v. W5 f0 V, b8 Z# ^; u) _/ R, T2 T
需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
" A- [9 S* f( h+ {9 I0 k0 y1 l% ]: Q k& Y+ F% C. B
- <?php J7 E$ |& `# J5 V+ |, y5 k2 x
- // app/Config/Routes.php
( o( R. s% `* B1 A - namespace Config;3 [3 N/ [2 H' F
- * ?, r& A9 c: a6 _+ }& F6 O2 U M
- $routes = Services::routes();
: x5 [+ G$ q$ e+ ?
% w( k- w) \6 D n% h' g- // 添加自訂路由規則/ E p) a$ X- g S' I
- $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
3 G' E7 g/ W0 w2 ]8 H- c( v9 t - $routes->get('/', 'LoginController::index');
* o' k+ Q9 {: V: N0 j - $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');. A7 h9 H) ?" I! A' s1 J
- // 默認路由處理
+ f `! V8 l( {( h6 M2 \9 Z A - $routes->get('(:segment)', 'LoginController::handle/$1/show');% }: E6 Y* W( W0 {( q: i- w- G+ W+ q
- });5 m- ~; b& j4 O5 U9 Q
- 0 o0 `: x! q, i9 l# d
- // app/Controllers/Login/LoginController.php
; f; H- Z) ?5 m: t3 g1 t, K( z6 x - namespace App\Controllers\Login;0 t( x- k1 x" E. U; Z
( x. ~8 n2 v7 ^" \, b7 B- use CodeIgniter\Controller;
% ^ Z4 _. I- a2 X% t" m - use App\Controllers\Login\AbstractLoginPage;
2 |! V. d" ~! ?1 G6 ~* h1 |/ c
! r8 Y2 W$ T- A! w) I6 ^8 p- class LoginController extends Controller
' y7 X& L9 s5 O/ n) T- ? - {% k' y! q9 t2 l9 N4 a; Q8 {
- protected $pageObj;
h7 F. D% V4 ^( @+ ~; P3 A1 T8 k - protected $LNG; // 語言物件
, _- |9 I+ M/ q% m8 m! d
- l. V9 L& n' E% f) s7 [ r- public function __construct()
) Y( m7 k- i& r* f, g7 t - {/ l$ l2 R3 s! k9 @/ {! C7 l7 i) @
- // 載入語言檔和其他必要的依賴
R. V' N- | A& v% L p4 g* N - $this->LNG = service('Language'); // 假設你有一個語言服務
4 N* ]% E+ ]" m- `2 Q - }, M h) b! {1 D: S
9 a( s4 u0 m/ V" @5 a- public function index()4 ~' x j6 k! p9 z8 T% S
- {4 T8 {# _, y3 Y; m; Y
- return $this->handle('index', 'show');
% A- l7 T1 m: ]) d4 }% Z - }
6 p1 t4 Q4 A. I, H. i% m - 9 t# @2 O7 ~1 {- E$ N
- public function handle($page = 'index', $mode = 'show')
3 j R, L; S" T - {3 K0 v) q" X9 Q0 t7 `, w
- // 安全過濾頁面名稱
0 ]$ F! w" R% U4 ~6 l0 P - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);3 x: I1 j# S4 P& y3 N4 |( E
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';3 P+ A9 X4 p3 ^
-
- G+ i5 o% d6 x8 q- |: }7 D+ r - // 檢查類檔是否存在4 e# a: ?+ }# T- l+ h! J
- if (!class_exists($pageClass)) {5 B+ `) Q7 n& G: S' y- A( Y
- return $this->showError($this->LNG['page_doesnt_exist']);
6 [. C% C! F4 @* c - }
* C' c4 [) H9 `! b
( p, e$ G, m6 ?; u- // 產生實體頁面類
* [2 {) i! G7 b1 @ - $this->pageObj = new $pageClass();+ l6 ~, T" K# g$ ]( \! j5 W
-
3 K3 n( o! D7 z5 Q2 \ - // 檢查模組要求+ ^/ t5 y6 j3 L; x5 m# a! m
- $pageProps = get_class_vars($pageClass);) ?5 d H3 l2 f% T6 O$ z
- if (isset($pageProps['requireModule']) &&
{8 ~8 @: e( p; @ - $pageProps['requireModule'] !== 0 && ( N7 c7 }; A9 _6 C
- !$this->isModuleAvailable($pageProps['requireModule'])) {% Y% D7 B. Q" V5 N: Q# n# J
- return $this->showError($this->LNG['sys_module_inactive']);4 F h# W/ C3 R q6 {
- }
/ T& K; t h& C6 N# [3 K$ R& K
' I/ b7 A4 |( u( W e! h6 V- // 檢查方法是否可調用
0 d! u! [/ w1 S3 M* g0 P - if (!is_callable([$this->pageObj, $mode])) {
% f0 `* ` Y% j" |! o0 O, O - if (!isset($pageProps['defaultController']) || 0 Z" n' U( E9 k. {/ {
- !is_callable([$this->pageObj, $pageProps['defaultController']])) {8 O7 U7 z5 ^; a9 G) Y
- return $this->showError($this->LNG['page_doesnt_exist']);
2 ?' m6 Y- f( _' @, S, j8 Y - }
3 }: z. h5 N6 B! a/ V* J$ ?7 o) R - $mode = $pageProps['defaultController'];
0 p3 D& M% \( K0 c% G - }
% Z. m( A3 X' x0 @% k - d) w+ |, `( I. v1 }% P
- // 調用相應的方法; U2 \' @5 T# j6 x
- return $this->pageObj->$mode();
0 Z; o+ |5 a3 s0 D* n% B% Q% J - }& n1 r4 d- f3 L' a# m, j7 q2 A; Q
( x! q7 b" ~+ \/ M3 Z- protected function showError($message)& D* Z0 q) g: S
- {. T; |- T2 n, u
- return view('errors/custom_error', ['message' => $message]);! c8 M5 ^* x0 y3 A8 m9 h& v) j
- }! D% ~& X# T/ K- X% r
- * C5 M. }: H$ m
- protected function isModuleAvailable($moduleId)
9 d, X# `3 ]! s: O - {
/ g& Z4 _1 }9 n4 S& d - // 實現模組可用性檢查邏輯
% W" E* t: ?9 C1 r - return true; // 根據實際需求修改" X0 t( U. l) c5 E, l
- }, o; S. D2 r9 C0 z6 [3 U
- }; L7 Q' X+ l8 _/ z0 d X W1 |9 B
! l: L1 J [& @5 H- O$ A& q8 U- // app/Controllers/Login/AbstractLoginPage.php* f/ D, S4 ?. r! G
- namespace App\Controllers\Login;& B) F8 @% F3 v% d
7 j- r% V1 Z/ P- E- use CodeIgniter\Controller;+ r; F' P1 J; }" K
: J; d8 K2 v Z7 n- abstract class AbstractLoginPage extends Controller
7 _' t$ y5 z: V$ n+ p - {0 a4 K2 O4 |+ E
- // 實現基礎登錄頁面功能
6 f8 X4 g3 q5 m! W - }. x0 ^: } T& u9 f3 i# l
- k) z1 A9 d( J) U5 c
- // app/Controllers/Login/ShowErrorPage.php- E+ e; h$ M7 f' m/ \
- namespace App\Controllers\Login;
9 R% ~5 `" Y$ @
6 x& Z/ X L: y6 s7 P! j4 Z- class ShowErrorPage extends AbstractLoginPage
9 R3 s6 `/ h2 `$ J% X8 ^ - {4 a" o6 b) t }$ |3 z
- public static function printError($message)2 `+ X' T# n o, Y
- {) b" `$ ?: n" D' o h
- $controller = new LoginController();
5 C" ~3 Q3 V; [) e! P' [ - return $controller->showError($message);
4 p9 ~6 H& j3 d- V& W9 I - }) F b4 w7 k# q; O, ~; }
- }
$ N2 n' S# E5 Z0 k' B - ! I5 a9 W7 g, u" W+ V
- // app/Controllers/Login/ShowIndexPage.php1 r4 C5 l( o( j1 o0 h$ L
- namespace App\Controllers\Login;# D7 |; L: k/ W) I
- & V6 B; \# J- d7 T6 {! W2 e; j5 H
- class ShowIndexPage extends AbstractLoginPage! D: d4 c0 T# v6 Y4 ]$ G4 F
- {
+ b' y5 J1 m+ J. Z2 c1 g - public function show()
/ r2 H' Z+ z7 y3 f+ X - {
- }! ?! }/ l, j" ~ - // 實現登錄頁面顯示邏輯, g. Y; q- a. [4 p# ?
- return view('login/index');+ r; Q3 n3 o1 @4 d( _
- }
) n- r. A7 ?) ^ ] - }
5 B8 C. t% n9 i9 h0 u9 N, c
複製程式碼 |
|