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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14069 / 14069

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致* n6 y$ n2 n7 ]# D9 F0 y2 m$ b
    AI 就是站長的最佳幫手。( B* e. {, |; K8 |( E

    & A9 i6 [7 ^. m0 {
    3 o8 \+ s* S4 s% R0 o這裡的「新架構」是指後端的架構會有大變化
    - F1 T) @) _0 R$ ?但前端的 UI 介面玩家不會感受出來有何不同0 U2 r. _& j( w' H3 B: T
      {  d9 O( k) k" X% u( W6 d

    5 o& i% F; B* l為什麼站長要改成新的獨家架構?
    1 Q4 V( U' K. P$ h2 U/ F$ h就一樣由AI模型來解釋清楚吧。
    . E8 l% E1 e, S& n1 {  \4 p0 }/ F4 |  j

    3 B' E' m4 v# F. W讓我分析一下使用純 PHP 和使用框架的優缺點:
    4 R' f" T6 j" m5 t" t純 PHP 的優點:
    " z+ [' @5 U% H2 m! [# W/ P8 k1.        性能較好 - 沒有框架的額外開銷; j9 x4 k+ ^1 W: Z2 a
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識" F0 J9 ^: c; _" _$ j' _3 q' i0 J
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    " ^" D4 o1 Z5 X4.        代碼量小 - 不包含不需要的功能模組
    $ t& C0 |" k, [1 G5.        適合小型項目
    6 f* x5 }/ P9 ^- M  l  f純 PHP 的缺點:% q  K6 ]6 b9 s( U
    1.        需要自己處理很多底層細節
    ) q2 p0 R( l9 |( ~! Q2.        代碼複用性差
    , ?0 d. E0 R2 F! G  m. O* A# u6 p3.        缺乏統一的開發規範
    ; c4 e) q1 D0 q4.        安全性需要自行考慮和實現
    ) ?% B$ S& Q& v: t5.        開發效率相對較低( A* }: m: J) z
    6.        維護成本高% P& D3 c* S, N; M
    使用框架的優點:# c( M; `4 B8 v0 h3 e( q
    1.        開發效率高 - 有現成的元件和工具
    + t+ r7 @8 E+ |; @( Q2.        有完善的安全機制. D2 k/ E$ H  M9 w* [/ s5 T
    3.        統一的編碼規範) s: R0 u% v. Y, h
    4.        易於維護
    ' ^6 \: F  t8 I/ |6 f. n5.        有活躍的社區支持4 Y* ^) ^; R4 j
    6.        適合團隊協作
    # Q& U4 E% u$ B# d/ u7.        自帶很多常用功能(ORM、緩存等)  N8 @( C& K3 W; U$ ?
    使用框架的缺點:9 z5 W5 _6 c$ _- P2 F" u
    1.        性能有一定損耗3 G5 J3 l, `4 q: ^' d
    2.        學習成本較高) l5 y- H1 g) O! }
    3.        可能包含很多用不到的功能2 Y/ B$ q9 o( D
    4.        不夠靈活,需要遵循框架的規範
    ( e+ M9 k+ M; n3 ^4 e: h+ \5.        對小項目可能顯得過重
    : _1 G3 [" w4 U6 @3 o7 i, o建議:! Y+ h/ j* z, `6 z: y
    1.        小型項目或學習階段可以使用純 PHP5 n1 x9 b( M! q6 ]! B2 j
    2.        中大型專案建議使用框架
    4 ?! @: ~. n8 X' G, k3.        選擇框架要根據專案需求和團隊情況2 V0 U) r/ s  V5 P0 G2 g" O0 k
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    4 [( I6 z+ V8 _# A9 U5 z1 }: f您打算開發什麼類型的專案?這樣我可以給出更具體的建議。1 T& y: T4 ]' q6 X
    3 o; s) h8 T: V8 l! C7 c

    / E; a5 K" J. x
    6 M# n/ }5 v- @$ ?我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    / A3 N: w4 M! X9 `+ U9 N) g& {; H: |" n
    這個轉換主要做了以下改動:
    6 v% ^: j5 L! d7 c5 l8 I' a1 s, I' T; c. V$ ]; `  j) K
    路由結構:& Z; u; X& o& X: a8 b. v( [. [
    , V0 Q, i+ p$ ~& r
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下6 z4 l' i: \2 U* M
    支援原有的 page/mode 參數結構
    * k( n- G1 k5 u1 |! c通過路由規則自動匹配到對應的控制器方法2 o+ @; V+ p4 U" o4 d

    8 H& H5 I* `5 {* q9 G8 F, x9 g' u0 n/ T7 L: K' q
    控制器結構:8 F0 L) A! @7 F! D9 x

    4 k+ }3 \. W3 d9 J1 D) t創建了主要的 LoginController 處理所有請求1 A2 A( f2 j- V
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範% |/ Y: x1 P  h' U. y
    錯誤處理改用CI4的視圖系統
    7 f7 w# R# |; b- c  Q, U! Y8 |& S. e6 D0 a  c/ k
    / p) v: o7 e  g* I7 g+ Q
    類的組織:
    ' p, ~6 d& h) E5 K+ I$ C9 o! ]3 Z0 J& u2 x% O- L" S
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下& a) I+ X6 d8 {3 ^6 m8 \3 D$ g
    保持了原有的類繼承結構
    9 ]9 U' B3 ^5 n+ Q( o改用CI4的控制器基類和特性
    ) v: D2 H6 V+ A# d9 I( h2 J
    9 b5 H6 q1 H9 D) p3 V$ v/ u- {  h, x
    改進的安全性:. o: l1 |( h7 X9 u' ?  j2 E  K3 |

    ; Q5 c2 j# b/ y$ {使用CI4內置的安全特性( ~$ G) s+ H3 u( ^
    更嚴格的輸入過濾2 ^, |5 x5 d- c/ d: {& [
    更好的錯誤處理機制! v  z' u( L" U
    " F+ ~8 C- Q4 w% Q

    " J' [9 c1 b, p0 R- b* a0 s9 z: g% j
    要使用這個新結構,你需要:
      f* A' u+ R, \8 f0 _2 n6 E  G$ y
    將這些檔放在對應的CI4目錄結構中2 o" I0 w7 Z+ \7 G' b
    確保創建相應的視圖文件! `, O* M- F+ p$ t$ Q  P
    配置語言服務
    3 Z) L6 [$ |; D% h, u1 U5 ]$ X根據需要調整模組檢查邏輯* ~+ U% d; j' Y2 S: ^; ?6 m
    3 |6 `+ C9 q9 J: q6 j
    需要注意的是,你可能還需要:
    % P( f! g' C2 a6 ?! Z4 c0 \+ w1 @. o/ y
    創建相應的視圖檔(在 app/Views/ 目錄下)
    / ~2 @9 z2 A  `0 @4 T% I( \配置適當的中介軟體來處理會話
    : S5 ~3 J+ y0 U  f+ k實現具體的登錄邏輯: j/ l; N9 l% @* N3 ?- f9 h1 L9 d
    ; X" f; \: o" p% O3 T, s: O
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    8 m7 @! Y) t3 `/ d+ J1 Y; `* B( A0 s" V' G; X7 e" W* E
    1. <?php# y. l$ b/ s" X
    2. // app/Config/Routes.php; r/ q& i( K# I" {: {% k
    3. namespace Config;# O, b( U7 ?. I/ t
    4. , g5 y7 E! L# i  f/ z2 V' O
    5. $routes = Services::routes();2 I$ b5 Y* n, y
    6. 4 E, s+ b: v7 _' _3 v, ?
    7. // 添加自訂路由規則  F, k9 L- Q' [* {' O1 L0 E+ x
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ( D+ u" F. f; K/ d/ S
    9.     $routes->get('/', 'LoginController::index');- F. n6 w4 f- Y) A9 e
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" C: J/ V) d3 x+ N% F! b" ^# i
    11.     // 默認路由處理0 P- b4 o, ]; A6 C5 O" W
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');6 f0 M7 m3 q# Y/ |8 o7 L: Q5 ~" H
    13. });3 @; @6 `& m8 \$ S' \( s8 G  T$ g4 O
    14. 7 T9 t$ k* w# z. S2 E" s
    15. // app/Controllers/Login/LoginController.php
        ]$ h4 ?( M2 p, h- \" R
    16. namespace App\Controllers\Login;/ m; |2 s8 {1 W$ F% _$ [$ ?6 J$ @
    17. 6 C2 m$ q1 z) [' R( _/ u
    18. use CodeIgniter\Controller;5 n) D2 a% V9 t5 {$ V
    19. use App\Controllers\Login\AbstractLoginPage;
      / f, h' A5 O2 ]

    20. 7 f4 d- f0 j: C7 q% S9 k
    21. class LoginController extends Controller, R. ?2 s; a( k! H, m9 P2 m
    22. {6 Q7 K2 ?; i& j+ K
    23.     protected $pageObj;7 X( R' B1 a2 ?) k7 h. E
    24.     protected $LNG; // 語言物件5 y6 I9 w" p7 g
    25. % z# @, r' n) ?6 b+ C2 T1 h, m
    26.     public function __construct() % o- U9 b3 Y. P& M& q; K0 n
    27.     {; x  `# J, D8 U# [- a
    28.         // 載入語言檔和其他必要的依賴  i% K2 S4 @7 l- u# p! l- [
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務  \( c& U# S3 M* ]9 [% g( j
    30.     }2 K( w1 P/ B5 \  Q
    31. ( Q; v4 I5 D) M; W5 ]
    32.     public function index()
      : M+ k; d2 [4 |, i
    33.     {
      - `! z6 g* q2 V2 V
    34.         return $this->handle('index', 'show');6 M$ B, C8 E9 }' y. e% q2 H
    35.     }8 O# d  t$ h! A- A  u1 |

    36. ; H0 ]* {& |: o2 f* G" ^: X
    37.     public function handle($page = 'index', $mode = 'show')
      / O. s) L1 ^/ T" `% k8 Y
    38.     {
      ) r5 T6 L) s( W$ S. [
    39.         // 安全過濾頁面名稱' f  [' w, m# w4 V
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      ) O+ d" p! @  e. x
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      : y  Y9 }$ L! G; v% {
    42.         $ Q( C, d$ J1 {3 z6 x1 x$ F% F
    43.         // 檢查類檔是否存在* Z! x0 x. |0 L) w9 F. F0 T
    44.         if (!class_exists($pageClass)) {, h: h! ^: T& ^
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      ! g! y8 ?5 u  B) \) c, `# Z
    46.         }
      , Y  Q  _/ G4 q7 F! u. S' A- z3 u
    47. # `9 d: O  r. f
    48.         // 產生實體頁面類2 R% ?; x2 e- Z$ h! I5 {
    49.         $this->pageObj = new $pageClass();: L. a; |  W$ \) {
    50.         
      5 e6 y0 z2 r2 Q. l
    51.         // 檢查模組要求
      1 b5 d8 n7 ^. l: J2 L4 \0 J
    52.         $pageProps = get_class_vars($pageClass);
      2 o6 o& Z6 U+ O
    53.         if (isset($pageProps['requireModule']) &&
      ' r- Q9 c0 [& s5 e
    54.             $pageProps['requireModule'] !== 0 &&
      , g1 Y5 p5 o; q) c7 R/ o0 M
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      9 ]* S8 D7 N( t: c& J0 M+ A& h
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      1 e" E. J2 G% L) }6 U- o# \
    57.         }
      & t0 I& q7 d- f+ [0 X/ R) J

    58. 1 I0 L, I8 m2 x1 N2 Q
    59.         // 檢查方法是否可調用
      . T! n$ p1 D* M8 H
    60.         if (!is_callable([$this->pageObj, $mode])) {
      # C- \7 D0 J& p$ ]8 B/ @
    61.             if (!isset($pageProps['defaultController']) ||
      $ n9 n# B& Y$ z" V5 L
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 u9 |! a$ }& M3 \" |4 m" P) n
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);: F3 N( G9 B3 x1 n5 b7 e
    64.             }1 R. Q" K  u( ~- M0 _0 {
    65.             $mode = $pageProps['defaultController'];" `+ W1 l& R6 B2 M& N- N
    66.         }
      2 s9 w0 r/ w* y2 b0 x
    67. ( M0 X% F; n' S( ]6 R! l
    68.         // 調用相應的方法9 l# X  A9 M( K2 w) Z/ ^
    69.         return $this->pageObj->$mode();
      ! G6 K2 ~: F1 R0 g
    70.     }
      4 d, ]0 k1 K1 ~" @0 Z+ E& ~! Q

    71. $ A& `5 U! J6 S% a( |) i
    72.     protected function showError($message)9 d  ^6 U* Z  p+ y5 z; [
    73.     {1 `; g  z8 y/ q+ {- ]9 j
    74.         return view('errors/custom_error', ['message' => $message]);% _/ `, n) |! r. m/ o
    75.     }
      + ~/ @0 t# q6 [* b& ]: V. h& i
    76. ) H" j4 m- c3 a* _2 P) Y! G5 q
    77.     protected function isModuleAvailable($moduleId)3 |) y0 d# u6 E) w( @
    78.     {8 d; U; G' J2 T: y' j0 B
    79.         // 實現模組可用性檢查邏輯
      - e! R/ Y2 M; C5 r# g7 s# r
    80.         return true; // 根據實際需求修改- m' i% d0 S) z9 a4 s+ G  _) D
    81.     }
      6 O$ a: ^6 |+ |" @. _. E# U( f
    82. }
      - `4 r" r* {- F9 Y  G8 A

    83. ! F( }- y4 P! o
    84. // app/Controllers/Login/AbstractLoginPage.php! i: i9 f1 P; L% V6 K  k
    85. namespace App\Controllers\Login;
      4 B: D/ \. ^; Q' L9 ]; @0 s. k

    86. , a* a% v: q- y/ P% _
    87. use CodeIgniter\Controller;, }' S# @3 n! v% A0 n# }1 q! q
    88. & v+ r: f6 R( c* D. y. f% W6 w
    89. abstract class AbstractLoginPage extends Controller
      3 ]0 A2 J3 |# q
    90. {; ~5 H) d; p1 L, {; r
    91.     // 實現基礎登錄頁面功能
      ! Z& i& R$ H& T  q: _
    92. }
      1 Y# a5 a- [4 {+ r. {: d9 {2 g
    93. 6 k9 E! B# t4 \4 W7 S/ E5 T+ X
    94. // app/Controllers/Login/ShowErrorPage.php. a5 {$ u; m' q+ \9 |% B
    95. namespace App\Controllers\Login;+ L* l% R8 i8 x7 x$ Q0 H; b2 O

    96. % m5 q6 t/ F3 V; T2 h- h3 U7 p6 I
    97. class ShowErrorPage extends AbstractLoginPage
      ) f5 W+ N1 D9 q6 z  {, k5 S" m2 ~% ]. ^
    98. {7 s" h! ?+ V9 ^
    99.     public static function printError($message)
      - Y: d; \3 S4 o; ~# I+ G
    100.     {9 O, s" h% x- I& ?) K
    101.         $controller = new LoginController();
      # Y; D$ x: z, l% x) w  t# P# a. G( L
    102.         return $controller->showError($message);: w, X6 n6 [) F: I; |, t: d, e/ Y$ ]
    103.     }
      4 P7 t2 u$ K+ L) q2 @0 L; M7 R' |1 T
    104. }. T) n7 Y+ U0 |+ E
    105.   ^* U6 n6 i$ p% }8 J9 W4 _
    106. // app/Controllers/Login/ShowIndexPage.php
      " y/ Z( D5 q+ e. M  j
    107. namespace App\Controllers\Login;. V2 p) K1 ^4 [( [( T- P  l" r) z, k
    108. 6 I5 {/ Q0 S5 C6 W2 Z
    109. class ShowIndexPage extends AbstractLoginPage
      8 J+ y+ l: R0 g2 T, o+ m7 S
    110. {9 U7 t7 a; y5 U4 ]
    111.     public function show()% u* h0 [2 k0 N+ ?$ p0 K1 e6 d7 p& y
    112.     {; L0 Y0 V9 m1 n  r& X, }* U7 h
    113.         // 實現登錄頁面顯示邏輯" w* X/ J' s4 C
    114.         return view('login/index');. f+ h# @) q* [7 O
    115.     }
      # U$ Q+ I6 c" O! f# D4 u
    116. }
      7 \4 _' @# c0 y( A* f; h' u" o
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-8-4 09:18 , Processed in 0.012963 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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