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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14473 / 14473

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致# Q# N1 y" U7 s# }$ k+ L: Q! {& K
    AI 就是站長的最佳幫手。
    - ~7 |9 M1 x; |! a2 N2 _
    # M: q1 ]/ z. E% b! O
    9 }9 u2 y$ M6 {# m# |這裡的「新架構」是指後端的架構會有大變化
    9 |- r1 M  u) F. U! B' t) q但前端的 UI 介面玩家不會感受出來有何不同( j% ^  d5 Y, o" ?& I; F+ `

    : X' _$ y" ]1 o
    / F6 W" a( r+ `- Y. d; Z為什麼站長要改成新的獨家架構?  R4 E$ L9 M& A" ~( M
    就一樣由AI模型來解釋清楚吧。& P/ ]6 d+ i% e
    5 t! _7 n" A# Z' L( p% _' `8 t
    " N  t+ j' U7 D! S- P: O+ K
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    * V8 J8 \/ D$ Z3 ^8 x純 PHP 的優點:' v# D( }6 @+ m5 U
    1.        性能較好 - 沒有框架的額外開銷
    & {" z% W8 p5 s' C7 K& C) Y% O2.        學習曲線低 - 只需要掌握 PHP 基礎知識- A* d' H$ W9 s8 h6 b
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    ' E; Y+ X" G8 C  ^0 U# }* y. j4.        代碼量小 - 不包含不需要的功能模組0 X5 t! E# a/ N. E6 A
    5.        適合小型項目% L" k6 E1 A6 {6 k" a
    純 PHP 的缺點:
    2 {+ T3 }7 q" N% E1.        需要自己處理很多底層細節. m. V- t( g$ U! i+ V. `
    2.        代碼複用性差9 A% Z9 b2 f3 h
    3.        缺乏統一的開發規範
    9 J" Q/ O& o4 S7 b" R4.        安全性需要自行考慮和實現
    ) K% F3 _: ?0 ]! t1 B* A" }' M6 S5.        開發效率相對較低* y: P! j; r1 [) i8 ]
    6.        維護成本高; J* s; K. r" {) w3 n# e
    使用框架的優點:. L. `) r1 O6 Y; v" |0 v( o" h% \
    1.        開發效率高 - 有現成的元件和工具# T5 \! v+ E0 ]. q2 R
    2.        有完善的安全機制( S5 ~9 P7 k$ y6 |/ i& H) p
    3.        統一的編碼規範" u& Z. B: C9 Z! H2 I# |
    4.        易於維護, U. g9 w7 f" j2 N8 G+ X
    5.        有活躍的社區支持( b  T  P+ Y' H4 p) Z
    6.        適合團隊協作
    : \/ x  n" D, ]: r7.        自帶很多常用功能(ORM、緩存等)$ C. f& w' X, d  h8 U
    使用框架的缺點:0 C0 ]2 M# P; x, L5 |# X0 V0 Q
    1.        性能有一定損耗3 n( N6 h3 \0 f9 D/ k' f& U% ~
    2.        學習成本較高
    * [0 ]( `. L% D/ v- r3.        可能包含很多用不到的功能/ A  e4 [/ }* p
    4.        不夠靈活,需要遵循框架的規範
    # b$ G) ?- J% A* B' `! `5.        對小項目可能顯得過重
    $ D' n$ D2 D9 o% m; [8 {建議:( }& l5 j9 P, O- b* M( ^- S
    1.        小型項目或學習階段可以使用純 PHP
    # a4 J! N! |0 f2.        中大型專案建議使用框架3 [; z6 n* _/ u7 o, Q. e3 S
    3.        選擇框架要根據專案需求和團隊情況* l+ K  d( |- n$ p7 ^
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇- _$ `1 L% q% L. z! H( H; H9 b( m
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    . u, r: V2 {: ^. R& y0 L4 e
    ' C0 ]$ g! C4 g7 K- W( k& t
    + L1 F5 p. p  p, c, E3 t$ @3 y: ]! t: s: R
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。3 Z' c1 r& V0 D3 l
    # J, f7 Z3 a9 [& h) ?/ r
    這個轉換主要做了以下改動:
    2 D- Z1 I$ B% x/ O% X" b5 P' Y4 W! R, N0 z8 s8 B/ F
    路由結構:- j. b8 l& F6 f# r- `/ A' `
    . a& F/ |$ }2 e  L# d- C5 z& K
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下6 i" n: E0 x) v% P4 P* F& [
    支援原有的 page/mode 參數結構
    ! o9 O; o& ~5 K通過路由規則自動匹配到對應的控制器方法* G. A! @3 c* _$ u. _
    , r# B7 H0 p( o( y1 T

    * |) ^( t. T' l控制器結構:) w- t1 y$ l( z4 H5 }- |. V  N

    * W- _& `# P8 A4 e8 A, O! |8 M- P創建了主要的 LoginController 處理所有請求  d# [- l! g0 a9 P. K- z! k
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    0 n$ O! ^, X2 N錯誤處理改用CI4的視圖系統, y) f4 R5 @* U8 `# q; `

    6 e0 q6 j1 L' _0 r) `( k' c' b' D0 C7 B0 E4 F# _  ^- D" f8 U& h
    類的組織:
    7 u2 N- M! k' ]
    . h5 ~' r$ W5 V7 N; j1 ?所有登錄相關的類都放在 App\Controllers\Login 命名空間下, y2 g0 {" `& D( b
    保持了原有的類繼承結構
    9 E/ A& I8 A- Q4 F' @+ {改用CI4的控制器基類和特性
    , H$ ^. b( V9 m# X4 \0 P: v8 ]
    6 B- q, ^/ ^# w: l5 C: {. M
    0 H) s$ J' K3 T7 B改進的安全性:
    9 a2 \+ C) Y. r" V
    0 f  J$ _2 |6 s# b6 k& E) \使用CI4內置的安全特性
    * ^6 v& w% K! s7 T7 O更嚴格的輸入過濾
    " b$ W& Q  K" Y( O9 V$ T更好的錯誤處理機制
    $ o# @* H& _9 V0 E9 }# _1 s* P) O& M7 T# x! V5 r- Z( @
    , d$ f# y$ A/ W) U" s1 T) o

    ! \9 b5 f! G) Q要使用這個新結構,你需要:
    " j; M; ~) s/ P; _) P! `9 D" j! h9 d* K, P% r! S& o" j
    將這些檔放在對應的CI4目錄結構中
    * ~# P) F, _* |. H+ l確保創建相應的視圖文件: ?! f2 J: L. p' C
    配置語言服務6 e, r% X! @% n0 {! c# p8 N8 i
    根據需要調整模組檢查邏輯) P) z0 L" ]# l4 i2 T) k

    + [. h9 y! e$ ?需要注意的是,你可能還需要:! F. n, U2 u, C2 V' {- D/ q2 U& u& F

    " t! [  k5 @/ |0 l  J% M0 n創建相應的視圖檔(在 app/Views/ 目錄下)/ p3 W0 Q; y. r+ r; H
    配置適當的中介軟體來處理會話
    ' ]% E" O0 e" a$ _$ ]( b  [實現具體的登錄邏輯
    , \9 n7 ]7 {' ], |
    . o' z# `% ?9 Q! k; K需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    : E; C; |, d$ y6 H) }2 _& q1 ~2 V- E* W/ {& ]4 M6 ^# z
    1. <?php: t( S& ]# d3 i' r3 M6 n
    2. // app/Config/Routes.php
      3 }9 T" f9 H+ u9 x+ _0 ]+ U
    3. namespace Config;
      . V* Z/ |7 m8 Y: E- M& n

    4. : G3 {, l6 P1 h  B. k& X
    5. $routes = Services::routes();
      % H& j0 `% d+ p4 H

    6. 7 N0 D8 S. i; D7 b0 h" y+ r+ a
    7. // 添加自訂路由規則% k  d7 ^0 Y- b+ @* c) D# y" n) F
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      + _* D! P+ B" [0 ~9 e& a6 u: R
    9.     $routes->get('/', 'LoginController::index');! }- K1 N9 @1 I- o
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      7 e1 }7 G# ]# e7 b4 j: v
    11.     // 默認路由處理
      4 t* l# c$ j* c
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');: Y) A1 u5 S$ N) A' q
    13. });
      ' x2 ^. `8 p# A- ?5 p
    14. # o# V8 q) c, G5 d( j4 K3 r
    15. // app/Controllers/Login/LoginController.php
      ; e7 y2 O) j# t+ `3 S7 B& K* t
    16. namespace App\Controllers\Login;& D" Q2 t7 B: {5 U/ g1 H
    17. 7 L& D% X$ [/ U! S% r
    18. use CodeIgniter\Controller;
        \  u- P& ^, y
    19. use App\Controllers\Login\AbstractLoginPage;
      % A: x6 a4 b" p$ U9 A# Z

    20. ) n, m# k: y: I6 t# ]+ F
    21. class LoginController extends Controller/ h# w4 y( \7 u+ i6 m
    22. {
      0 F( a; p9 i0 q; v; m
    23.     protected $pageObj;1 v4 v9 x+ G' k: `' c0 c- R% d
    24.     protected $LNG; // 語言物件
      3 l! {8 b+ ^+ h2 k) Q2 r- g7 D7 x
    25. ) p! V& n. `: h' }, }2 B" w. g% E
    26.     public function __construct()
      , r' b7 I5 N) h& i5 L  C( u7 [: C
    27.     {
      % B7 F. D* }. l. U; @$ @; Y
    28.         // 載入語言檔和其他必要的依賴
      2 N8 E4 I, b6 V- l5 D5 ~2 G
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ' a  [" x7 a5 B8 t4 h
    30.     }; Z+ h$ \# u; k# u! S

    31. " V$ @2 E' w+ @; @/ t. i
    32.     public function index()
        k! W- B# Z: G+ W9 ^
    33.     {9 X+ F: E/ Y3 X2 e% N7 M* L
    34.         return $this->handle('index', 'show');( f4 w8 m# C$ @# T
    35.     }. E$ F  Q3 f0 N

    36. ) s+ U9 y: P- Z; h
    37.     public function handle($page = 'index', $mode = 'show')5 P2 ^8 q& h2 }
    38.     {
      # g" `6 `- f1 Z
    39.         // 安全過濾頁面名稱
      + z7 T$ e! w0 d6 }% _  D7 C. f3 D3 y
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      # ?: r7 g1 W4 z
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      , y8 k9 [9 ]$ H
    42.         5 w& L$ v' f3 a, Z0 U
    43.         // 檢查類檔是否存在/ s4 J3 G, o3 u/ O' d5 g
    44.         if (!class_exists($pageClass)) {
      , f+ L$ O7 i; \8 G3 a+ B/ H
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      : m' A5 {; j8 D* U* i  X
    46.         }1 f! b3 M! D5 e9 K. ]( F/ y

    47. # v' v% U6 T3 |  s4 [8 N
    48.         // 產生實體頁面類7 B; \4 v/ p" e. L* A. f1 g
    49.         $this->pageObj = new $pageClass();
      # V4 x* P7 k  W
    50.           D- }& B' _" a, C6 \) V
    51.         // 檢查模組要求; r1 h$ V, J1 l$ {
    52.         $pageProps = get_class_vars($pageClass);2 P; s7 K+ z! d
    53.         if (isset($pageProps['requireModule']) &&
      " j) `* Z+ p8 q) h0 `+ q" K
    54.             $pageProps['requireModule'] !== 0 && 2 x5 u: C; \+ R+ n& |0 C: z
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      , \: ?# v1 U: s0 B
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      8 W& n9 W! d: h  c
    57.         }+ ~7 T# L, V, S7 p
    58. : X# B! l) v" u( N" ?! t/ a% N0 t
    59.         // 檢查方法是否可調用5 L6 O' I' E! [1 Z
    60.         if (!is_callable([$this->pageObj, $mode])) {
      # H1 J* }9 {. e7 L& v# I' ?
    61.             if (!isset($pageProps['defaultController']) ||
      ; P- p( i! j3 S
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      # U- W0 M7 {  C, j% D, m
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);. l' m3 A  [/ @% L0 L: F, g1 W/ e
    64.             }; x$ N6 E% X, Z3 ~5 i9 w1 i0 W
    65.             $mode = $pageProps['defaultController'];
      5 y! |- b7 K& e( x
    66.         }3 z6 e0 z; g& P+ q8 E" I

    67. 9 H+ V% s* r" u- n( s
    68.         // 調用相應的方法
      ! ^& x5 H! x# ]6 m9 W
    69.         return $this->pageObj->$mode();" C" i. c1 X5 W; l% e
    70.     }( P! R# p7 f+ ~: @8 q3 \
    71. 8 x% |, k$ M3 W3 {* ]. x- ^
    72.     protected function showError($message)7 \9 q  ~& @- {1 d/ K. M1 M8 |
    73.     {+ p' U% ?! u3 @: |) l% M
    74.         return view('errors/custom_error', ['message' => $message]);, |& O4 C  Z& B& Q" N
    75.     }9 n* q( l6 \2 L3 a2 B" E
    76. 2 C# v% T7 }- l1 I, t
    77.     protected function isModuleAvailable($moduleId)/ Q1 n2 z$ |( ^4 Q2 M
    78.     {) h1 v- l0 `" a& b6 E6 N
    79.         // 實現模組可用性檢查邏輯" P+ ]9 v$ X# ?4 \. Z7 N# C
    80.         return true; // 根據實際需求修改
      ; Y& g8 L$ v7 z. ]3 {) j7 I4 e
    81.     }5 \) h; S! ^+ G& a; C, J9 k. `
    82. }
      ' v) M! `# z0 |7 E; g" z9 v, k& w
    83. % m1 H7 v3 X! {5 z
    84. // app/Controllers/Login/AbstractLoginPage.php
      ; I; G- H8 [- l' u
    85. namespace App\Controllers\Login;
      1 V+ E) d$ d% J3 c1 m; x

    86. ; j  x% }% y; x/ B, w0 `$ w1 d
    87. use CodeIgniter\Controller;
      $ f" Q" C' X( i& b
    88. ! H9 t3 Y* A$ N& G3 b# S1 ]
    89. abstract class AbstractLoginPage extends Controller2 L& W: R. l% K% M, A1 \
    90. {5 ^! D& _9 Z* D
    91.     // 實現基礎登錄頁面功能7 r( ~& _0 j% Z+ X9 h8 x
    92. }
      $ G5 V2 G  P2 p4 ?0 `5 I! k
    93. ; a  S. z9 W. ]5 m) X, ]1 t& n
    94. // app/Controllers/Login/ShowErrorPage.php5 {3 Q5 U  q2 j. W. f) _3 y
    95. namespace App\Controllers\Login;  L5 ?. a3 N4 x$ F/ Y. z

    96. - N: O; T( l* D
    97. class ShowErrorPage extends AbstractLoginPage2 d* G' M8 }" j* Z/ M% C8 a6 u6 a
    98. {
      : b+ O" C4 b' M; L6 }" d
    99.     public static function printError($message)( i3 t* C2 V# R1 P8 t
    100.     {
      ' q8 h4 L0 ]7 Q- K3 b
    101.         $controller = new LoginController();
      4 q6 d# X; M6 x3 k4 e% `# d
    102.         return $controller->showError($message);
      $ [" N9 v+ u8 x5 {5 f
    103.     }3 G$ f! t; ?  w7 g
    104. }
      4 @" z6 F: _" o! ]( S  l7 Z

    105. 8 r8 e& O+ U) m( d" Z! G! O
    106. // app/Controllers/Login/ShowIndexPage.php0 J) C, T1 U6 U. u+ K- g3 V3 V" y' P
    107. namespace App\Controllers\Login;
      7 O  }1 y- {$ `  ~" I  @3 ^
    108. 6 W/ J/ t/ t4 i3 v5 w, k: A* O
    109. class ShowIndexPage extends AbstractLoginPage) H5 P) j3 }4 D# D* }3 g. B
    110. {
      2 G# _& k% I) c0 E6 J, r! W' J. [
    111.     public function show()
      ; O% T2 i* n* z5 f; Z! m  m7 Z
    112.     {
      - b* W+ i3 e3 z& I0 G
    113.         // 實現登錄頁面顯示邏輯1 z$ c: s4 V7 l* w/ e& H; h
    114.         return view('login/index');; o) Q5 z1 X' U% B: u: P$ R
    115.     }
      / |+ {7 w+ n( H5 |% m1 W
    116. }
      & |+ V- b/ ~9 f$ u  X, ]5 ?5 l) G
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-1-3 12:18 , Processed in 0.016767 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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