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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13562 / 13562

生命值:5%

升級   100%

  • TA的每日心情
    無聊
    15 小時前
  • 簽到天數: 5488 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致6 a* ?" }0 R+ y) X2 d8 C
    AI 就是站長的最佳幫手。' h- I) O7 e& ^# c3 A+ \
    8 J8 ?* l- I# K3 y4 g! E4 F: Q

    5 H5 a2 `/ q; M* i$ R2 w這裡的「新架構」是指後端的架構會有大變化
    6 q7 `4 G  F& v* i但前端的 UI 介面玩家不會感受出來有何不同3 \* _7 u& h' q$ U! _/ L/ s9 c9 D4 _

    1 @" c% q$ k7 l, L& W/ O( m! T# L& A/ r+ ~: X
    為什麼站長要改成新的獨家架構?
    3 p8 n; e( n- ~  u8 t3 x$ T就一樣由AI模型來解釋清楚吧。8 t% h2 a6 ^% Q

    4 |% J$ h, \/ t# i- K
    + A* @; c8 E' v1 P9 H5 S) q/ d讓我分析一下使用純 PHP 和使用框架的優缺點:( Q$ Z. ?4 C6 m# H" r
    純 PHP 的優點:
      U0 S8 U8 j1 X4 I1 z1.        性能較好 - 沒有框架的額外開銷* g3 W7 _) u8 t: K% A
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    - Y" F; ]1 M% L7 G/ u3.        更靈活 - 可以完全按照自己的需求來設計架構
    2 v+ @/ }% F: e* ?) w4.        代碼量小 - 不包含不需要的功能模組
    6 n; ^) i' M. ?4 e% m, D" e3 T. {5.        適合小型項目9 F! s0 s: b) Y3 ?
    純 PHP 的缺點:6 R0 H0 H& f( V8 e+ w- W( y
    1.        需要自己處理很多底層細節; z& }' f) w: W& \; c( d! C
    2.        代碼複用性差8 ?, N2 b9 [& w4 w
    3.        缺乏統一的開發規範: I6 j5 C, P* H1 d5 g
    4.        安全性需要自行考慮和實現3 f' G: K4 [. r$ }
    5.        開發效率相對較低
    % i, o8 H0 y* D1 X  a6.        維護成本高+ V2 u3 O7 Y! r7 A
    使用框架的優點:
    - O7 \, U6 l: D5 e5 w1.        開發效率高 - 有現成的元件和工具
    / @& t" |4 C* F% f3 H. m, E3 \2.        有完善的安全機制
    0 l9 a0 \1 t; H8 y: |1 p3.        統一的編碼規範
    6 Q! G9 e1 g- F4.        易於維護! ^/ I! I7 D- T) y9 Z, o
    5.        有活躍的社區支持
    * g8 g9 h9 `2 Y, @6.        適合團隊協作
    , S$ L# y. X0 x; R7 n& ]7.        自帶很多常用功能(ORM、緩存等)
    # a5 S5 H! e# A使用框架的缺點:6 ?! \1 x. F4 ]; Z* T( q7 c
    1.        性能有一定損耗
    " M& u& U% l, K0 b5 U. }2.        學習成本較高+ F+ x: s  K) ^+ W1 {
    3.        可能包含很多用不到的功能0 g; @, O) j, {8 ?- Q6 d
    4.        不夠靈活,需要遵循框架的規範. F- ^+ c7 Y/ Y( p: J: l) `# y
    5.        對小項目可能顯得過重
    ! k) I+ A& [& k建議:# y- ~: t; Y1 e- r* A
    1.        小型項目或學習階段可以使用純 PHP
    $ L+ V; v! Z0 }2 Q0 H( n. d" g2.        中大型專案建議使用框架# H) f& f6 M4 R8 w$ X" G2 _
    3.        選擇框架要根據專案需求和團隊情況% N" V8 e! i/ f+ i/ |
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    , `, O) M( u* k5 ?7 a您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 C: L! w- l% n9 d- K* q& r

    3 G$ F7 `2 F4 a" c- l
      t* Q- E- W4 G: `. m7 p1 z4 v/ x1 ^
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。7 H8 T+ j5 `5 }2 R6 R& ~7 \; i* x
    * z- Q% K0 b; i. a1 q9 L" G
    這個轉換主要做了以下改動:
    - Z3 S3 f; q2 ]8 O6 Q0 U5 a- L
    ! d; k& V/ |2 D7 r: s路由結構:3 g( x. S( [( g2 U! |# q' V

    , z) `: ~$ ^0 A* d/ {使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    0 V( u9 D( b: z& X6 W支援原有的 page/mode 參數結構
    + }# I% I: V: U' Y2 D通過路由規則自動匹配到對應的控制器方法8 Y8 P! d, e) J. u7 O

    % ~% @. R3 @4 M5 d6 j# a9 R' m
    - a5 T$ c6 ^2 m5 F/ }+ e: g9 y控制器結構:
    ; p6 }* _3 H9 ?3 t& J
      ~2 }/ \& K- h" H. ?, l創建了主要的 LoginController 處理所有請求
    6 ?8 N! s6 X- ~/ E, j, X保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    & _4 ^2 u. Q0 \& Q+ t$ Q. l錯誤處理改用CI4的視圖系統: X5 j; L$ m5 t4 W
    $ f7 A0 d% Q1 S3 v1 O
    2 z5 `! K! |# L% U. g4 G$ B& {
    類的組織:5 A$ H' [+ y- @7 f# p

    " P- e$ c3 v) I' v$ }$ G所有登錄相關的類都放在 App\Controllers\Login 命名空間下$ F  m3 d$ C2 C- Y$ c
    保持了原有的類繼承結構$ O- ~' ?& L4 y) e3 S6 h  z
    改用CI4的控制器基類和特性# r/ W+ t+ ^& T) b% p+ M# j

      o% S) `6 p9 B9 w0 F4 M' g/ Y3 C
    . q& a  ^$ D0 M3 A$ X. b+ ~) g0 s改進的安全性:2 I; T7 d+ M! h  A" ?1 `

    / o" z, ~) h4 ]  z5 f使用CI4內置的安全特性" X0 i* Z6 s/ Z: M
    更嚴格的輸入過濾
    3 q/ i5 [5 F: c; Z5 I/ Z更好的錯誤處理機制! W# {0 N0 y% M) d3 x+ K/ X

    6 G; L# Q, E5 `  |. m$ s0 T! C; J1 Y7 S  S

    8 l& v4 O' ]  E0 ]1 W9 i+ B4 @. p! K要使用這個新結構,你需要:
    : j9 m% W( c1 \+ b2 l4 w1 v9 P$ O1 Y5 G4 P
    將這些檔放在對應的CI4目錄結構中
    , j8 V) L6 k6 h! \確保創建相應的視圖文件
    2 l8 O6 ~7 S" R配置語言服務( c! P" c0 R) N, u! N
    根據需要調整模組檢查邏輯
    . X! e1 I$ v0 L/ n1 R- v5 F, ^" K2 t
    ' b- G8 ~1 C- t; ~5 @) U需要注意的是,你可能還需要:% Q  Y2 R$ }  Q& o7 W
    + `! e7 |3 x) R. e
    創建相應的視圖檔(在 app/Views/ 目錄下)' s  O$ B$ C3 Q$ @: z- E1 A
    配置適當的中介軟體來處理會話
    3 e5 ?/ i% R1 m% L3 i0 h0 V* V實現具體的登錄邏輯& h- O+ t( T2 n
    . x/ E' j. G) j5 l7 _
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?- B) ?! }. J9 F. H% w$ m

    $ z! r, M% `" \" z
    1. <?php- q& `7 [" R8 G; v. e0 @' j! \
    2. // app/Config/Routes.php  s( t3 q* f( v
    3. namespace Config;* X" R; B, i1 @
    4. 8 l2 x2 R& z  C% U8 D9 n
    5. $routes = Services::routes();
      - ]+ h1 `7 ?" B+ l& c
    6. ) V: }3 Z5 D9 t  M, ^" @  e
    7. // 添加自訂路由規則
      ; j) g2 e5 ]- C/ r" t3 s5 L
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      0 G* }% D6 _& k% B7 ?/ A
    9.     $routes->get('/', 'LoginController::index');
      2 @2 t5 @; ]( I( {9 y3 k' z
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      / S' j3 A; E) J8 {7 ], e- l
    11.     // 默認路由處理
      ! h2 Q/ M! T# ]$ r$ g1 p2 r( }
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');* l7 p. x" J5 a8 Y) i" A: i
    13. });
      * w, m3 z2 q8 d0 N

    14. & F% V7 x6 y4 I9 z" M0 r. E
    15. // app/Controllers/Login/LoginController.php
      & T! U! t+ m( s* v: E: H
    16. namespace App\Controllers\Login;4 d" n; h/ |! o( k. E3 [: j! V

    17. 2 B3 |5 j+ e/ Y, x* O8 I& m# ~
    18. use CodeIgniter\Controller;
      4 v1 b6 R) \8 j2 |! W* t' q, m
    19. use App\Controllers\Login\AbstractLoginPage;
      ; b8 w$ C0 @# I% y0 ^

    20. + S) p9 D+ w# f( _9 @
    21. class LoginController extends Controller
      % |1 C8 m2 K: F8 o' Q4 |, n( P9 g& s7 ?
    22. {
      : |( ~9 x2 y$ E! R1 L
    23.     protected $pageObj;
      4 {2 ]/ n. t2 @$ u- Q
    24.     protected $LNG; // 語言物件
      ( p6 W9 A% Y/ z. v% [+ x0 Z7 w0 t5 n

    25. / B  z# ?; ^. J  b/ v
    26.     public function __construct()
      3 f- v4 O6 U! G0 L0 [; X: A
    27.     {
      * D7 x7 M& B; G
    28.         // 載入語言檔和其他必要的依賴
      ( t( {) o7 r  F) I6 o0 r
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務# ]( Q# G* s9 P2 H' x
    30.     }
      . [* K$ Y- L/ L/ b, b- [

    31. " p4 m* k, |6 e: v4 H* l
    32.     public function index()0 l( p+ c2 ^  o' Y7 O
    33.     {/ J9 |1 a. B% }$ K5 F
    34.         return $this->handle('index', 'show');
      3 ~: C9 I+ f+ e9 D
    35.     }" e3 J8 e# ^1 d
    36. " }% f# v/ K2 E5 f5 E( \# i' X
    37.     public function handle($page = 'index', $mode = 'show')/ Y- F0 @" U* W* q0 U
    38.     {" M7 I  q, o. t1 `/ T: w" K6 \( R3 e
    39.         // 安全過濾頁面名稱: _3 a0 i) _% W6 x  A* t0 g
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      + m; W- d( y* G  E/ C; }
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
        o6 M7 \: M0 r
    42.         - N% y% F( H* j# \. ]% ~) R
    43.         // 檢查類檔是否存在
      . z" C6 b5 y$ p& J  V9 b/ \; S/ f
    44.         if (!class_exists($pageClass)) {# B6 u' D5 Q, d
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      " n  C) G) Z$ p% x! E5 V# O. b
    46.         }
      ! B8 q/ _& O+ g" @0 `* v
    47. 7 A' p" ?5 \, z8 f, A# w. [: F
    48.         // 產生實體頁面類' @, u* N0 N! @' T
    49.         $this->pageObj = new $pageClass();
      : g$ X# {2 X+ x% ?
    50.         
      3 x% Q, H* a& m/ Q& D1 D
    51.         // 檢查模組要求
      # j$ Y: y  N$ Z  r7 q( o2 p
    52.         $pageProps = get_class_vars($pageClass);/ _7 Z6 G8 g/ }# P" D7 V2 w/ r8 ]
    53.         if (isset($pageProps['requireModule']) && , g7 m) l' I; V
    54.             $pageProps['requireModule'] !== 0 && 1 |. z- s. R" Y, v3 I# W, ?1 n1 B! i: Q
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {, g9 s8 l9 r" H* O
    56.             return $this->showError($this->LNG['sys_module_inactive']);* h5 h/ t, n. }, P4 J. t
    57.         }
      3 {' N* w' S1 h$ J& p. T
    58. & l- e4 N1 |: C+ {$ _. k
    59.         // 檢查方法是否可調用6 O3 y% S" Z# t2 @, `; J
    60.         if (!is_callable([$this->pageObj, $mode])) {
      , q' y9 N3 L% O# q) q
    61.             if (!isset($pageProps['defaultController']) || 6 s6 q) m, x! k( B) k
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {: r( ~1 D4 f! ^! ~
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);+ z2 A8 S1 l' _7 i6 k7 K0 G  D
    64.             }) b% y, P( ^+ |$ m$ V6 v
    65.             $mode = $pageProps['defaultController'];
      + Y; z, W" d, t+ s; O
    66.         }
      - M. e8 n% I% p1 m& Q. T: z5 Y

    67. 8 L' \& P6 S3 |& `4 o6 V
    68.         // 調用相應的方法
      4 c- O% K: ?+ I
    69.         return $this->pageObj->$mode();
      - q# i- y# i- q" A8 O: h4 K
    70.     }5 G: X5 D, l2 H* M8 ^2 B
    71. " r. C1 J( \5 G: _. n0 c
    72.     protected function showError($message)
      ; c* D# ]- q7 t, L8 g- T
    73.     {2 v% E2 _) t' r
    74.         return view('errors/custom_error', ['message' => $message]);  P; t# P8 u% k, G8 z. P# x! x
    75.     }
      ' J9 R  l6 y* V& \

    76. 1 X$ P! P8 I  Y( r* V; M
    77.     protected function isModuleAvailable($moduleId)
      6 H. k$ w6 K& Q# c
    78.     {. L& m2 j. z; ~) f- j% D* v! i/ V5 u
    79.         // 實現模組可用性檢查邏輯
      2 x! B; v7 g+ W3 K/ k0 Q/ c+ I5 h5 w% ]7 M
    80.         return true; // 根據實際需求修改
      5 t; B1 S3 H- k$ B
    81.     }
      % X1 P+ Y3 z- E7 w( R. }
    82. }9 b3 g! h: _6 `& f  v7 O% A

    83. / o4 `0 p5 p1 j3 y; e' d
    84. // app/Controllers/Login/AbstractLoginPage.php
      ' Y. o/ W# p9 M* i3 V3 C
    85. namespace App\Controllers\Login;
      # z& o6 p: s( }% H

    86. 7 J, N% J7 [% J( n# N' G6 l
    87. use CodeIgniter\Controller;
      . s% ?" Y: d9 p, W1 o+ S$ A. a7 z

    88. / b. D- t! }1 q
    89. abstract class AbstractLoginPage extends Controller
        j2 R1 R- ?$ R
    90. {
      / H* ?6 B+ h6 j, a2 d7 R+ Q5 |
    91.     // 實現基礎登錄頁面功能
      ( \6 B5 i4 r5 B' X) M1 I
    92. }
      # e* U& g  b3 {  D6 x: |

    93. 3 g5 \( B6 n: p- z9 A7 C  y8 X! p
    94. // app/Controllers/Login/ShowErrorPage.php6 ?0 _+ S: v$ X  X5 d
    95. namespace App\Controllers\Login;
      0 T1 z& X' s. {8 Q$ i7 K

    96. " K5 C& \6 ]( P' x3 k" R8 T& e
    97. class ShowErrorPage extends AbstractLoginPage4 [4 D' N& F2 q6 ^; N7 T1 Q7 S
    98. {
      ; ?0 g( X& j3 P8 y
    99.     public static function printError($message)+ x# u' t3 E; ?8 P
    100.     {. L! N( M) G& K
    101.         $controller = new LoginController();
      / g4 Z( R4 a+ k- N  H- J: V
    102.         return $controller->showError($message);0 m) j+ y" V2 N" O5 E9 M+ L
    103.     }' d) D% O- e% W4 S7 u. P. X0 q7 A
    104. }
      1 e4 D1 i/ I$ K, L

    105. # O- o$ w9 I# _, u" Q2 J
    106. // app/Controllers/Login/ShowIndexPage.php
      + u! Z- [8 O4 i  `0 E, s0 f
    107. namespace App\Controllers\Login;
      6 j+ k2 @5 p1 i! C$ R
    108. 9 q. g0 D% z: [9 z- T
    109. class ShowIndexPage extends AbstractLoginPage
      ' W+ P  t; R& ~. R
    110. {7 Y/ p  F' h) {& k3 o/ O2 e. p5 n
    111.     public function show()1 Y" v- H  U6 U( O3 o
    112.     {
      ! n. F3 r) q' Q' ^& `
    113.         // 實現登錄頁面顯示邏輯8 {1 E1 M3 ^9 D( T* N
    114.         return view('login/index');
      % X: ~! l' H5 K, V# G- t0 I) B
    115.     }0 L1 P0 z, J* G9 }9 M& k4 G) v
    116. }: a: E5 z: C- Y1 f$ F, ~. S
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-1-22 16:56 , Processed in 0.013156 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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