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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14276 / 14276

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    , p: C) m1 b7 J0 j8 GAI 就是站長的最佳幫手。
    * \) K# @; w) R3 l
    6 g9 \) w  \0 k9 P3 r- R0 u: L; Y* [
    這裡的「新架構」是指後端的架構會有大變化
    , \/ ^4 K8 q, ]; q但前端的 UI 介面玩家不會感受出來有何不同
    + u1 j4 e- V0 J& U# `+ l  l8 x, q, |$ x
    % w  W5 R$ z' `  M$ C
    為什麼站長要改成新的獨家架構?4 ~  k! \$ n# t# p% Q% }3 R
    就一樣由AI模型來解釋清楚吧。
    2 `  g6 `- g% _1 \5 z- T8 s4 D0 ~( V3 E7 i: [
    : ~) \" I3 E) S: ?3 D# ~0 s2 p
    讓我分析一下使用純 PHP 和使用框架的優缺點:7 r% |  a1 `0 @* L3 ~3 \
    純 PHP 的優點:
    5 h, f4 l% b0 _$ i  }9 e1.        性能較好 - 沒有框架的額外開銷
    0 d8 s+ Z1 t$ r, y- X! I2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    : m' O; }; D% U- E! J3.        更靈活 - 可以完全按照自己的需求來設計架構
    8 w" Q, C) H/ m$ Q5 a6 ]1 Y4.        代碼量小 - 不包含不需要的功能模組4 V  a1 x& A7 K% i+ ^3 v( ^1 U
    5.        適合小型項目+ D% c. i! _! l9 R$ S
    純 PHP 的缺點:: }& N) `" h/ A, o3 o; w5 T: }
    1.        需要自己處理很多底層細節$ z9 n# R4 K+ C9 g/ {; M/ y6 f
    2.        代碼複用性差
    " ^0 j* @5 n4 Y! o0 ?- T0 d. y3.        缺乏統一的開發規範2 Z! E+ k. Q) ]+ a
    4.        安全性需要自行考慮和實現
    $ e: Z0 V, H) [7 t5.        開發效率相對較低
    5 A" T) b1 W% I9 m' b6.        維護成本高
      X. O1 Y0 C; Z( F0 \* W使用框架的優點:9 a1 [$ _, J7 r/ l" K
    1.        開發效率高 - 有現成的元件和工具: g% U9 a- i4 S! k) M# r
    2.        有完善的安全機制
    ' N$ ?5 @" y1 m1 F& O3.        統一的編碼規範5 j- L. N0 ~6 m, ]& g2 E% }
    4.        易於維護& X0 h3 X! q% Q  l& N. T: a, t
    5.        有活躍的社區支持- u7 [! i1 a1 h: u
    6.        適合團隊協作
    4 a6 M: W) j; h! g# L" K4 C7.        自帶很多常用功能(ORM、緩存等)  u% G0 `  E! w& l
    使用框架的缺點:$ c) }9 A9 d, j- J% L7 J
    1.        性能有一定損耗8 q8 ~/ l0 }2 [$ z- t. X
    2.        學習成本較高
    & M- |& `% K" Y$ v8 |: |3.        可能包含很多用不到的功能- L6 h9 k/ m8 ]
    4.        不夠靈活,需要遵循框架的規範
    8 P1 E% t& f7 p' i1 C5 F5.        對小項目可能顯得過重
    5 l" |! N" k; D0 U* x- R建議:
    ; ?# T! Q* g8 O7 ~  \) Y) Y% m1.        小型項目或學習階段可以使用純 PHP/ M  l* U) }" [5 R; t- |
    2.        中大型專案建議使用框架2 N4 y: G; a+ X0 K& W% Q
    3.        選擇框架要根據專案需求和團隊情況
    , d: s2 P; A, v6 P8 @4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    6 X! I4 R5 c4 d- C您打算開發什麼類型的專案?這樣我可以給出更具體的建議。% H- {( s) j& p! G" u
    % g5 g( V* w! F2 e5 q" y

    % G4 H5 @" S3 |; p6 L4 I2 `
    2 r" j# c; |: ~$ \1 W我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。# A; ]4 ?! _; H

    " L" ]' I2 t: \. u% }/ I- E這個轉換主要做了以下改動:+ @6 v8 q( }7 c( T, H9 G% q
    ; Z% e8 ~& L; G0 y  W
    路由結構:, ?" k6 T' M3 u. y$ X/ e1 h+ R
    ( n7 E& y, u. n8 i& f3 v
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    3 a2 E6 d% O3 i5 k9 v, C" I& W支援原有的 page/mode 參數結構) f, q1 @2 F0 s0 w) u. ]
    通過路由規則自動匹配到對應的控制器方法/ u3 Q3 \7 i2 ?1 @! R% e) _' _

    * @; t  f; n% E8 j  r, Z2 h6 \/ T% j: l5 ]
    控制器結構:
    3 ]9 V8 A2 U( G' L6 o, a
    : ]6 j- v- j6 l. t7 A2 O創建了主要的 LoginController 處理所有請求6 i* P+ y9 I: V" {; ?+ T! }5 \! v
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    - ]2 S7 C# P* E, ?" o  F* z2 T1 r, ?錯誤處理改用CI4的視圖系統1 P( G. C7 C4 r0 Y) v

    # v) I, v! t) ]0 D
    & g$ ]0 K! Y; o% e( B類的組織:; j4 {3 d/ v& G& x* {  P
    " M3 X9 d! @+ M& Z0 q/ e6 ]
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下( w/ z) O. n# ]" d6 |
    保持了原有的類繼承結構% }( H0 n, j$ |. _* X. P
    改用CI4的控制器基類和特性
    % C/ |- y$ U' r6 Z0 `7 O" f( B- y8 b) J8 n) S! J" j, G
    1 L" F8 o) C. N! W" o1 w/ J
    改進的安全性:* V: O6 e) M( {( [) g

    3 s; L! @. I7 q- c, b6 s使用CI4內置的安全特性
    $ b4 i9 X. J  o* k更嚴格的輸入過濾/ u& W) K7 w; `
    更好的錯誤處理機制; h$ L, ]) g2 B& |3 X

    ) [( _  w4 ~6 ^: S. G1 ~( ]4 T! X% \/ q- g$ O) @$ G
    4 X( W& [" _; a1 e5 `
    要使用這個新結構,你需要:
    ' P$ F; y9 E6 I; M' E/ `
    1 i2 m$ D, m! L9 Q6 n- l將這些檔放在對應的CI4目錄結構中
    $ ^0 m% ?& L6 f6 s6 a2 E" h確保創建相應的視圖文件
    * O7 w3 `8 x9 \: n  q配置語言服務
      V1 A5 B" ^8 b! u1 J根據需要調整模組檢查邏輯
    ' V9 N6 p; \/ U7 A; G# s4 W! ?. m( N0 T, L& G7 ]' ]
    需要注意的是,你可能還需要:" i. Y2 z& f: \+ R& {3 d0 p5 h+ {& H
    # Z9 {% T" C* l) d  s- z
    創建相應的視圖檔(在 app/Views/ 目錄下)
    3 o& U0 x! p7 p配置適當的中介軟體來處理會話
    ! _1 i* f: w* [6 C3 T實現具體的登錄邏輯. f! U0 A) w% l3 @6 _+ ^; e

    6 _  v2 y0 q& [' m需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    # f1 _% L  i0 N6 y, U7 d( S' O8 ~. @3 N( S0 [( P/ o
    1. <?php
      & p+ W* i- z, e& w% V. I, U
    2. // app/Config/Routes.php
      4 m. M/ `  I+ b
    3. namespace Config;
      - U0 ~/ C, z3 {: C

    4. " Q+ t& \2 S! h* ~) @4 X0 T
    5. $routes = Services::routes();
      ) O+ ]" O* f2 k# J, Z& p

    6. # Z- u5 S% N! Z' \* I& b
    7. // 添加自訂路由規則$ V% y/ U+ u% d- `) ^# l
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' X0 N1 W; z; m) u( R
    9.     $routes->get('/', 'LoginController::index');
      $ n, c9 f" Z8 u- }" }4 w* P
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      5 A! k0 j. s& s7 _! e4 k
    11.     // 默認路由處理
      7 x; D0 h5 t: I
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');; t) d' R2 |$ \8 n+ I$ ?
    13. });
      " c% ^# W/ ?- d: A4 k: d* {+ n
    14. . F$ I" h3 l7 L% t$ ?2 c5 V, y
    15. // app/Controllers/Login/LoginController.php
      2 U$ k- m0 B- A+ G, [
    16. namespace App\Controllers\Login;
      0 }7 o. b- I$ D4 C4 a

    17. ( n8 ], y5 x0 W; m, [! q' P2 W
    18. use CodeIgniter\Controller;
      ! {) E9 c3 K" v) R
    19. use App\Controllers\Login\AbstractLoginPage;$ ?5 x8 c5 _1 i  z

    20. ' q; L" f- [: g5 Z! ]& Q& f# `( K% ]
    21. class LoginController extends Controller4 L1 d; r' Q! F( ?
    22. {. D. o. r- G) Z3 H3 F' f6 m3 U! W4 b
    23.     protected $pageObj;
      , e, T8 t7 [8 J4 N# Y/ j: M
    24.     protected $LNG; // 語言物件
      % ?+ F9 F2 M, F' {5 H0 J. i' [
    25. 7 M- c9 {/ c9 R
    26.     public function __construct() 0 j; ?' G/ G$ t% n" l
    27.     {
      & P# Y0 l* b* a) Q6 q( B
    28.         // 載入語言檔和其他必要的依賴
      , K" h8 B! Y2 `7 t
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ! `( L2 ?5 j- f4 ~
    30.     }' S: ^7 M% P2 t% c% ?, M

    31. # t8 j& x3 {1 T( J2 |0 d
    32.     public function index()# a6 }0 \1 k/ h
    33.     {, n( @) @1 R/ Q6 l( V
    34.         return $this->handle('index', 'show');
      2 \" x: u# ^* M  _+ o' }
    35.     }
      & C7 \9 j7 M" Z% e

    36. 0 f: |* ?0 }4 A
    37.     public function handle($page = 'index', $mode = 'show')! p( f7 H6 y1 e& g; f! J
    38.     {
      - H9 b# `+ E( q
    39.         // 安全過濾頁面名稱
      / O5 }6 N% e3 s% e9 c3 H5 W
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      3 m% c( P8 S3 e7 f8 @
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      / d  y& h% t  L/ k2 p" _  v
    42.         $ U/ b* a: j4 Q& y' u+ Z! A
    43.         // 檢查類檔是否存在% Z+ H3 i0 h9 o% [# z0 f
    44.         if (!class_exists($pageClass)) {& M6 d( d, ^1 o  B# F% a
    45.             return $this->showError($this->LNG['page_doesnt_exist']);  P! `! J# ]9 i4 Y4 s
    46.         }7 r' {0 ]$ ^1 E" _1 Y# }  G5 I
    47. . Z% U1 W- j$ K* C, K% V. J
    48.         // 產生實體頁面類% }' B( @" f9 \( V# m
    49.         $this->pageObj = new $pageClass();
      " g/ i( p) q5 ?, V2 }( t, m
    50.         
      1 r- E1 R' y0 j' c5 Y, m0 m
    51.         // 檢查模組要求
      $ m( e( M9 W5 a5 b2 K) ^& S
    52.         $pageProps = get_class_vars($pageClass);
      , M: f/ u9 U7 M1 w  R
    53.         if (isset($pageProps['requireModule']) && # H+ k6 H- E; B6 E
    54.             $pageProps['requireModule'] !== 0 && % f4 q) m( h$ |3 ^
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      6 G! b+ U" T/ Y/ W& ?
    56.             return $this->showError($this->LNG['sys_module_inactive']);( {2 O4 ?' l+ x9 m7 q: p5 b) g  A
    57.         }
      ' t( K4 C; Q( i1 {$ H, g3 h* ]

    58. 1 r- q% d0 l8 G$ U: N5 F
    59.         // 檢查方法是否可調用
      ; |& _+ [$ {1 Z# g, ?$ M; }
    60.         if (!is_callable([$this->pageObj, $mode])) {
      # _3 y# `3 _6 r7 z) p9 F, L* h
    61.             if (!isset($pageProps['defaultController']) || / ~& j- M, b/ m4 o: e* C
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {) {* ]& G, E6 k2 C( P
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);8 v$ _$ a3 t+ r
    64.             }
      + j! W. e. d2 z1 |+ q
    65.             $mode = $pageProps['defaultController'];
      ( Y2 h2 v1 W, m" f) u- W7 _; H* e2 O
    66.         }
      6 s, e" l, \$ N2 d; R! z

    67. 9 a  L0 g6 Q/ I7 `# D- `& L
    68.         // 調用相應的方法7 d, w% I- j6 l% N  W5 I
    69.         return $this->pageObj->$mode();
      # c/ ?% z5 i* l# v. o
    70.     }
      ' t! V# y$ k' O- Z

    71. 6 @/ |1 K8 C2 A/ |9 D
    72.     protected function showError($message)
      & ^$ }" ?9 e, J0 _7 Y2 u
    73.     {8 s' ^: L) }5 x$ S% f
    74.         return view('errors/custom_error', ['message' => $message]);
      1 B% F6 R0 r! s1 q
    75.     }
      % N% w4 `6 ~; T7 j- U4 a9 D
    76. 1 [% p6 ~2 D. c
    77.     protected function isModuleAvailable($moduleId)4 v5 F3 L  x6 `% P& o  J# A) X
    78.     {
      ) X6 M4 k+ c2 T9 ]% S* z0 i; N6 y
    79.         // 實現模組可用性檢查邏輯
      3 Y* G  L1 S+ S' y
    80.         return true; // 根據實際需求修改: M+ n, J) E$ [/ E$ N$ s7 Q8 P" _; Q
    81.     }! ~4 h/ i- X1 _! @
    82. }
      . B* @2 L2 n: ?

    83. ( H# Q6 d6 Y% J" n( n
    84. // app/Controllers/Login/AbstractLoginPage.php
      & p2 l5 I0 \6 L/ E/ @4 Y
    85. namespace App\Controllers\Login;
      1 w  y! @, l; e3 E1 i% J
    86. # t+ e, Q; `* L( H- G
    87. use CodeIgniter\Controller;, k; M+ s6 l* N7 H7 H% D  A. A
    88. # J1 `$ R2 a5 f" j) J% V
    89. abstract class AbstractLoginPage extends Controller; X) X8 L+ ^' T  U
    90. {5 [/ B9 l# O; m9 E2 W
    91.     // 實現基礎登錄頁面功能
      8 g$ |- s% O6 S* a
    92. }
      2 |+ W. b% C- R3 h. w& E
    93. ! K: a, f- ]6 v6 W
    94. // app/Controllers/Login/ShowErrorPage.php
      2 L9 g' l9 r; K1 x
    95. namespace App\Controllers\Login;6 G1 p& A+ k% Y+ e7 i

    96. ! C, }4 H. N0 G) C! O0 a
    97. class ShowErrorPage extends AbstractLoginPage
      ! m0 y# Q& {! j
    98. {+ X, O' a4 i, s& A% [
    99.     public static function printError($message)
      $ A& h' y. A. O* p7 v9 U
    100.     {
      * Z1 G3 J6 P- [# F4 p0 ]- M
    101.         $controller = new LoginController();7 e( h  H' `7 O, I% F
    102.         return $controller->showError($message);
      ! ]1 a+ `1 M5 @+ c2 i
    103.     }
      ) \) R/ F- f: w  p# A$ T" I' J
    104. }
      6 P' F& Y6 Z) y9 k! u7 r
    105. 5 }& `1 h9 q$ M3 F
    106. // app/Controllers/Login/ShowIndexPage.php
      - n$ W! ^* \( y7 t* x1 ^
    107. namespace App\Controllers\Login;3 y5 n  u% |$ \, N4 T! d, s
    108. ) K2 |, j( s, O4 L6 O) r+ h
    109. class ShowIndexPage extends AbstractLoginPage
      3 ?. X+ [5 Y, |; a6 o+ q
    110. {
      ; F- b9 z( n9 i! h
    111.     public function show()
      8 c: `' }! f3 R$ l# z
    112.     {5 C7 t  R# ?" x& n0 W; Z
    113.         // 實現登錄頁面顯示邏輯" b; N) r! v3 F; b
    114.         return view('login/index');! _) O- @6 g1 m- p
    115.     }
      6 p& Y( [$ V/ u
    116. }
      ( D3 s# H7 ]3 @* d+ k
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-10-22 17:10 , Processed in 0.017605 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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