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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14747 / 14747

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致+ h' x- f/ t6 f7 R
    AI 就是站長的最佳幫手。
    * n% @4 W! a4 G( j( z/ ?
    ; Y8 B! m5 J9 I/ l: y/ p$ D/ s
    4 G1 n& j' T& m0 n5 G/ A8 R" h這裡的「新架構」是指後端的架構會有大變化
    : W. [' C3 E& ]' i6 y1 h7 N6 @但前端的 UI 介面玩家不會感受出來有何不同+ `6 c; ~( S" u3 }( O; |) b. \
    3 a. F+ \( U5 r6 S4 X, k  \
    : I7 V4 c& `( n6 S  M/ B: i  X1 [6 D- M
    為什麼站長要改成新的獨家架構?5 x# D( m- T  @! s; c
    就一樣由AI模型來解釋清楚吧。3 i  C+ F, W6 z. f
    * u" E2 J' c$ n  I: V" K/ v" m, L
    : {1 M. h0 [/ S: j; u. R' q& |
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    0 b7 P( V+ I- N2 s# B1 @0 `9 Q$ o純 PHP 的優點:
    ( b/ j. w: w% H5 F1.        性能較好 - 沒有框架的額外開銷: K6 t! B9 [; n9 [) m: H% t$ _* a
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    ; u$ f% u) C! S% I2 n3.        更靈活 - 可以完全按照自己的需求來設計架構
    5 p' E  Y* e! C! f4.        代碼量小 - 不包含不需要的功能模組! L( m, I. r; c# r2 S! f2 i
    5.        適合小型項目
    + f  P. w# }1 i. l. |% h純 PHP 的缺點:
      s: [* h6 }4 \+ O% B1 E1.        需要自己處理很多底層細節
    6 I4 j6 n/ q" f2.        代碼複用性差1 X; Y8 `8 ?, r
    3.        缺乏統一的開發規範
    7 U4 u: z2 S( J9 r8 P8 Z4.        安全性需要自行考慮和實現
    " s: x1 Q. V; q5.        開發效率相對較低
    9 c) V: ?9 H# [% }6.        維護成本高
    ' x: ]( n  ]( A. F- y5 A9 ~使用框架的優點:
    9 ~( `5 a, Z1 d" \" v1.        開發效率高 - 有現成的元件和工具
    # l: e" O+ Y4 d; {3 K7 f: M2.        有完善的安全機制7 c1 K% [9 p* T$ w0 J( k( n
    3.        統一的編碼規範
    % V$ X; L: P% b9 L. _5 I4.        易於維護
      S9 \5 p4 |5 ?% j* \+ }5.        有活躍的社區支持0 e* y# h" ]+ I7 g, _3 N
    6.        適合團隊協作& L$ ~6 ?: E! ^( `- X, P; U2 v7 _; R
    7.        自帶很多常用功能(ORM、緩存等)
    ' \" @* A* Z& Z% c使用框架的缺點:
    ; m# \6 D, m; x+ n" \/ m1.        性能有一定損耗6 g, A* e7 c: U5 x2 x( Z' v, F* v
    2.        學習成本較高
    8 w" g* V& y  X0 ]- o6 R# C3.        可能包含很多用不到的功能2 J8 P  K9 S2 D1 e0 c; T
    4.        不夠靈活,需要遵循框架的規範  i* ^* Z  r6 A) ~/ z  A8 C9 E; ?' T9 `
    5.        對小項目可能顯得過重  \/ Q* ^+ u8 s8 r# e
    建議:
    9 b  N( R5 m6 J% Y1.        小型項目或學習階段可以使用純 PHP& J( O' l* a/ V3 u7 v# h1 e9 z
    2.        中大型專案建議使用框架" o7 u& X9 z7 w5 y5 M1 @
    3.        選擇框架要根據專案需求和團隊情況7 z$ @+ a8 d) y; e( m- Y7 @7 {
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    2 Z8 W$ x0 S9 T" k7 y) e' U0 k您打算開發什麼類型的專案?這樣我可以給出更具體的建議。) C7 ?0 n6 m# `3 h+ g0 ~
    ; q- {1 }) ]" N, n: _$ W9 Y# N% f

    . E  C& ]' e  Y
    ) A' w# D4 Y# O  e; f- E我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。7 p/ `" ~! Y: O" k6 b8 T$ j  G

    + n1 y$ m/ Y5 m8 r: N這個轉換主要做了以下改動:
    + }& Q! ^: e* n0 d( s8 f8 r% n
    ' d( m6 x9 ~2 G  j$ c! F; z2 ~+ \路由結構:
    ' G6 A/ H+ C+ t1 Q
    " ~) V3 ~1 q/ b8 \使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下( a+ \; D6 w/ t
    支援原有的 page/mode 參數結構
    ! R' T: F0 o) r2 D, \+ O通過路由規則自動匹配到對應的控制器方法
    9 b, d9 b8 R5 H4 g% ~0 a. V3 V9 u; ^2 c  Z* o! Z9 ~
    % Q) {+ F/ ~: `0 Y8 D
    控制器結構:
    / g0 ~' H& Z; `' V7 N$ K* z/ Y& r
    : U5 f+ M0 |% U0 R創建了主要的 LoginController 處理所有請求
    & p2 M" Z% ?3 }6 [4 N; n保留了原有的頁面類結構,但改為符合CI4的命名空間規範; [) |, x' q6 A0 S8 u% r
    錯誤處理改用CI4的視圖系統8 O; x& \! `% W/ r$ {$ i2 k% c

    ' [$ h$ V' f7 i( c* U- O
    9 t  V- u$ w4 X5 R  F類的組織:! ?9 j$ F2 Q5 C$ k3 W) B
    8 O2 o  c- e3 `' J; N
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    % z/ ^1 r5 L* F$ o% T8 t" U保持了原有的類繼承結構2 u3 C$ |) V! B
    改用CI4的控制器基類和特性
    ; Y) |# \- k- R* ~7 N, k. r( a! b0 W' r  f: E

    $ p$ T4 Q* ?9 q+ G& z0 t+ G改進的安全性:
    8 l. Y6 z. F! d- J/ A& O4 z$ v$ t" z# }) E( Z9 u5 f
    使用CI4內置的安全特性
    . S1 a" H  Z9 [; X4 C8 Q1 y更嚴格的輸入過濾, l. _3 i' P$ r, D; \
    更好的錯誤處理機制
    ' T4 K" I4 L2 z8 `2 E  E6 S9 W& T+ n% i6 ]

    . z% e; E# H6 q
    1 Y  |( E+ u: C) S4 A% @# ]$ y要使用這個新結構,你需要:8 O- L# O4 l4 J% o

    & l0 V- l- {1 c* [; K  m$ G將這些檔放在對應的CI4目錄結構中
    " F1 `" ?4 Y! }" D0 e' k, Z% t確保創建相應的視圖文件* }" s  s: c5 y8 s& `' u  S+ ~& |: f
    配置語言服務+ h- p$ F0 Q! Q
    根據需要調整模組檢查邏輯
    / T& \& ]  o6 Y4 [! b, t  C
    6 Q' k. S8 Q  y5 a) d, m/ l6 }需要注意的是,你可能還需要:5 R# [5 S# Q$ H; G4 e5 I

    3 p- i- I  c( P% I% e) E9 \創建相應的視圖檔(在 app/Views/ 目錄下)
    % g/ P! C) `/ w+ d1 \配置適當的中介軟體來處理會話
    , L7 D) s8 D; ^實現具體的登錄邏輯2 S& Q7 Z, {" }0 d$ O

    7 z' K+ J9 u& i  B$ @需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    # u. ~7 l; w1 h6 C8 A) N" T" N& q
    " L' k( X' ?3 \+ g- S9 s
    1. <?php# L! P5 Z6 T$ G+ o
    2. // app/Config/Routes.php
      7 F; p9 B6 R. ]. M
    3. namespace Config;
      - i1 E. z; _( [/ Q& G

    4. * R# k$ i) J: _# v' j2 U4 V
    5. $routes = Services::routes();
      ! B) _7 G$ ^# j/ C

    6. 8 b  C& u4 H9 N( c
    7. // 添加自訂路由規則1 l% h6 E8 L+ x) e9 O1 }
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ' Z. P& q( F2 n7 |2 b2 O
    9.     $routes->get('/', 'LoginController::index');) U1 |- M7 X0 O  F3 g
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');- \: P- Y( W& a+ z; U
    11.     // 默認路由處理2 h+ v0 x3 w: N4 ]5 F) T
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      . c) M) P) n5 g: R
    13. });
      6 H5 u! l/ m! Z; E, f8 h

    14. 9 i) o+ z% Z% F  ]$ c) s7 ^! S  c& P
    15. // app/Controllers/Login/LoginController.php
      & B% p. m& X# R6 _9 T9 ^. i+ A
    16. namespace App\Controllers\Login;# }9 l$ C) U! g
    17. ' e( Q# N6 M" I) _# R6 ~. a- v+ a8 k1 w
    18. use CodeIgniter\Controller;
      3 m- s3 Y5 y2 L/ w1 m4 ^
    19. use App\Controllers\Login\AbstractLoginPage;
      6 e  Z% i; u- E

    20. , E: c: R. A/ I2 U3 \
    21. class LoginController extends Controller* @' T; p) u& Z# }( n
    22. {
      2 g+ n/ K5 B2 c) ?
    23.     protected $pageObj;
      ' w$ e9 f! b6 d
    24.     protected $LNG; // 語言物件
      2 P+ C( \" N0 Z; ~/ {% m
    25. 8 q* u" o  `4 {) X# Q( B
    26.     public function __construct() ; @' R( |( R4 Z) X7 K, ]: b3 v
    27.     {7 ~4 s+ m$ _0 x0 L( N  N1 I1 x! g
    28.         // 載入語言檔和其他必要的依賴+ H4 T/ u6 ^/ b: ?+ |; Q( s
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務& A& ?& M4 z$ c: E7 _5 o0 K
    30.     }. n" f" w% R# |5 J$ K9 `
    31. 8 t) f. C& t( G: h; r. L
    32.     public function index()* N5 h  a- ?6 i/ ~
    33.     {0 I. V+ E; _( T# ^' j3 v1 l$ G
    34.         return $this->handle('index', 'show');
      $ E; L3 _5 \" C- H0 L6 h
    35.     }7 z: |5 @) l; l7 d2 }+ N* c9 R

    36.   [9 s$ c% @+ p
    37.     public function handle($page = 'index', $mode = 'show')
      ) u' r) x- \: {( x: ~0 r1 u* I
    38.     {
      8 |% P0 B9 q% }6 q' E8 f( x
    39.         // 安全過濾頁面名稱
      , v" E9 r! l* [  H3 s
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);! E) I/ Z& O# K' T* F# v
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ! h2 r1 ^! A1 ^0 i
    42.         
      & f4 I( j4 `9 o
    43.         // 檢查類檔是否存在6 F4 |1 S- b# E& C5 F
    44.         if (!class_exists($pageClass)) {
      ) y' J( u) a% Y3 C1 \
    45.             return $this->showError($this->LNG['page_doesnt_exist']);. k0 @" D# _5 [: m
    46.         }
      / d: |+ S* q3 _5 R0 c

    47. : x% j$ E2 [& @2 u% H6 P( B/ y
    48.         // 產生實體頁面類: N. [+ _. P- G* O6 Z
    49.         $this->pageObj = new $pageClass();/ o% w* c8 i9 d; Y+ p3 ?" v( \  N& M
    50.         
      ( K! `. A5 I  G% t' P- A, s6 {
    51.         // 檢查模組要求
      % c) a* O3 v. O
    52.         $pageProps = get_class_vars($pageClass);
      2 o. L+ w3 \7 i. }/ }6 k
    53.         if (isset($pageProps['requireModule']) && 4 F. D( g& V9 U" Z4 p
    54.             $pageProps['requireModule'] !== 0 &&
      " {6 J8 s+ |/ P) z, Y( x
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {2 v" y; ]4 ^* O5 k
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      4 Q& d; ?/ _# s
    57.         }
        a) U2 y0 ~, G" ?  W

    58. 6 e2 ^4 j$ E* ]/ Q! I, x: `
    59.         // 檢查方法是否可調用
      7 K* t8 B* n8 Z" P) x
    60.         if (!is_callable([$this->pageObj, $mode])) {
      3 Y5 {% U$ g  U" T  g' N
    61.             if (!isset($pageProps['defaultController']) ||
      7 B( Y) T  ^4 a8 X! i2 c
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      6 z' h/ o9 L0 N/ U7 _/ {
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      $ \/ D8 Y( B  _, Q3 `
    64.             }
      # V  ?3 r4 j; s( Y2 s
    65.             $mode = $pageProps['defaultController'];: M: p  H% j2 p' i9 S5 Y. O+ z
    66.         }
      3 ?" S, G( l' W2 m3 |/ n& }! }
    67. 3 i8 b" y! i& q( J
    68.         // 調用相應的方法: w' e/ d5 V9 i8 d" L
    69.         return $this->pageObj->$mode();
      + T" l' u7 |# ?+ m3 g4 ?
    70.     }( x% |6 `& ~# r+ \
    71. 6 ?9 D6 ]. g. n, X4 o. M6 {
    72.     protected function showError($message)5 `0 ]* H/ B/ q& a
    73.     {, A; O, S$ A- Q5 u
    74.         return view('errors/custom_error', ['message' => $message]);
      0 q# e2 P' G- [% `, @
    75.     }
      0 Z: y( {/ Z& X2 U1 m: B: ]
    76. 4 w: a$ x; `. Q
    77.     protected function isModuleAvailable($moduleId)" N9 N9 O  |0 q0 P' t$ P5 ^' R
    78.     {
      ; V2 U1 Q2 |8 @6 r
    79.         // 實現模組可用性檢查邏輯
      7 q" \9 S' N4 p1 n
    80.         return true; // 根據實際需求修改" ]8 {  L) b; S' `  M
    81.     }
      6 }; @" {2 M% h
    82. }
      . v$ J7 U& p4 |4 ~$ k

    83. 5 {& W, ]7 J5 b9 {2 Y5 D5 z% D
    84. // app/Controllers/Login/AbstractLoginPage.php1 G) [5 v6 b6 }  C+ y3 d" P+ r
    85. namespace App\Controllers\Login;5 p  L4 [8 A( f

    86. 4 m1 @" }7 F- F* e+ B6 q
    87. use CodeIgniter\Controller;
      0 d, D; r1 e& u: {# c; z0 B: G
    88. * |  \, A+ G/ s5 {2 `
    89. abstract class AbstractLoginPage extends Controller& A4 P& d4 `9 K  W  _
    90. {+ [* h" K5 {0 g" f* C( o) O! o
    91.     // 實現基礎登錄頁面功能
      / s" P% a6 w/ f# l+ j
    92. }1 Q0 T  x$ F  U+ @4 c) M: y
    93. % Y* l9 O/ B3 d# s  G- k2 B
    94. // app/Controllers/Login/ShowErrorPage.php3 ]7 d  N) w, Q- Y& b4 Q
    95. namespace App\Controllers\Login;
      * @, A7 k" V, ?. ~1 Y. b
    96. ' ?2 `/ p+ L- S8 x* y1 q# o
    97. class ShowErrorPage extends AbstractLoginPage! D% {2 z- d0 Q$ R8 I
    98. {
      : c3 r5 \- h# |. y
    99.     public static function printError($message)
      3 B0 z& a1 T0 D1 H& S7 `- P$ ]
    100.     {
      $ H' p3 w+ O7 |2 i) b3 _2 ]3 Z
    101.         $controller = new LoginController();
      . O  y8 V% y4 R% W' L- l
    102.         return $controller->showError($message);" q( E2 \, m6 [/ L" |( C( t
    103.     }: b: ^3 z. }* i- V0 B7 i: p9 `7 D
    104. }) E" o1 J$ ~5 |+ C; e7 W& O
    105. / n. C8 x3 n. n  |8 B, W
    106. // app/Controllers/Login/ShowIndexPage.php3 c3 q' l5 n" T# ?/ E$ t+ O
    107. namespace App\Controllers\Login;8 G$ @2 L$ r/ _' n7 I6 t

    108. 0 k( Y, f( f# Z
    109. class ShowIndexPage extends AbstractLoginPage* ]: C, q2 y" p1 m- X* a* K
    110. {
      ; \3 c# G/ q. g! K" v
    111.     public function show()
      . K% [8 j4 f  V, z4 |$ B: Z
    112.     {
      : S, X* k: e4 I2 W
    113.         // 實現登錄頁面顯示邏輯
      + f3 Q# o' B' M! `5 k
    114.         return view('login/index');
      ( U4 `/ N* b' B- ^8 E) V9 I
    115.     }
      + Z6 E, q8 N; v' L6 Y
    116. }
      8 m6 o5 T" P, \/ [* G- F
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-4-19 07:01 , Processed in 0.010867 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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