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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15202 / 15202

生命值:6%

升級   100%

  • TA的每日心情
    奮斗
    14 小時前
  • 簽到天數: 6041 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    8 }1 N$ C. p( \! R  q' z6 Z" B3 kAI 就是站長的最佳幫手。
    " U' N* U+ q! ?$ `* u& p# p6 b+ {# l3 [+ s: J0 @  s$ c

    + }9 ^! p/ U1 \. v這裡的「新架構」是指後端的架構會有大變化
    5 e/ t0 r1 t- f5 [! U6 s4 z9 i* e但前端的 UI 介面玩家不會感受出來有何不同0 H( b/ T- F  }9 k0 m  }
    : `" K, X. P' }8 l4 M) P
    + B  M. B) K1 H' G7 R1 V  V
    為什麼站長要改成新的獨家架構?. |4 U8 K/ }# _: M- h
    就一樣由AI模型來解釋清楚吧。1 O0 l) |4 P$ U! H. s
    + h  e" I: `: f9 s2 r6 z
    3 r  S3 h6 Y* ~2 `+ e
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    , K) L/ ?6 m# b* u5 l純 PHP 的優點:
    % B! k- M: w0 L1.        性能較好 - 沒有框架的額外開銷2 v5 k4 S( e9 d0 R) E
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    & a+ N. l: w/ C/ h# V; p) N3.        更靈活 - 可以完全按照自己的需求來設計架構. ^$ i3 B0 Z; y: q; z0 ?( g( r
    4.        代碼量小 - 不包含不需要的功能模組0 i9 M) _" @, M2 }
    5.        適合小型項目; d8 f, w5 n( z; M4 w4 V  r
    純 PHP 的缺點:
    & \' R6 t" g" Q9 q6 \1.        需要自己處理很多底層細節
    0 @. H4 t, G4 J2.        代碼複用性差, ~; e( c2 N0 e' [- x0 i
    3.        缺乏統一的開發規範! _* m, N0 L7 r& ]" Q
    4.        安全性需要自行考慮和實現; Y7 i! Y' D& D$ K9 c, l2 V; M' F
    5.        開發效率相對較低
    0 @) B  I& m) x. ^7 o# _6.        維護成本高6 k" l( s- \2 g- T* Q
    使用框架的優點:
    2 {6 z! G% _; v8 L* d1.        開發效率高 - 有現成的元件和工具0 g# ]- b* K8 w4 z
    2.        有完善的安全機制
    ! o  W0 P% c+ d) S( E3.        統一的編碼規範" y2 x( v- V9 a" Z) I- h
    4.        易於維護4 b" p7 T& ]4 y6 _
    5.        有活躍的社區支持
    9 I" V, s$ O& a2 F$ o% M! }" }6.        適合團隊協作
    , F6 c9 J: T* D1 l7.        自帶很多常用功能(ORM、緩存等)4 K" t, o9 v- t, X1 Q
    使用框架的缺點:
    6 l9 M4 D7 x3 P3 z& j! p1.        性能有一定損耗
    , k9 {; j; T; N' k2.        學習成本較高" U, o: a2 q9 d. D, i' y$ o! M
    3.        可能包含很多用不到的功能
    5 P% |/ e0 s/ m$ @# b' h4.        不夠靈活,需要遵循框架的規範2 U% H* M. Y6 o6 p  t6 \0 N
    5.        對小項目可能顯得過重. H- S( e, S0 s
    建議:% `6 y2 j0 W# {$ S
    1.        小型項目或學習階段可以使用純 PHP& X) ^$ V  G7 K) V5 X7 u0 Q: _
    2.        中大型專案建議使用框架$ A' Z9 N# p; P
    3.        選擇框架要根據專案需求和團隊情況: l  k' q3 U2 X2 e! s; I# l
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇1 z# |' M( u( ^5 G  Y
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    5 g1 {4 z3 }& r  J* P" ?5 u2 P' d5 z
    ! W2 {* s; H& ^( H! P6 w
    ( C& Q: m, i& O. I2 d6 W
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。2 i6 I- E  P- h: H/ |8 |1 e

    8 ?: X1 ]5 R  n" a% v2 W& b9 V# q( k這個轉換主要做了以下改動:
    ( D0 \9 f5 d  s& m: P( {' y0 M1 q9 k% O; u, d4 x$ `
    路由結構:
      U, z+ ^! H1 P2 F$ [  g7 Y
    / |3 A+ v  y6 b$ l: l4 i' B使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下5 D2 {0 X% E- b% D. {5 |
    支援原有的 page/mode 參數結構
    ! [" }# ?: B3 J, \' _通過路由規則自動匹配到對應的控制器方法
    & [! D3 n5 _$ f* b' [0 E
    : L  G) u) o+ [' z
    6 B1 j5 V! k% z3 w控制器結構:
    9 }' c+ U" t5 y& y2 v5 z( A+ P/ Q) N3 ~& }
    創建了主要的 LoginController 處理所有請求
    9 k( o' G5 c, n/ Z& B5 N保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    ; a# q/ ~; z+ H# u  e+ Z+ O# \錯誤處理改用CI4的視圖系統' B) B4 n5 n  @7 g
      |2 Q" p$ D6 j3 O/ o0 o& O9 B

    7 E7 b! @% r; e9 O3 U  r/ _類的組織:
    2 g$ u& o$ d5 ?5 ?, B2 w. B$ A: v2 S, T8 @+ H5 ?$ [  b: W7 y
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下7 M" j/ D8 F0 U4 F# v' C) \
    保持了原有的類繼承結構1 y& j: h/ f* i! K% N
    改用CI4的控制器基類和特性
    ! n) ?( p; m/ L
    & _5 z1 g4 a- a' ?6 C. J  S  a- S3 J9 p* m2 I
    改進的安全性:! R8 ]; N, v& c4 n& u3 w
    9 |) v1 E0 Z( e, [( Z6 _7 Y
    使用CI4內置的安全特性- d+ @1 I0 Z; ~4 X, }
    更嚴格的輸入過濾4 V* x5 i2 e: N8 L0 i' _
    更好的錯誤處理機制
    / ~; t; ?% i3 H6 q1 p
    + A/ c' q  g/ y3 n- c2 o( Q. `- Y" Z2 e* C4 {) D1 K# E) r5 ~
    # ]- p; w2 ^* X( [) O8 |
    要使用這個新結構,你需要:1 b) j6 w' M0 h
    " B. \  O& F; \1 }- L- J" l! {
    將這些檔放在對應的CI4目錄結構中
    6 {& T2 F# _8 ?0 n確保創建相應的視圖文件
    # t- D2 u/ A% Z2 p, q4 W配置語言服務( N; N( h: Q9 ~
    根據需要調整模組檢查邏輯
    & X" s- E# i9 z) X! \, U& [. a! k* v7 L; K
    需要注意的是,你可能還需要:8 a" c5 ]7 t9 `+ L* t, e' F6 U

    0 j; n) S+ I- J( v2 P) L" ]創建相應的視圖檔(在 app/Views/ 目錄下)/ G* c* X& n5 U
    配置適當的中介軟體來處理會話: O" o! m3 k' A4 \
    實現具體的登錄邏輯5 {' X" Y6 r0 G' E# t
    , B5 Z9 Z  o% j0 J' }4 O
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?2 U% Y4 o6 t' P" p6 G+ e
    * N: r" w( [- U
    1. <?php9 A+ V; u9 m$ o! r3 T( f
    2. // app/Config/Routes.php
      7 X! B4 j8 ?+ G$ K2 G
    3. namespace Config;
      ( s0 f! }7 u8 T/ U% w" t3 H
    4. 8 v: ~* a% O" y& p. E, t0 P
    5. $routes = Services::routes();
        n+ Q/ U$ d8 r
    6. ; k( D' w; i* s2 \
    7. // 添加自訂路由規則* j  G& m& X' S' |- Q2 S
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ; ~$ T( h# N( o# C6 v- y0 F) [8 L
    9.     $routes->get('/', 'LoginController::index');
      ' B. e% x, m* ^* z1 G0 `
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ' [( ^( \: |* }6 |2 m4 V
    11.     // 默認路由處理
      & \; I; e6 |* F9 S4 \! {7 p/ p
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');; E  v# |* r# N" x! S! Z, `/ `
    13. });
      4 J& K1 M4 H7 I( W
    14. + R5 d2 Z1 h0 e9 S: r
    15. // app/Controllers/Login/LoginController.php! d/ x' u' N4 r0 g8 E- {
    16. namespace App\Controllers\Login;
      " T7 E2 a/ W) P! F
    17. ! {# c% L, O. A5 }
    18. use CodeIgniter\Controller;3 S$ S( o- V9 \
    19. use App\Controllers\Login\AbstractLoginPage;, |2 C6 ~# k$ w8 ^
    20. 5 z4 ^# d3 j# C& l
    21. class LoginController extends Controller) m6 k4 [" i& J: g
    22. {" f6 a, k: {6 o( h) H& m6 U
    23.     protected $pageObj;
      # j% L1 |1 e$ E& A: v* R% W& U
    24.     protected $LNG; // 語言物件' k! E& f4 M. s9 t$ _9 r/ L6 B7 T

    25. . C, n+ b4 p, |2 V/ ?
    26.     public function __construct() " L, L1 C7 ^0 c) h! X
    27.     {
      1 G# M* {& u' ~2 t; j5 M: P
    28.         // 載入語言檔和其他必要的依賴
      : f4 a/ c1 ]/ L* j0 R( }, o$ k- m
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務3 y/ g0 s" A" x% t
    30.     }
      % I7 R% J$ x! T" S7 C8 r0 ^

    31. . @7 |& p+ W( ^0 l* }3 G( Y5 X( z/ Z
    32.     public function index()
      / z6 h( r2 g( \9 v1 _
    33.     {/ }# h0 P  l. N. B% C5 q! Q: D
    34.         return $this->handle('index', 'show');6 @& P  D# A( w1 S1 K8 x5 C
    35.     }- e) b8 B4 i+ m; G4 S) w" ], u& s4 v

    36. . g# O% W- @* H& _4 a7 H
    37.     public function handle($page = 'index', $mode = 'show')
      4 |% t6 N4 W! I
    38.     {; i7 V$ a0 X1 z0 s" @
    39.         // 安全過濾頁面名稱
      2 O9 s( u0 C1 t: L% N! L
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);6 x% K1 A/ q( y+ V5 F1 Q
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';" [  \* u) j& ]$ o* r5 ]
    42.         $ I) Z1 a8 W! M- E  R4 p  r8 F/ l6 }
    43.         // 檢查類檔是否存在
      * ?1 u1 k5 Z4 ~, D
    44.         if (!class_exists($pageClass)) {# |2 ~4 q$ k& s9 `: v
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
        j( s5 v) B4 n' d3 B
    46.         }
      1 Z6 e' b8 \9 h! F
    47. . G: X3 j( i4 H  D3 K" m7 f
    48.         // 產生實體頁面類! C2 Z3 _/ Y; w/ c' a: x
    49.         $this->pageObj = new $pageClass();1 E* n6 s4 s1 m2 V8 G, `' x6 U
    50.         : ^/ c' ]- V; ^; S# E* {. z
    51.         // 檢查模組要求
        Y' o; _+ R+ V( q' i) G
    52.         $pageProps = get_class_vars($pageClass);6 I; y4 a# p2 L4 D8 W; x
    53.         if (isset($pageProps['requireModule']) && 9 p; R8 ]. x& B  K2 a
    54.             $pageProps['requireModule'] !== 0 && ; c0 a8 X: ^; W$ h! S# a" e
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      9 G) I( v" o' e, W3 @1 b/ O3 {7 A
    56.             return $this->showError($this->LNG['sys_module_inactive']);' _! q9 m7 P% |3 r$ {4 F2 q+ N
    57.         }* h! t# o( B: W* ~+ T; q5 G1 t
    58. % p/ B  z. V( z5 R
    59.         // 檢查方法是否可調用
      $ b& D; D  c1 B7 ]
    60.         if (!is_callable([$this->pageObj, $mode])) {  l' l8 G3 `4 U. {' x4 U: N+ h5 B
    61.             if (!isset($pageProps['defaultController']) ||
      / E4 x' D. c" g) o
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {, c& G. r0 ]7 D6 T% x1 F
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);5 r5 W. F, f+ ?% m" ^& ]1 ^' m
    64.             }
      ; {" L4 C* f! w  p* S. z
    65.             $mode = $pageProps['defaultController'];
        u, z- L$ x9 c, m: P3 k9 j+ U) |: f
    66.         }
      $ c4 G) m, L& C

    67. 8 T! T  G. A( C. \8 }9 w' d
    68.         // 調用相應的方法
      8 r& \" V7 |9 o3 ~; j) _
    69.         return $this->pageObj->$mode();* b* k- C2 e% e3 Y' Z% w- G
    70.     }8 v- o. |7 W; J# r6 u8 o! _/ b
    71. : k/ o! u4 s5 S+ H/ H
    72.     protected function showError($message)) f4 h$ @+ ~9 m, F
    73.     {
      0 ~; l, A1 m# a& V; L
    74.         return view('errors/custom_error', ['message' => $message]);  Z3 _* m1 t: w- G$ K) J! ]
    75.     }' [3 [6 ?+ f! R/ k& ~) E: c6 E' _
    76. & _$ L) o( d6 [0 W8 w$ s8 M
    77.     protected function isModuleAvailable($moduleId)
      + w" Q% m4 c) z" M' \+ [# p
    78.     {' N) s" I8 q0 P' N! k
    79.         // 實現模組可用性檢查邏輯$ W( b2 |! s% `
    80.         return true; // 根據實際需求修改
      - @% H. z9 y4 L3 ?$ i3 f
    81.     }
      0 G" \" i/ a# n6 E6 z7 B0 b
    82. }
      9 N# M3 P4 g9 x
    83. / I1 L4 g2 v: y6 h# t0 Q
    84. // app/Controllers/Login/AbstractLoginPage.php
      " c, @$ x7 o! o2 V2 ?4 _8 j$ a
    85. namespace App\Controllers\Login;  B  d- Z" I. s1 L) n6 t
    86. ' J$ ~! ]: v/ ^8 ~1 U' q
    87. use CodeIgniter\Controller;4 Z1 R. I  O9 N; c

    88. 6 f0 F% L# P, i1 \
    89. abstract class AbstractLoginPage extends Controller
      2 J  F+ d6 ?- U9 p! r
    90. {+ c2 l* S9 M* |4 [( [. {5 P
    91.     // 實現基礎登錄頁面功能& }5 Y- [5 z: n: b' v; |
    92. }, q# C8 j( F6 r0 D# a! r

    93. 4 m4 P) y4 x% n1 N: |' l
    94. // app/Controllers/Login/ShowErrorPage.php* E. G0 |/ [8 k' b+ v  Z+ X
    95. namespace App\Controllers\Login;$ G0 r5 B0 Z& r' t6 x  J1 m0 Z1 ?9 u
    96. # u* f  W* c) z- e! V1 V
    97. class ShowErrorPage extends AbstractLoginPage0 B0 |3 a! j0 @8 G$ U
    98. {
      " t' S3 z* y+ F
    99.     public static function printError($message)- p2 ?7 ?: S) n
    100.     {0 {0 c& u4 k! u7 e2 E
    101.         $controller = new LoginController();2 c2 e6 C+ Z4 S
    102.         return $controller->showError($message);
      5 S, L" ?/ G5 ?+ E; K% f  F
    103.     }
      9 k6 W/ J# t8 N+ k* e
    104. }
      : G' [7 C" C4 c3 t( ?

    105. 3 e  n; p2 B3 s2 N& V. F
    106. // app/Controllers/Login/ShowIndexPage.php, L9 L5 G: C5 p6 V' Z
    107. namespace App\Controllers\Login;+ z3 t! }) E2 E+ w/ b5 q

    108. + _/ F9 ^+ V- O; ?" v. ?
    109. class ShowIndexPage extends AbstractLoginPage) ?* y' B6 n- v. N
    110. {
      1 i6 p7 ^2 n) ^: z3 |
    111.     public function show()
      . Z0 H; v" m8 ]8 z/ X
    112.     {7 [# H; |! }; {+ _
    113.         // 實現登錄頁面顯示邏輯8 H) B7 s8 Q1 Q4 o
    114.         return view('login/index');
      2 K6 P8 Q8 O. \; u
    115.     }  ~( S  b% w  q+ |$ X1 U
    116. }
      0 w1 G6 u7 C) K- l  k9 K
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-10-6 14:27 , Processed in 0.012751 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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