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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13743 / 13743

生命值:5%

升級   100%

  • TA的每日心情
    擦汗
    昨天 00:24
  • 簽到天數: 5556 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致" T$ j( L0 w! S: j
    AI 就是站長的最佳幫手。
    + m* C" v; m# v' z* w( ~& D: o5 L9 ^) ?

    , b' C2 p. Z3 ~" g這裡的「新架構」是指後端的架構會有大變化5 t6 b. I6 R/ X/ Z+ D
    但前端的 UI 介面玩家不會感受出來有何不同3 w# D0 @" Q/ o7 Q! H0 w3 r- A

    - D- E" S1 H6 Z& z( A. `# D
    0 R7 J6 h! Q9 |# b為什麼站長要改成新的獨家架構?
    7 h9 w: a5 h* ]) L, @6 l! F" A就一樣由AI模型來解釋清楚吧。. g0 h1 P3 I. j; M; ?4 A! R
    . V! R% J  c' z7 A2 i; Y

    " S& |0 y" S: b/ n讓我分析一下使用純 PHP 和使用框架的優缺點:
    , k0 c4 i* A3 e& d) a( Z+ R0 x2 V$ [純 PHP 的優點:
    0 E7 J2 T! w0 B! {% C1.        性能較好 - 沒有框架的額外開銷) [& A3 A" l/ ]5 i+ N$ s/ {9 k
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識+ g7 R8 \4 u) X3 q/ s
    3.        更靈活 - 可以完全按照自己的需求來設計架構% g  o, e! ]+ k" ~
    4.        代碼量小 - 不包含不需要的功能模組
    4 E( @' ^+ c" G: ]5.        適合小型項目. U6 j8 B( f0 g, x% H
    純 PHP 的缺點:
      I7 T- e8 Q. Y) [, q1.        需要自己處理很多底層細節
    ! I$ z/ ^7 ~! f. E9 s2.        代碼複用性差
    ( I8 ~: {5 @! h; N" @3.        缺乏統一的開發規範, ^' G3 i! D- M% Z
    4.        安全性需要自行考慮和實現5 J0 _8 r4 L' b$ A& z$ T$ C( i' }1 d
    5.        開發效率相對較低1 S' N" `7 E  n2 B. P, k& n
    6.        維護成本高% t, u+ Q  j+ T. z3 F" r
    使用框架的優點:
    ; M0 @1 c' d% m# x% n1.        開發效率高 - 有現成的元件和工具. e& X2 i$ B& ~  n  w3 h
    2.        有完善的安全機制1 f# E: W( N& S( Y; P( W/ y6 t
    3.        統一的編碼規範
    1 w$ O/ |' `. Y4.        易於維護0 {) B$ F4 x. m6 e
    5.        有活躍的社區支持1 T' z, |- {9 e
    6.        適合團隊協作! R, h" a; j5 |4 ^) v1 e6 V3 ^
    7.        自帶很多常用功能(ORM、緩存等)
    9 J' m: x3 W9 A' a使用框架的缺點:
    / a; D) N! b% I1.        性能有一定損耗
    3 l2 x2 N& N7 i2.        學習成本較高9 N' y7 ~9 _8 R6 U2 d
    3.        可能包含很多用不到的功能
    + i. q4 ~/ E+ i( ]0 c  E# f4.        不夠靈活,需要遵循框架的規範* b+ g2 [( o( ]
    5.        對小項目可能顯得過重
    0 J- p+ {6 q6 p7 y: G建議:8 @5 m- y/ e0 `# R8 u7 ]; {- ~
    1.        小型項目或學習階段可以使用純 PHP: W. ~! V! T" D) V
    2.        中大型專案建議使用框架
    . O) g+ O# j: K) N5 J9 x+ y3.        選擇框架要根據專案需求和團隊情況
    + T  ~9 t9 S3 U1 G6 U' Z4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇1 K- Q  {8 g7 r2 Z: M
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 s" b8 y6 s$ w  O% g

    8 }8 s/ X- z9 ]$ L) B5 o. _' i* W
    6 z' p5 x6 \# @% y$ [
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。) v) ~; U. N' m9 P5 f+ P9 A

    , H' B, p- w1 t7 e5 z) v- R0 h這個轉換主要做了以下改動:2 [0 V3 ^9 ?# \

    4 b/ i8 k& z, o7 e9 `/ T7 N+ x9 w8 B路由結構:
    5 l" @5 i) O7 R0 f* N& }, `. }( k& Y; m& O5 A" a9 K
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ! o1 w) B9 h1 L支援原有的 page/mode 參數結構9 @9 @3 Z) Z  @# V
    通過路由規則自動匹配到對應的控制器方法: C4 l! L# \( h' E6 E  A3 v2 l
    : }: Y( x/ U4 R# F2 a

    $ v8 E: }4 z! b' S控制器結構:: K# q2 L: H* y5 b7 S
    7 L0 }: I9 P* b3 O2 ^
    創建了主要的 LoginController 處理所有請求: K& u! d. R* Z% }  A. B* F  x
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範# J# K* d& }- u; N- p  C) H
    錯誤處理改用CI4的視圖系統0 G$ E' a/ L$ V' `: J
    & @0 l: R, o9 d/ r
    1 i: G7 O) [2 b7 m  ^" S, C  \
    類的組織:
    * W7 R( V. j4 c! G; C! M3 A) j9 ]( |9 K- N+ L! o. p& }: \* X
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下; b% R4 `" E. y6 i7 O
    保持了原有的類繼承結構& `& C4 |" }' H3 Y$ x7 g
    改用CI4的控制器基類和特性* Q2 u7 i: A1 E$ `; Q3 z2 U9 r' \

    4 R" p( ?& Y: M) Y& \# M$ X/ B4 ^
    5 R& D% I: c8 j0 h3 Y0 G改進的安全性:6 E8 X$ S" Z4 c8 i  T- g) Z; S, _  k
    ; k0 f- n" i% ?
    使用CI4內置的安全特性
    ( r/ [  b- @* X- V& U更嚴格的輸入過濾1 P7 \; k6 C: s  I2 `8 @
    更好的錯誤處理機制5 m2 R' ]: |& `% v; l

    - X2 O* a+ ?3 D& [- L( d, }( H) Q/ f$ @) D) U7 q7 z4 I' h
    2 a' ^$ G" N$ u4 [
    要使用這個新結構,你需要:* K  y% T# o8 J# }8 u" }

    * T4 A+ n4 {& A1 A' `( _將這些檔放在對應的CI4目錄結構中
    9 R6 W! C4 m  R1 P確保創建相應的視圖文件
    ; g( ?9 p2 }, o; c2 y2 K配置語言服務
    3 h; e' _7 y* o' Q根據需要調整模組檢查邏輯4 u& y& |: E' k% K

    $ \% O, ?; ?4 x! B& j需要注意的是,你可能還需要:0 o+ w# L( u; N7 ]

    + k. R/ q" T/ J4 _創建相應的視圖檔(在 app/Views/ 目錄下)
    + I/ ^2 f# k1 s0 x9 l( Z- O9 r配置適當的中介軟體來處理會話
    3 c- R7 R* c1 A, o% n實現具體的登錄邏輯
    0 J1 G/ P0 [) w( p. c/ l# u
    * L% D" B. p" f, n0 g1 Z需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?  X( v$ q  P. u( ]( x- i  p
    6 M0 v. q, B9 g8 O* V
    1. <?php6 Z  y0 i( P# n2 U7 f. u! U
    2. // app/Config/Routes.php
      , q  P. E: _6 @9 k$ |
    3. namespace Config;
      ) H$ S6 k% y) D$ y' ^8 ]

    4. 6 E& }0 o5 z. r
    5. $routes = Services::routes();
      ; K) v4 Y7 j$ n! L" J- r
    6. + w+ L3 y) K& K4 j* E9 Q9 s
    7. // 添加自訂路由規則0 [3 w7 z1 w8 |8 @$ ]; t8 }+ T2 |
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      8 N8 c0 o7 K4 ]7 }
    9.     $routes->get('/', 'LoginController::index');
      % u6 W  f* |0 O, v- Y. b1 ?
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ! @5 k6 X- ~2 Z6 Q
    11.     // 默認路由處理8 V+ v. g3 T: n8 `$ q
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      8 ^: x# s) Y8 V
    13. });( h4 V. f- x: U" p

    14. $ N  t% i) I5 L+ c
    15. // app/Controllers/Login/LoginController.php2 E8 |% X! ^; U+ z7 }" x
    16. namespace App\Controllers\Login;
      - e4 B0 w0 t, o% w7 M
    17. " Z. M3 G" f4 e# O
    18. use CodeIgniter\Controller;
      6 ~0 h/ p8 N9 Z. @( L# ?' \5 Y0 j
    19. use App\Controllers\Login\AbstractLoginPage;* h+ p4 d' Q/ O' k7 ^/ @
    20. # N; |' C2 B0 v9 W6 [
    21. class LoginController extends Controller
      # }+ l3 a6 B8 S$ [4 B
    22. {, v# T5 g, {; s  f7 F0 W! a
    23.     protected $pageObj;$ l% V# }  l6 ?' }2 R
    24.     protected $LNG; // 語言物件
      " b3 m7 \) P& C" e4 u+ n

    25. 4 {1 e: ]# a3 l9 `1 x( h6 f5 {
    26.     public function __construct()   z5 v% _2 o% p4 B
    27.     {9 D2 b! z5 p9 |
    28.         // 載入語言檔和其他必要的依賴/ u+ q$ T1 l7 C1 z2 p
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      7 ?( I. s* [( |$ D4 q% n
    30.     }
      + i+ o" k' G/ q: a) g& h( h; M
    31. 4 {+ `) R/ r. B' U) ~; `% A. G
    32.     public function index()
      . ]) L% |2 U! Q0 @, x! A# w
    33.     {
      % V- D2 K/ t. T) b1 R
    34.         return $this->handle('index', 'show');2 J/ h6 \+ ]6 C/ H- d
    35.     }
      ! C8 H! x& J( ]; ], ]! S4 {
    36. 5 T0 S2 D# V  ]9 a# h& w$ l
    37.     public function handle($page = 'index', $mode = 'show')( D0 F3 m" D" ?8 k  k! A5 @
    38.     {
      ) u% f0 R0 E: _+ _) N: L
    39.         // 安全過濾頁面名稱5 l8 n/ [  K1 G/ W. ~( c
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);/ s( t3 Y. V4 o* P
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
        y5 [. \. H8 ~
    42.         
      , v3 _0 p) j( I
    43.         // 檢查類檔是否存在7 L' w5 @: d$ U5 g4 h
    44.         if (!class_exists($pageClass)) {
      : Y' k( `$ }0 X* ^5 ?0 p# V
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      0 a2 X4 U# x7 `5 N' t9 h4 B
    46.         }
      # a' n1 g7 n7 c  G0 R

    47. 2 ]& u0 ]3 G1 H8 F4 B8 {9 f
    48.         // 產生實體頁面類
      % u; j/ O+ N4 ~6 |; \
    49.         $this->pageObj = new $pageClass();7 @0 w1 ]- K- P$ R# ]( C: E' ~
    50.         
      1 }! R* U( ?- Y% \! w; E8 C
    51.         // 檢查模組要求; l0 f& K# e, D
    52.         $pageProps = get_class_vars($pageClass);
      - ~" p# ~0 L2 t0 ?! J
    53.         if (isset($pageProps['requireModule']) && # }# t+ K/ K. H  `3 p6 x( ]
    54.             $pageProps['requireModule'] !== 0 &&
      8 i9 E$ h' J7 @' j
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      $ M; W% S( _8 C7 }
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      $ X' D3 V4 z; b) L: S0 `9 A' `
    57.         }" ~; s: m! v9 f+ g7 C

    58. - _( j  K6 k# k! u
    59.         // 檢查方法是否可調用9 T7 B+ ?. z1 b
    60.         if (!is_callable([$this->pageObj, $mode])) {
      ' t! g1 n/ G# H" l& N% ?
    61.             if (!isset($pageProps['defaultController']) ||
      - y7 O  B$ k8 \
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {9 L% K8 R/ Q0 s% ^' C
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      " C8 r0 h$ k& T) V
    64.             }' U. t! w( y+ z( [
    65.             $mode = $pageProps['defaultController'];! E8 T2 q4 T$ b3 w1 B! C- e
    66.         }
      - F0 l7 o9 f- s7 }" t6 R

    67. 5 a8 F0 r2 G" W9 ?
    68.         // 調用相應的方法% G1 N* C' d! S% W' T
    69.         return $this->pageObj->$mode();* J. M- r+ U8 a9 w0 q
    70.     }
      , U& X, z' `, e% t7 m0 S
    71. ' u5 M% c& U& L/ _
    72.     protected function showError($message): S4 N" x. s) s
    73.     {
      , l5 _6 `0 c9 o: J- n2 T5 k
    74.         return view('errors/custom_error', ['message' => $message]);9 r% f* Z' F' D: ?  A8 x
    75.     }
      : s& x# A- K: T7 K
    76. ' ~6 N9 N" o; `; X" w
    77.     protected function isModuleAvailable($moduleId)0 W! _( q' a5 \  S; \, C( \* o
    78.     {
      / o3 ~4 M  G/ U
    79.         // 實現模組可用性檢查邏輯
      4 w0 C" Q2 l( d1 B  y+ G3 z+ Q: A
    80.         return true; // 根據實際需求修改
      ) b/ y" d+ J' G0 m) n5 g7 r$ L
    81.     }
      ' a2 x) j( [3 ?* z8 {
    82. }1 d% u6 d1 ]) U: j! k
    83. - D, y9 |' }3 s
    84. // app/Controllers/Login/AbstractLoginPage.php
      ) ^& h6 r9 K' ]' v+ k/ p
    85. namespace App\Controllers\Login;- R+ _! R& D" v

    86. 4 E( `: T* V: m% Z. c
    87. use CodeIgniter\Controller;/ q3 v9 Q9 l; i! U
    88. & f$ d) @. L' V
    89. abstract class AbstractLoginPage extends Controller
      ! ?* t3 d% d3 B2 }" Y2 {
    90. {5 Q& E  T  b. s0 r
    91.     // 實現基礎登錄頁面功能
        R" r# ~4 ?6 k- O
    92. }' c; U! I) ?8 h4 S; L; n" ?  V
    93. ! X* f" P5 j3 V9 i: ~! @7 t
    94. // app/Controllers/Login/ShowErrorPage.php% _$ t2 N$ B7 j6 x
    95. namespace App\Controllers\Login;1 G4 W8 B6 r. N5 _
    96. % g2 O) y3 K; i1 B+ ~8 Z
    97. class ShowErrorPage extends AbstractLoginPage8 M# x5 ]) L' T/ p
    98. {
      2 \- A# x: U1 e: {% E+ [; c
    99.     public static function printError($message)
      . ~6 q, n' d% y! i- d' T7 ]! R
    100.     {* {# K1 A# H9 z/ x# Y8 J
    101.         $controller = new LoginController();" Y* V6 W' J4 d1 w1 N
    102.         return $controller->showError($message);* d, P0 k" G0 j3 m* Z
    103.     }
      / }. U1 e( {( p2 A$ A( U
    104. }9 v/ m; v9 U, F& `* y

    105. 6 H. u7 l( c% \1 e5 }  i
    106. // app/Controllers/Login/ShowIndexPage.php
      : j1 @2 @4 B: K% I# P
    107. namespace App\Controllers\Login;
      - [7 r! ~* f6 o% S, c5 s8 M

    108. : U6 O5 z- A1 S8 L# Z+ A
    109. class ShowIndexPage extends AbstractLoginPage/ `: ?' P# P6 m+ o
    110. {
      : e+ T7 A' q3 I3 Y# J3 l! \! T" Q# m
    111.     public function show()
      % S. t. h8 y+ P. ^* a8 d
    112.     {
      * s! K% ]3 k5 v! `' s" T( B- g& @
    113.         // 實現登錄頁面顯示邏輯
      5 U9 X, a2 b% R# E8 ^7 U
    114.         return view('login/index');- m9 S- q6 y+ h
    115.     }" b# f" P( S# c
    116. }
      ' D3 Q9 o7 F' K, j5 `; ]0 Z
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-4-2 02:34 , Processed in 0.013881 second(s), 11 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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