|
等級:25 - 爐火純青 經驗值:0 / 245 魔法值:14410 / 14410 生命值:5%
升級
  100%
TA的每日心情 | 奮斗 11 小時前 |
|---|
簽到天數: 5794 天 [LV.Master]伴壇終老
|
發表於 2024-11-17 20:43:13
|顯示全部樓層
馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。
您需要 登入 才可以下載或檢視,沒有帳號?立即註冊
×
宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
N7 D" |7 _5 q& a* QAI 就是站長的最佳幫手。
7 v& R7 Y$ ?+ d6 G5 [: l/ }" H
' u7 f) j2 u( D2 F- [% S0 n0 a: Q6 l* e3 s: S
這裡的「新架構」是指後端的架構會有大變化
1 R) N2 V8 Z. M3 r/ X; ^但前端的 UI 介面玩家不會感受出來有何不同
9 X2 \8 z! c9 b5 K0 z2 b& Z5 ]* i/ ?. a! x& d8 |- H, t4 r/ G7 c
3 a, y$ j! t% T. j- {7 L( q% A/ U為什麼站長要改成新的獨家架構?" T* s, l% W1 Z
就一樣由AI模型來解釋清楚吧。7 Z1 y7 H" |# B- T' n( r0 B
~/ S) N' i x! T7 K! {
! j1 n! a: D& P" V$ N% Q8 F, v# v
讓我分析一下使用純 PHP 和使用框架的優缺點:+ @ h9 _2 F$ p5 F
純 PHP 的優點:" x9 z! H. v" o+ `7 Z' `/ A" q7 a
1. 性能較好 - 沒有框架的額外開銷
) |. j& v# S& p. ? `; w8 l2. 學習曲線低 - 只需要掌握 PHP 基礎知識) E/ Q" R; T' q# g
3. 更靈活 - 可以完全按照自己的需求來設計架構# ?0 R7 T* Y1 s& t+ N; E# [
4. 代碼量小 - 不包含不需要的功能模組
. _: ^1 A- L1 @. B ^( c. a; U5 W5. 適合小型項目
* X3 w1 F% y& @+ \ |純 PHP 的缺點:" J! c3 T+ F$ C K+ W& d: |' f
1. 需要自己處理很多底層細節6 F5 X- Z* i/ k/ w
2. 代碼複用性差
5 g% Q' X" T h3 ?( g: ~6 C; V3. 缺乏統一的開發規範' v6 b6 |" @0 Q1 g- l0 a4 J
4. 安全性需要自行考慮和實現$ g: M( U, _$ w& j. ]& V: z
5. 開發效率相對較低3 {7 L& Z# b1 r# k
6. 維護成本高
$ y! g9 v- z: z! c0 P使用框架的優點:$ p8 H) u. k# [5 ]$ |, d
1. 開發效率高 - 有現成的元件和工具/ g* k4 w2 J1 }
2. 有完善的安全機制4 ?* [! Q# I1 O: d
3. 統一的編碼規範
+ h$ \' P7 e4 U9 ?- f/ f4. 易於維護
5 z, \9 \( [' Q* f+ u2 x$ h5. 有活躍的社區支持) ?# {4 a, X6 J: b3 v s
6. 適合團隊協作: M* m* F6 R; Z3 M( h2 H' O
7. 自帶很多常用功能(ORM、緩存等), V4 M, p* f8 I0 z0 V
使用框架的缺點:% w1 I ]' D5 T" C: B5 V
1. 性能有一定損耗/ X# k L6 b/ @ w5 J5 L
2. 學習成本較高
$ f8 L3 b; \/ [3. 可能包含很多用不到的功能
) q6 ^: m; B+ w4 s7 i- D1 J4. 不夠靈活,需要遵循框架的規範
& K1 N* Z$ b4 {5. 對小項目可能顯得過重8 k# B8 D1 V: E" I% \0 {3 I, v9 y9 `7 ]) j
建議:
7 u) ]* ^/ z+ C3 n$ _0 s1. 小型項目或學習階段可以使用純 PHP
' X) _. s+ f, t/ S% _$ n9 h2. 中大型專案建議使用框架
+ `$ t& {' g3 D* _3. 選擇框架要根據專案需求和團隊情況; @+ Y5 B0 S" K6 T( c
4. 主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
9 |" p/ C1 H s6 K您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 F0 _, z* [9 i
$ ]4 r- e/ `$ j9 k
& A; B- n4 t, M: l1 t8 D5 z
. M. I: n2 X6 i0 C# K8 @" c5 K, V
我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 L" i6 R9 d+ i
8 P0 @2 o% Z/ ^! t, X& I5 _
這個轉換主要做了以下改動:' \: o9 ?5 Q6 s1 {2 M4 M$ }6 Z
: [( \ O) \" x8 w, [路由結構:% \. \& H2 ^( e* X$ y" b
1 M* k% `6 l+ T* u B* ]! x
使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
* |) T/ H7 F5 z支援原有的 page/mode 參數結構3 Q! I; @/ }6 a! u3 U5 {
通過路由規則自動匹配到對應的控制器方法
# A7 L {! b' g! r" A. |
1 c2 t+ \2 t: `
: b. @+ |! v6 t" a4 H控制器結構:+ W. H0 C$ p0 `6 b- }
; W' L( e4 \( y* F/ C. O3 O) W創建了主要的 LoginController 處理所有請求
% P K, Z, e, M, w' F& Y0 J保留了原有的頁面類結構,但改為符合CI4的命名空間規範
0 P7 o3 H, b! x7 f# ]1 U錯誤處理改用CI4的視圖系統
% `# @% U# t% `$ R' \7 \ k" d) N' V% k$ n: r
1 s/ [7 [. n" R' z+ D% t類的組織:9 ?2 y9 l0 H7 t4 S$ t
$ _, d% Y( d/ p W$ F3 J( g所有登錄相關的類都放在 App\Controllers\Login 命名空間下
7 t! p: `1 o& N- i5 t- z保持了原有的類繼承結構
& ?, E7 J6 o& \% b% D1 U9 w改用CI4的控制器基類和特性
& K# c- p3 y W1 ~5 W" \/ S
; B* B; I6 [! o. \* `" }
g' Z) D- m8 \ ~$ s- O+ K改進的安全性:7 ?2 G1 T* }6 L( g$ a m8 y
# y, o3 E$ \' H, ?( X使用CI4內置的安全特性
/ R+ o# J( M. n) q$ `更嚴格的輸入過濾
* u( T4 ]" ?; n' @6 ~更好的錯誤處理機制
" g1 l b' m# F7 M) c: x0 c. h6 ?
, K6 z$ g! ?4 C3 P: L' X/ w9 i& k, ]! S* \
1 l- q- S: @4 f5 Y9 }4 \
要使用這個新結構,你需要:! R) C% p5 I; D7 r
( n# f, F x4 e" p
將這些檔放在對應的CI4目錄結構中# n5 t& t& F2 n3 ]$ ~* Y2 Y5 N
確保創建相應的視圖文件, t o! h/ K* g6 k) H# ?
配置語言服務) y5 M5 d h" ?
根據需要調整模組檢查邏輯
4 a& w6 q6 `( m# w% @- `0 C( [" N M! `
需要注意的是,你可能還需要:
- n$ ]6 \' T2 S, G
5 q7 e8 W% Z! s% H( r/ J創建相應的視圖檔(在 app/Views/ 目錄下)
2 B# N; O' F, c2 c$ M# \+ A( G! D配置適當的中介軟體來處理會話2 r9 z1 x! Y3 q0 J* m
實現具體的登錄邏輯
, @% S' g1 e: Z, p. P& h
& V% r$ h+ p* I" N需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
7 Z* n* s. k; L8 ~* v
2 r: w4 i/ p5 |4 g4 O3 O8 K! {- <?php/ h5 G, z4 r1 ~6 {6 e" }
- // app/Config/Routes.php$ J: F" i( e0 v% I
- namespace Config;
+ I: W9 w) W6 T. r5 Q+ m - 8 q8 E6 K8 r: }+ I
- $routes = Services::routes();
. i. C1 ~' x' Q- w - 1 }; E. c9 z y- q ? ?
- // 添加自訂路由規則
; l. F* |# @. [* w: P - $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {4 O% d& O a2 L0 H& i; K: I' z
- $routes->get('/', 'LoginController::index');& q; v. Q% G" a. n! F; S+ }/ ]
- $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
9 \- m$ E8 b2 B! J- `, Q7 P" I1 C - // 默認路由處理
) t6 p6 I6 m' e8 L- b% Y: | - $routes->get('(:segment)', 'LoginController::handle/$1/show');
$ G6 ?& x8 n$ S* P& k- U. U1 _! R: O4 p. C - });
7 j" u+ Z" {: C: @( q0 G2 H - 6 E3 i* F4 d/ B; n
- // app/Controllers/Login/LoginController.php
1 q! w* Z8 j M0 E# n - namespace App\Controllers\Login;
4 G ~6 g0 p+ H/ ~: `" H! j0 m
! w% C$ g8 g, Y; F- use CodeIgniter\Controller;
8 x( x% a" I# D$ T4 R# N2 H - use App\Controllers\Login\AbstractLoginPage;
5 {) e; S' \9 q# e6 h# }
3 ^% ]. t6 i, z4 y v1 q- class LoginController extends Controller/ ]' [& }8 \/ @8 f- P9 e$ V! ?
- {$ o. [4 V4 h- L& ~7 H
- protected $pageObj;. N _* |6 L- }; N
- protected $LNG; // 語言物件
7 e- ~# Y3 `/ ?7 Q* w
: R" j$ Y% U- X/ S/ L- public function __construct() ; w# s+ P% y: d: O3 E8 O( l+ o
- {
4 `$ y! Q. c; @ M5 y7 ]* C* N+ ]5 I - // 載入語言檔和其他必要的依賴) \& u- {. Z7 G! n
- $this->LNG = service('Language'); // 假設你有一個語言服務
1 }2 o# V$ M+ N; |# K& A) K - }
+ R( V: j- ^3 I. b0 v4 W2 i
) _. N1 s2 `1 g& w7 s* q [- public function index(), K0 \5 Q: K- C8 u- \) Z
- {4 t, G: W, Z4 H/ L5 k
- return $this->handle('index', 'show');. C1 Q* ]3 s, K8 |+ h
- }* S" m+ N: ?/ d( E2 M5 _' z
! _: O8 h4 [6 e- public function handle($page = 'index', $mode = 'show')# \# n* i8 M0 d* G2 H% n
- {! l- w0 ?0 U' _( C
- // 安全過濾頁面名稱
- a4 T( c: s" G - $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);1 {3 R: S: I! H& ]" t F
- $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';' |5 a) X4 K$ g- O+ `
-
$ [, @) d+ E& ]- o) p - // 檢查類檔是否存在
, V b4 M7 f: m/ H+ G - if (!class_exists($pageClass)) {
! \& z+ d: X( h+ `# a. y4 O* V - return $this->showError($this->LNG['page_doesnt_exist']);
7 C2 w. K& m% N. k+ A; _$ R - }
. [5 {$ T5 C# C/ |+ ?4 h# g3 H
! B9 t& L3 p5 ?- // 產生實體頁面類/ |! m* u8 O* r' D4 w [
- $this->pageObj = new $pageClass();1 K! L* u/ L6 }" ^# M
- 0 v+ Y; C& a* M
- // 檢查模組要求# ]' V, M1 p% @" U
- $pageProps = get_class_vars($pageClass); S5 w! o5 f; ]# F0 ^
- if (isset($pageProps['requireModule']) && ! W; q2 M5 Y/ Z$ K( B) k9 z. Y9 f. U
- $pageProps['requireModule'] !== 0 && % l' p4 [1 C6 Y1 o
- !$this->isModuleAvailable($pageProps['requireModule'])) {
, |- e4 B' o8 z9 w% e. q0 M - return $this->showError($this->LNG['sys_module_inactive']);
. y" h' [ N: \8 ~" r u4 |7 {" G% i. q - }. l/ W7 t2 K2 ~1 C$ E
- ) w5 W6 z: z, A% f
- // 檢查方法是否可調用# O. S+ U) R5 V. I
- if (!is_callable([$this->pageObj, $mode])) {
: h9 W x9 H8 t# \: l# J# _8 I - if (!isset($pageProps['defaultController']) ||
/ m S* y& q$ M7 J3 G, V - !is_callable([$this->pageObj, $pageProps['defaultController']])) {
1 K, ~- L* y8 H$ t) F - return $this->showError($this->LNG['page_doesnt_exist']);
4 C, t) S0 m( h - }
! k2 O+ l+ m: K0 c - $mode = $pageProps['defaultController'];
1 E0 a1 l; u+ L" y9 |+ Z# ^ - }
, Q$ Y% I! v) B, c8 G0 V - & F' q( D0 G$ {6 t. Z
- // 調用相應的方法( n4 l! {4 G, m" G- T0 W1 n, Q
- return $this->pageObj->$mode();; @) u) n4 g; ^3 \7 W
- }
, n# u- T+ P; ]4 B7 c ~! h - " O# q4 `; k% d) ? Q; F
- protected function showError($message)
9 l. a% x! T& x; u - {
9 g, K4 d$ `" ^* y& | - return view('errors/custom_error', ['message' => $message]);
, v0 p! X; y" s, V, H0 D - }
- F! w5 d& t' K- W4 e - % q2 P+ x: {, Y6 \ u$ \1 [- `4 C% A
- protected function isModuleAvailable($moduleId)
n. X( x: Z) |8 B - {( Z+ V' H/ x- m$ {$ S" U
- // 實現模組可用性檢查邏輯( I* K0 P5 v# p. r/ D
- return true; // 根據實際需求修改 A# q+ ^' m$ L, l2 ^
- }
1 L S6 M/ b! D2 ~1 s, G - }
7 {7 p6 S' U. R7 V' |( c1 h8 G
6 v* r, ?! V; c% |# u# b- // app/Controllers/Login/AbstractLoginPage.php! K6 t; P8 [( t" x* p; C) f
- namespace App\Controllers\Login;, b: R1 Y, L* g- n. e. ]( c
- * [3 B3 G8 f& D9 y% n
- use CodeIgniter\Controller;. M% k7 p1 C2 Y0 J0 d+ F+ A
- - g' U7 m3 n- V2 a% `& o" b
- abstract class AbstractLoginPage extends Controller# t) k, ? A- P+ t1 G. y
- {
8 g! G' A- @) w+ Z" S$ N3 B; c8 R - // 實現基礎登錄頁面功能6 |, p, M: D8 ?" C! V
- }1 y. S! o2 [3 }" q; O* X* `
# |. k: {+ G1 [2 B" ~1 l- // app/Controllers/Login/ShowErrorPage.php$ N* K' ^8 k' W! a3 y
- namespace App\Controllers\Login;
" z L5 S3 g2 r
3 x# T# s! _$ L$ E3 p2 X+ N$ t- class ShowErrorPage extends AbstractLoginPage
% S0 c4 f0 c, V9 `8 [2 v8 c - {
, B8 a/ o$ z2 R' `) f - public static function printError($message)
- p2 q+ |( l: f1 z - {8 ^6 N7 L% m1 [
- $controller = new LoginController(); O! h# ?* \! V! {
- return $controller->showError($message);9 |/ {+ C u6 p9 B* z6 V# c% r
- }
W0 {& Y9 c6 w. ? k, b# M: Z - }
: H9 c6 c7 x4 c7 v) ]& w - & v2 {6 E( K4 f3 B6 z, V
- // app/Controllers/Login/ShowIndexPage.php. h& {5 }5 c+ H" j' l
- namespace App\Controllers\Login;! V% Z1 k9 y/ W \
4 C0 a( c) E2 g0 x, g- class ShowIndexPage extends AbstractLoginPage: G0 z4 e) r# u% b" S- j2 J
- {- u* Z$ T' K; j# y3 j
- public function show()
$ p: r4 [% q3 } @7 G - {
) R) n* A# b1 U5 d& A2 f. u - // 實現登錄頁面顯示邏輯
9 u" c3 C* c! [; B - return view('login/index');& w0 s+ Q( {5 O! i$ I' Z- s
- }! ?+ k- k$ w" B, Q2 P
- }. o5 c. i6 `# ~1 u8 x# i! U
複製程式碼 |
|