找回密碼
 立即註冊
搜尋
熱門搜尋: 活動 交友 discuz
點閱: 737|回覆: 0

[閒聊] AI 改版新架構記錄

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14752 / 14752

生命值:6%

升級   100%

  • TA的每日心情
    奮斗
    昨天 12:36
  • 簽到天數: 5882 天

    [LV.Master]伴壇終老

    發表於 2024-11-17 20:43:13 | 顯示全部樓層 |閱讀模式

    馬上註冊,結交更多好友,享用更多功能,讓你輕鬆玩轉社群。

    您需要 登入 才可以下載或檢視,沒有帳號?立即註冊

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致9 W& ^# Z# o( ?$ v
    AI 就是站長的最佳幫手。; o" P4 U. V+ E1 R( f7 H' }
    / q4 K& P) v* S3 z1 T' X

    ( R7 C( i. G7 ?( u. O% C! B這裡的「新架構」是指後端的架構會有大變化) O& S% u" g& t" b7 [
    但前端的 UI 介面玩家不會感受出來有何不同4 a& u0 F$ S* d; m' B4 [
    * |# e! V4 K( ~  d& h

    8 Y" @2 G& b: V0 F- a/ U為什麼站長要改成新的獨家架構?
    9 T* d( H' i# N; s& b就一樣由AI模型來解釋清楚吧。
    / W4 R8 P: c! l/ u# w* g
    * t' e- Y" T) w( n; P! x- P  E8 E8 f+ {( O1 `' m! A, R
    讓我分析一下使用純 PHP 和使用框架的優缺點:) F5 g+ x; r9 L$ R" _, x; m+ [
    純 PHP 的優點:
    $ y4 z- M5 |. k8 S) E  _. S1.        性能較好 - 沒有框架的額外開銷/ k7 e6 i3 s' ^" F: y- a9 t$ T
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    & F5 C+ {. ^: C) k* X! z3.        更靈活 - 可以完全按照自己的需求來設計架構: v6 }% Q' Y: t6 A) M
    4.        代碼量小 - 不包含不需要的功能模組
    $ g+ [; v/ a4 P9 t! }' l8 o/ z0 ^3 z. D5.        適合小型項目0 b+ L; }2 _& a' d& o. _) _
    純 PHP 的缺點:2 G# t* c+ P7 `) N+ {- A" m
    1.        需要自己處理很多底層細節' g* Y! ^* m1 o( q9 n- T
    2.        代碼複用性差- |! N/ D3 k9 y3 x* n4 b. Y
    3.        缺乏統一的開發規範+ z& r1 o- q8 [- T1 V! w% f$ |- |* J
    4.        安全性需要自行考慮和實現
    0 b1 e9 T8 ]+ H5.        開發效率相對較低
    1 p$ d: N* u' n7 P9 E5 Z6.        維護成本高5 X1 ]1 k0 |+ l! V+ Q$ c
    使用框架的優點:
    6 _( I) Y+ v1 g1 b3 ]( N& F1 F1.        開發效率高 - 有現成的元件和工具
    - l$ C9 M% x; Q0 D& L" r2.        有完善的安全機制
    ( v4 Q; s" _# B; B8 Z% F$ S3.        統一的編碼規範
    ( u2 [; e/ J8 m4 X3 j0 e9 g* }4.        易於維護
    # I$ I% A- a2 X& g! {/ G5.        有活躍的社區支持
    , b( R1 z6 f0 q' U8 l6.        適合團隊協作
    , L* }" X0 H2 ?2 J% ]* |3 \3 H7.        自帶很多常用功能(ORM、緩存等)7 D. {5 X$ K/ R
    使用框架的缺點:
    , @( n% H& a% G& @3 q1.        性能有一定損耗
    * r4 l1 L. ?" X: y3 q/ A) j+ r8 @& K2.        學習成本較高
    . h8 Z' \9 ?+ h: y/ N- P3.        可能包含很多用不到的功能
    1 @/ o+ Q5 Z' U; ?: k% U4.        不夠靈活,需要遵循框架的規範
    / j9 @. q/ `  g5.        對小項目可能顯得過重' E/ L) v$ g2 R/ Q2 p3 y& H
    建議:1 o) ]4 Q7 |9 V+ h
    1.        小型項目或學習階段可以使用純 PHP! w8 b! D/ I" C8 |8 V
    2.        中大型專案建議使用框架0 y/ v2 V6 s8 N7 r2 S
    3.        選擇框架要根據專案需求和團隊情況
    6 b4 a" S7 K- P. ~2 @4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇/ y9 a5 R4 j. V; I3 Y8 k
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    0 ]1 e1 g2 S! G* C7 }& F: K" p# B9 p- w. y/ `  m
      }0 Q4 l/ [7 f" ^# _5 `! R
    0 [: r, O/ [2 S1 y; r( g
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    - n- e, j% }( ?6 j) y9 E& }( u6 z, R; g5 k' k5 _* E
    這個轉換主要做了以下改動:8 g5 o7 o  p5 `
    5 O3 f5 V! n" j' a8 v0 ^) ]* w
    路由結構:1 S$ F8 |6 e5 Z$ Q- ^

    ; X* M) J5 N/ Z6 a* p5 E* q使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ; [9 `  W. C  p# n支援原有的 page/mode 參數結構
    3 t. g# A- o  j/ I- H' d+ i0 N通過路由規則自動匹配到對應的控制器方法
    # I9 L& y( j& J3 d/ ^  D& ^* n/ p& `' z& N+ W3 W  }9 ~; k; B  D
    * m+ l+ W( p# b2 I3 C/ t; I
    控制器結構:: z% t3 J! Q! n/ G! L5 W7 I2 r

    0 u( ?% Q! \; h創建了主要的 LoginController 處理所有請求
    ( L" J, _; l8 {% e3 V1 M9 j! S/ g保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    " r2 _/ {/ u$ [" X錯誤處理改用CI4的視圖系統
    - x; P  l: P* V- X+ h% _' n/ e! r, K$ n3 C* Z
    7 q7 L% }- E3 _$ c  Z8 o
    類的組織:
    / V0 F5 y7 P+ M5 i4 n& l' T- Q% f% z$ |8 u
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    / ?& X. F/ Q" Z! |" f7 V1 }保持了原有的類繼承結構
    * ?3 R3 D% D" @: F! [5 R8 j  \改用CI4的控制器基類和特性, w  J& A4 J" h% ]& `
    ( V# L5 i2 |5 G
    - U* ]3 l* [6 m7 C; R9 b
    改進的安全性:! c8 x) i  \2 ?) z+ f  a4 y- ~& C
    - y& z$ ]! T1 T- Q5 ?6 U
    使用CI4內置的安全特性
    2 D6 D/ X& [3 x* }更嚴格的輸入過濾
    . i) B1 w. s& {更好的錯誤處理機制$ ?. C! f# o$ o# S) C# ~' @+ u
    5 H; c& F2 u3 _# s0 a0 U8 F

    1 ]2 W0 {2 H6 b/ \( v
    . o5 V* k& R5 |% Z4 Q要使用這個新結構,你需要:5 w" n" u% Z$ v# b1 v3 v

    : o2 D9 J5 a1 s' A' R將這些檔放在對應的CI4目錄結構中
    / u1 y$ Y7 C6 H' ]5 B: J. l/ Z# {0 y確保創建相應的視圖文件9 s+ x( e) I4 l
    配置語言服務
    - n3 G" E9 Q! l0 u根據需要調整模組檢查邏輯4 o7 T! @3 M6 a" G% G% Q

    0 ?, [' }$ x$ N2 `$ E1 y7 p需要注意的是,你可能還需要:
    1 g# @) E+ _. F) _5 @& F+ g& f' `% ?5 Z0 U( J' }0 |8 ~0 s
    創建相應的視圖檔(在 app/Views/ 目錄下). h6 [1 i  @" [2 N8 e) i; W
    配置適當的中介軟體來處理會話
    % G; ?2 t" z6 w/ W3 i# W% K9 s實現具體的登錄邏輯
    2 X6 i( I0 k/ y- Q* E  L! W: G1 k1 s# U  v. p7 @" E
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    / e* y3 i6 w1 l: O/ w2 r
    , w7 _) W$ d5 T4 u
    1. <?php
      ! ^+ x9 J  A9 w
    2. // app/Config/Routes.php
      ' v0 D+ U- d4 p, J( L8 ?. Y( w
    3. namespace Config;
      : |& w" E$ Q) t% }( t% u+ a* c

    4. , o7 W( N' C0 \* ~% Y% L& m
    5. $routes = Services::routes();
      & P0 I3 N- F$ M: G

    6. " e4 o6 a9 y. g. ?# Q
    7. // 添加自訂路由規則
      % [; d% _' k$ u. _. \7 Q1 k
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {1 z0 v* [& c4 S' l
    9.     $routes->get('/', 'LoginController::index');
      " _2 n# l( f5 q+ n( L
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');/ a  A3 u5 K: _1 }6 |
    11.     // 默認路由處理3 e: \+ ]6 i$ v* G1 ?4 |
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      ) s4 \" H6 L4 p
    13. });
      6 L+ b3 J6 k1 |+ [! ?- P
    14. - t0 Q. \; M  y7 `, Y; K
    15. // app/Controllers/Login/LoginController.php: l1 }6 d6 l0 y/ V3 C, ~- z
    16. namespace App\Controllers\Login;
      / I! e7 I& u8 ^1 V4 y! `

    17. 6 K4 z( N: b5 [
    18. use CodeIgniter\Controller;, }5 \6 L3 O3 U
    19. use App\Controllers\Login\AbstractLoginPage;
      . B0 a& k: h5 p' ^* b2 _% n% M1 w

    20. / B$ D3 ]8 T& J( i$ o% U) ?. r
    21. class LoginController extends Controller. `, R) L1 h. _+ m$ w- e0 ?! R* u+ j
    22. {
      " C% P: _8 P$ e
    23.     protected $pageObj;$ b4 k% t* ^5 X
    24.     protected $LNG; // 語言物件5 C1 d" @2 U4 I( b7 Q1 o
    25. : ?  S# f' v& [5 x; x: v9 C. [4 W
    26.     public function __construct()
      ' j7 m4 g/ }# X4 d6 Y- S; j5 ^
    27.     {
      & U' y7 L8 o6 I
    28.         // 載入語言檔和其他必要的依賴
      ; l" U. |6 s( Q; z3 s
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      . V5 h9 V( ?4 y2 l+ J
    30.     }! h2 k  a$ W- L) S5 ^9 j, N7 h8 U
    31. * U$ B* g8 [' g! m& Z- ]8 G
    32.     public function index()
      $ N. W$ r8 B$ v& p
    33.     {+ |$ X3 k5 w' X9 b' V
    34.         return $this->handle('index', 'show');
      * E- W" I1 s. y6 @3 @1 G
    35.     }' o( i/ g% y0 R& n( z

    36. 0 s- r) G& h+ d1 a
    37.     public function handle($page = 'index', $mode = 'show')
      " f8 j# w/ l$ V  \/ Q2 I' y9 k* P
    38.     {$ e$ C* \% z- g$ }3 u: h
    39.         // 安全過濾頁面名稱6 ^$ \' s/ j# K" }$ j. u( ~
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      # Y6 v0 _0 U. f* c
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';0 i& c- L* G$ L% V# `6 |
    42.         3 I6 O' ]3 e/ J, m
    43.         // 檢查類檔是否存在
      ! z: W2 a* E( _: m! E
    44.         if (!class_exists($pageClass)) {+ g" R$ w" R) p
    45.             return $this->showError($this->LNG['page_doesnt_exist']);& I2 o" ^: p3 p: U& u# q9 {: v) R/ C
    46.         }
      & F  M9 ^- `4 d3 @* |5 O* e

    47. # Y; d7 W- \# m* n  y! P9 f
    48.         // 產生實體頁面類" A0 ]* e/ N1 {" b/ U
    49.         $this->pageObj = new $pageClass();
      " l$ B: b9 Y! L/ t* e  K
    50.         
      2 J. _  p) k: s( I+ z5 [
    51.         // 檢查模組要求
      ) r0 P7 G7 e3 K+ h
    52.         $pageProps = get_class_vars($pageClass);- L; d0 e4 S9 z2 ]. `
    53.         if (isset($pageProps['requireModule']) &&
      6 T! [  ?% O6 g% b3 o3 H
    54.             $pageProps['requireModule'] !== 0 &&
      / G4 T5 w1 A& \, `* o3 d7 k
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      1 J! M2 m. |( D% M0 I2 C: _. t
    56.             return $this->showError($this->LNG['sys_module_inactive']);0 f- t% V' Z9 J; d) K3 n* W8 `8 v
    57.         }! E" r" w7 Y  Z1 `4 X

    58. ' R0 K# u* a( c
    59.         // 檢查方法是否可調用* b% i: A8 Z/ e1 v3 o
    60.         if (!is_callable([$this->pageObj, $mode])) {
      . {/ h6 w' j. |
    61.             if (!isset($pageProps['defaultController']) || ' w0 U  ^  }$ `7 C' {" r5 n( F
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {6 x9 A/ [7 E. i: n
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);, a( K- L# Z9 G4 _! E8 D
    64.             }
      . p% C! t! @& C# {
    65.             $mode = $pageProps['defaultController'];
      / r0 f6 u4 W, U3 _/ e  j; Q
    66.         }) O" N; W1 L, A) J) s

    67. % p# M0 C# ]0 t: f6 z
    68.         // 調用相應的方法
      ' g/ C1 E* n4 w- n1 O( _
    69.         return $this->pageObj->$mode();. L! U9 s9 f) S! j6 ?9 ]
    70.     }$ |, a; z& e) ~0 q5 |7 O

    71. $ A! P( ^7 ^6 m" h, m
    72.     protected function showError($message)! r& z2 g' [. s% X/ X! ~. V
    73.     {! ~5 k3 `" a) `5 @) \
    74.         return view('errors/custom_error', ['message' => $message]);
        A1 \9 }+ X; ~0 c
    75.     }5 k3 e  a5 g' \5 U
    76. 4 B( E& x6 `9 H7 p9 i
    77.     protected function isModuleAvailable($moduleId)# l% [, Z2 o1 F- E
    78.     {- h+ U$ a2 }! s# {
    79.         // 實現模組可用性檢查邏輯! I/ c4 w1 S6 \) c: M  T! `$ k
    80.         return true; // 根據實際需求修改
      4 l7 H* a' h2 B1 j7 d
    81.     }
      $ S" `, s; E# {0 R, l
    82. }" c7 k5 {' ?7 W' R- z/ L" |1 e
    83. , e' Q6 ~# X0 `+ ~
    84. // app/Controllers/Login/AbstractLoginPage.php
      7 \$ d, ~& N6 T# G6 d' y
    85. namespace App\Controllers\Login;
      , P) _# |5 k. ?/ c& g

    86. 0 d5 _4 Y# ?& }
    87. use CodeIgniter\Controller;0 m7 t. E' ~7 ]* A* I
    88. ! ?. Y  K3 A2 t+ A0 L+ T3 S: v! }3 K- h
    89. abstract class AbstractLoginPage extends Controller
      9 Q6 S3 e2 [1 t% o% {
    90. {5 @# T! |& |8 @+ O: o" t+ H0 y* g
    91.     // 實現基礎登錄頁面功能0 F7 l$ M! @! |, s/ h
    92. }! a6 W& V0 W; L2 G

    93. 4 b4 D8 [( ?3 T5 q6 }6 ?) \9 }: Y! o4 H
    94. // app/Controllers/Login/ShowErrorPage.php
      0 v) t& K. c" {9 ^  `& u2 Q! a
    95. namespace App\Controllers\Login;* b$ }, {8 y: I$ [; z
    96. . Y8 X% p1 P2 i: M$ u! g
    97. class ShowErrorPage extends AbstractLoginPage
      . a/ o! L4 `4 f8 E
    98. {
      ) t# q, q  r2 u& ~7 y
    99.     public static function printError($message)2 q8 z+ `, Y7 ]; ~
    100.     {
      6 s) w9 `4 `! W
    101.         $controller = new LoginController();
      + w- s/ w) }9 a
    102.         return $controller->showError($message);
      : C% Z/ s' K9 u1 h
    103.     }  O' X& ?/ Z5 r2 p
    104. }- G2 N4 v! E3 U; `  n) m# R) w

    105. ) T) c6 g; x: I" v! G& q$ s0 }
    106. // app/Controllers/Login/ShowIndexPage.php
      + i: n: j4 V, K7 P1 P
    107. namespace App\Controllers\Login;
      & o$ Y* ]5 e2 W. J* C2 I
    108. 5 t: I1 G7 O9 q$ X( E
    109. class ShowIndexPage extends AbstractLoginPage% Z2 U' o7 ?. o& \! |6 z
    110. {
      1 X2 s: W0 A+ Y5 [  \
    111.     public function show()
        C. l: M3 L7 |/ l  E6 P
    112.     {
      3 U2 `& Y+ e0 l1 _& x3 q
    113.         // 實現登錄頁面顯示邏輯; I! d) i* n# G- |& \
    114.         return view('login/index');4 r; l8 R5 M  z' [9 [- n) @
    115.     }
      ! T: O$ Y* ~, h% O8 W, q& S
    116. }- M; q! D6 @- J) t% d# b& }0 _5 Z, a
    複製程式碼

    文章的最近訪客

    您需要登入後才可以回覆文章 登入 | 立即註冊

    本版積分規則

    QQ|Archiver|手機版|禁閉室|MyXNova (原 myxnova.com)

    GMT+8, 2026-4-21 04:21 , Processed in 0.013085 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

    快速回覆 返回頂端 返回列表