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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14825 / 14825

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致; t9 b' \" H5 I$ y. A0 a7 a/ g
    AI 就是站長的最佳幫手。: [* Q+ [. |' b* }1 p, B  N
    / E& D) T: b' ?
    ) K; `& v; N1 f0 n/ T' P
    這裡的「新架構」是指後端的架構會有大變化
    : q/ c. U6 r7 ~0 x/ R  i但前端的 UI 介面玩家不會感受出來有何不同& k. m3 H* e7 r/ \
    4 j/ y; W, u" q. s. \

    & ^( u/ S+ F3 ~0 r為什麼站長要改成新的獨家架構?: y- Y7 D3 w% Z) l% R9 d
    就一樣由AI模型來解釋清楚吧。
    , ~6 i# ?; t! O/ \2 X  y8 |0 d3 y

    % v' a9 G& H  \+ d4 K3 R% `5 T2 w讓我分析一下使用純 PHP 和使用框架的優缺點:
    ; v$ x- S7 S, S  s純 PHP 的優點:
    7 U# y0 |# y& u1.        性能較好 - 沒有框架的額外開銷
    0 G) x3 R: w6 Z" U  i1 @1 D$ r2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    & ?7 {! ]! F0 P3.        更靈活 - 可以完全按照自己的需求來設計架構
    ) R/ Y, l  f7 D1 b: b5 Z4.        代碼量小 - 不包含不需要的功能模組
    # e. \5 S7 Q  Q5.        適合小型項目
    5 s. l" C( c3 Y1 L" ?純 PHP 的缺點:
    - x' p7 G$ @0 L; \$ }6 }1.        需要自己處理很多底層細節, V- Z8 y! Z0 q3 K1 N
    2.        代碼複用性差
    $ X6 n9 s# \1 l( O3.        缺乏統一的開發規範
    ' J! t$ l/ ?8 _3 N. Q4.        安全性需要自行考慮和實現
    8 a9 A& B4 P; ]1 @- M8 y& q7 N5 u. d5.        開發效率相對較低
    , U6 |4 h9 p9 }6.        維護成本高' f5 ?* z* S! E" T  I; w
    使用框架的優點:
    ' m: K+ U+ _# L2 ^: T9 z1.        開發效率高 - 有現成的元件和工具
    ! A' R3 P8 N, d! n8 }5 x2.        有完善的安全機制9 Z/ B" D( j' ~" I
    3.        統一的編碼規範% Z$ \0 q# k8 k8 {9 Y
    4.        易於維護2 y* m" \! V7 x
    5.        有活躍的社區支持
    - K! c6 G# E( d6.        適合團隊協作
    / l7 L% I) b9 W8 a7.        自帶很多常用功能(ORM、緩存等)- a! C. g, z$ {
    使用框架的缺點:6 @& P* O9 e; O; Z% T% I
    1.        性能有一定損耗# `3 O5 m) y4 I6 H  g
    2.        學習成本較高, x# t0 C7 z$ J0 d
    3.        可能包含很多用不到的功能
    6 F2 [; v- F+ i0 g  O4.        不夠靈活,需要遵循框架的規範9 Y& Q) m- _9 R9 w6 y! W/ a6 G
    5.        對小項目可能顯得過重+ C) O* Y: c' t' D' L
    建議:( e. e" c9 P; B0 p6 r. P- R
    1.        小型項目或學習階段可以使用純 PHP
    $ r& D. R4 z" _  i6 r# Z2.        中大型專案建議使用框架$ f  t0 N- p1 Y% b1 K
    3.        選擇框架要根據專案需求和團隊情況; q5 ?$ l7 p4 i) {; z" m% y
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇0 O9 f* `4 }8 P6 R6 ?2 L- k. t
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
      J$ ]/ A# K- ]/ I
    $ E# }- G5 ~- Q" s; s# S0 j( ^. T8 t8 @; ^2 q4 J# L
    ( S( u# q% h& z" ~2 M- [
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。; ]6 x0 G6 T7 Z# |. w; {
    0 X3 c+ w  o& G7 V" h
    這個轉換主要做了以下改動:
    : \' |! q$ L' ^) e2 [+ }
    9 z% A: H, p! x" M9 \8 A路由結構:
    # d8 P. c: p1 I: U' k
    - l$ T! F* `6 `使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下9 m6 o! q) j1 W1 ?; h$ u8 Z6 c9 ?) Q
    支援原有的 page/mode 參數結構
    ) P/ Z, K% h+ Q7 }  r  n0 i通過路由規則自動匹配到對應的控制器方法. O! j) M$ C" d8 v

    ) ^8 G, n. o; c" a+ s% T
    . s  v" j) s8 D- _控制器結構:" l1 i  H7 \8 w# [) H- J1 f/ U. I
    ) w9 Z. f' [/ W( y+ a1 u
    創建了主要的 LoginController 處理所有請求
    0 h+ W, I, m  D5 T- E5 ^) x4 h保留了原有的頁面類結構,但改為符合CI4的命名空間規範) o4 e$ G5 X1 J" X" ?6 s
    錯誤處理改用CI4的視圖系統
    : C  z* i+ ]. t) t# ~1 s) a
    1 v& x# z. K  t) C" ]3 j  _4 h" _9 \! R# @9 {
    類的組織:4 M- q5 ~9 c: f  `) D- X
    " o( i+ S8 U7 X1 B9 J# J" o! M
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下5 i( v' F1 r1 E5 S
    保持了原有的類繼承結構6 K- r/ N, o5 O( A. `; X* i
    改用CI4的控制器基類和特性$ Z" I; w3 U5 X/ |) L. E

    & O/ }$ D& Z7 [) g: P6 i* x& r9 d  _1 l' x6 M
    改進的安全性:
    * \$ A! V- y" E6 Q( N8 `
    ( d. T# I0 W; j- g& {) X使用CI4內置的安全特性: ^. D, u. Q9 t7 g7 w
    更嚴格的輸入過濾
    6 R1 ^: P* X0 T* D) z9 j) a) |1 ?更好的錯誤處理機制
    + g% @8 }; z' c& r$ @& I2 X9 y9 f% N% ]4 S2 C, J% J* j( X

    # x" V- P0 C- t, n  P: g+ |
    $ s. u% {$ s) k* A要使用這個新結構,你需要:
    + v- S9 j5 M# E& r3 V" W+ D
    6 u) d, O1 Q+ i' \7 F將這些檔放在對應的CI4目錄結構中  v1 \5 L) K4 d
    確保創建相應的視圖文件
    1 W) ~) D7 B9 S) L/ C; y0 @配置語言服務- C& N3 d4 X" @" V3 W& I
    根據需要調整模組檢查邏輯
    " C" s! n7 }* Y; O/ m# o
    - e( D0 ~4 D# U/ m2 I1 m需要注意的是,你可能還需要:
    " n4 V4 `7 L. v4 b! [- i9 x4 N
    * w6 X% V1 I& k3 p8 u* w: u  C創建相應的視圖檔(在 app/Views/ 目錄下)) t/ C) s7 j- |- C, G
    配置適當的中介軟體來處理會話% f, j# a& |8 A' [9 H3 v5 d4 \
    實現具體的登錄邏輯/ ]6 Z! f' E3 L. Q! i

    4 l/ \# h, i+ l7 A! O$ I需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?% B4 S5 j% t( U. T1 ?

      Z  S& N' Z4 N
    1. <?php
      ! ~( D" g; V1 v
    2. // app/Config/Routes.php
      * W7 o# u  }* A
    3. namespace Config;4 d% O) v7 ?5 \7 n
    4. 6 G6 d# ^& R1 e* [% t8 j; c7 ?1 a
    5. $routes = Services::routes();
      ' \8 s/ ~$ D: L' @. t' Y
    6. ( o2 Z8 a, ~$ X6 Q4 w- e' h
    7. // 添加自訂路由規則
      9 }; R4 G5 e9 T. I7 N
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {5 h3 Q8 j! A4 x( W3 P: G
    9.     $routes->get('/', 'LoginController::index');* h5 _' a( M4 Z1 p0 L  z
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');( j% a5 J( Y- v8 ~; f+ S' j$ g
    11.     // 默認路由處理) B2 [; `+ @2 x8 e
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');* b, c2 J3 r- @
    13. });8 J2 r2 I& m, k9 C

    14. 1 x& F( ?+ m" u  h9 s$ N
    15. // app/Controllers/Login/LoginController.php0 D- i8 `; A8 f
    16. namespace App\Controllers\Login;; d& e" E/ j- o" ^

    17. , v( ]# o& m! H+ ~, M! o
    18. use CodeIgniter\Controller;) s' ?/ N; X9 ^3 R# M6 }9 F) _
    19. use App\Controllers\Login\AbstractLoginPage;; Q/ U5 A! Z7 F0 q* Q5 [
    20. & h0 J8 h' k$ f5 ^+ z
    21. class LoginController extends Controller
      7 q9 _) m& W7 S% b6 x! }# b4 y( `
    22. {2 ]  B# r, _+ F: T$ a8 z
    23.     protected $pageObj;3 Y* d$ H5 ?% `, P0 M( ]8 F6 U( `
    24.     protected $LNG; // 語言物件# t; v* j; ]2 m! C) D6 e5 n

    25. 7 x, r" `8 d) R* x  q
    26.     public function __construct() ! x4 Y* F# L) z
    27.     {
      , n! {1 I" D# M
    28.         // 載入語言檔和其他必要的依賴
      7 }+ q" A$ y. t4 s; K6 n
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      5 Y5 S" q$ f( \2 K
    30.     }) Y1 k* R, v# K: r* ?

    31. # U6 ^4 y& _, b
    32.     public function index()2 d" t% s& g7 b& C/ i# U% V' W
    33.     {1 ~% P9 ~' ~& r, k6 N
    34.         return $this->handle('index', 'show');
      7 n* h  t, I, W6 ^
    35.     }: ?2 W* H: F' E6 o' Z
    36. , U' x- B3 u0 d5 i' f
    37.     public function handle($page = 'index', $mode = 'show'). |! G+ f' {! Q" `- s( u: Z
    38.     {8 _4 K$ w+ X+ _$ o# U% t
    39.         // 安全過濾頁面名稱$ @6 R8 b% Y/ m5 I3 s/ _) u
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      2 h" m. a5 g2 u* R; L# n
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';) U4 e: D, z" D; }: a! _
    42.         : H! g; r2 N8 f" w
    43.         // 檢查類檔是否存在& \- O  L5 e$ f
    44.         if (!class_exists($pageClass)) {# B: k: @# F1 |$ Y" g' P, r
    45.             return $this->showError($this->LNG['page_doesnt_exist']);5 B" ?& I  E. @+ W
    46.         }$ ?# _- Q9 o/ I
    47. $ e; |: Q( t3 L* l2 b5 {
    48.         // 產生實體頁面類
      - A0 ?* ?- A9 d0 H  ~
    49.         $this->pageObj = new $pageClass();1 H! B5 ]9 m: D1 n" l
    50.         ' O$ ]) b1 }  D& U
    51.         // 檢查模組要求) V% N. P8 F- f. X
    52.         $pageProps = get_class_vars($pageClass);
      3 N* L$ h$ p( @- Q) M5 n
    53.         if (isset($pageProps['requireModule']) &&
      ' T& G% ^. H3 x1 [
    54.             $pageProps['requireModule'] !== 0 &&
      9 J: x% I: v% E0 V8 L/ u8 j; z
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {# Y( V& |0 z+ l  O
    56.             return $this->showError($this->LNG['sys_module_inactive']);2 ~2 L7 G6 M2 y
    57.         }
      % i! b3 H& c( G& l

    58. & g/ `9 m( ]4 B) t
    59.         // 檢查方法是否可調用
      4 Y! R: g4 e4 f9 t; F
    60.         if (!is_callable([$this->pageObj, $mode])) {
      : q" s% v. }6 O0 V4 ?' Q1 O) c& l
    61.             if (!isset($pageProps['defaultController']) || 6 K9 W6 @! y. m' L  U, a' X
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {! G% U  g; O3 S' _% E% H% O. x2 T
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      5 j- C- O3 s( Z0 y; ~$ O; @: m1 p
    64.             }: o  X& x$ X1 M& c% ]4 P: u1 [2 X
    65.             $mode = $pageProps['defaultController'];5 R8 V, T; r/ q' D; r  @5 O
    66.         }6 u3 ]' p& W+ A
    67. 6 U$ u% H) Y- T* x3 d6 E/ r" p
    68.         // 調用相應的方法
      2 U+ w* O7 ]# Z* ^! \( @; n9 h. j
    69.         return $this->pageObj->$mode();8 \+ T) S9 x: j7 X7 B8 p9 H
    70.     }
      ; `+ @# m$ P# r9 F
    71. # \' Y* {! p+ K$ O- j
    72.     protected function showError($message)& R% M9 {3 d8 M! l; U2 u" p8 C. ~
    73.     {: J2 o) H2 Y* z" J7 L
    74.         return view('errors/custom_error', ['message' => $message]);' B7 t" C* b5 a0 S
    75.     }
      ! C$ l- s; c- B; A

    76. # s/ r6 x2 E/ R: f7 K" M$ C) E7 G
    77.     protected function isModuleAvailable($moduleId)
      ) r$ s/ ~) Z* `4 C# C1 r
    78.     {
      % C3 L8 {; q8 s; r: G6 l2 B
    79.         // 實現模組可用性檢查邏輯
      . o% F& _- _) T' @* k/ U0 n
    80.         return true; // 根據實際需求修改- d9 b# |$ k- K2 k5 Q- U  z
    81.     }
      * c7 U5 _2 h5 e  f) b
    82. }5 u( Y! M* @; K6 h

    83. 5 [6 z5 Q0 S" Q0 J: Z4 p, Q- |& `1 r1 e
    84. // app/Controllers/Login/AbstractLoginPage.php
      ; G( f' N: k; b; P( B/ x  T- U. p
    85. namespace App\Controllers\Login;
      9 Z" _* u% l! X; [$ W" P. T
    86. 4 {; S& q! _% ?" h8 [7 n5 \, i
    87. use CodeIgniter\Controller;6 X' B9 O9 l0 q" O; H

    88. ) d9 f. C! P& u( H; n2 |: Y
    89. abstract class AbstractLoginPage extends Controller* x/ F3 n% t! O
    90. {+ [5 u+ q6 b; M  ^% }, }
    91.     // 實現基礎登錄頁面功能6 M9 w# p% W" v# C
    92. }
      ; |( b* _; V; G: O0 C2 \

    93. / }" z; d$ {( [3 k- U8 Q
    94. // app/Controllers/Login/ShowErrorPage.php6 }: z( z3 A8 s- }, J. k' o
    95. namespace App\Controllers\Login;
      ( u; @% i3 k1 Q! K+ y

    96. , M9 ]8 I0 {9 C8 V' ]8 E: W
    97. class ShowErrorPage extends AbstractLoginPage4 \; A+ ^8 r, ]; l
    98. {
      " t9 n6 [. C: G( L! G1 v
    99.     public static function printError($message). \+ l8 S: P+ G4 ~
    100.     {
      ' W/ f9 i5 K$ {3 A
    101.         $controller = new LoginController();
        A0 u: ^) f1 t$ m
    102.         return $controller->showError($message);
      . O9 P9 f) U, C4 f! e: {  O
    103.     }
        D' n0 A3 s# o# Q0 f- l) H
    104. }
      ( N! S# y: `3 N
    105. , X; H- X# l! Z! X/ v  q2 D! u
    106. // app/Controllers/Login/ShowIndexPage.php7 C7 |* W% v/ q7 J8 @
    107. namespace App\Controllers\Login;
      * B$ v& ?1 f! ?, `3 y6 x

    108. 4 h, B8 y+ X1 _% v9 B- x# m' t
    109. class ShowIndexPage extends AbstractLoginPage
      + p  w. ~" {% r, @. M
    110. {
      4 w4 z& h- x% A6 h) H, d# F: Q
    111.     public function show()
      ( U1 j( n( B, Z8 }8 w5 d/ {# G( O
    112.     {; ~7 w! g( g( m
    113.         // 實現登錄頁面顯示邏輯
      : E1 Y* r( C3 k( E4 u% F' H
    114.         return view('login/index');1 O: H) Q6 F4 L  J$ N
    115.     }
      , E) W' Z; I  u2 h/ Y3 {& S
    116. }
      8 r$ F9 X, c! U1 v4 j0 a( j4 t
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-5-19 04:13 , Processed in 0.014445 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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