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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14788 / 14788

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致+ d. ]( j1 ]  H5 `1 k8 P
    AI 就是站長的最佳幫手。
    & b9 Y/ u# u3 }5 O* ]9 {; o! [6 H- x  H% k& s
    ! i% t% Q# Y. p% e, W
    這裡的「新架構」是指後端的架構會有大變化
    2 x3 w- A# z9 D4 ?0 R6 p3 h+ x但前端的 UI 介面玩家不會感受出來有何不同, O- I7 D% K7 X/ y) d

      Y6 _7 P! h4 Y0 \4 N# ]) _# [6 o& w$ U
    為什麼站長要改成新的獨家架構?& `3 Z- t7 W7 g/ _* A) ^
    就一樣由AI模型來解釋清楚吧。
    2 f+ q* @; i9 }! W) q0 \( Q
    7 ^6 X! B  z0 e# V! u  [, j& G2 |8 ^$ @* _) T" j* J; K
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    ( c; I4 C0 G, C' A6 \, }  K( ?* _- [) i純 PHP 的優點:
    ) Z# F) P7 x8 u5 y5 b4 V4 X1.        性能較好 - 沒有框架的額外開銷
    + K/ K: q: |( F: P: p2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    : q& Z* I$ q6 e  x( B8 e3.        更靈活 - 可以完全按照自己的需求來設計架構4 {% l0 x! ]! O9 x/ ?
    4.        代碼量小 - 不包含不需要的功能模組( _: G% ]1 w' q5 y3 Z2 E1 y% s
    5.        適合小型項目
    % Q4 s7 w) K/ ]: ~( M. O* o2 z純 PHP 的缺點:  B( y+ `) p# h3 b- Z
    1.        需要自己處理很多底層細節$ D8 [7 o, q2 S4 w9 e5 T
    2.        代碼複用性差
      F, C8 h5 @, Y! g- J8 C9 ^$ N3.        缺乏統一的開發規範5 i" [* x$ S1 f* i: w( t4 r
    4.        安全性需要自行考慮和實現
    7 S7 `( N. a* }7 i* q6 @9 r5 m5.        開發效率相對較低
    4 D2 W8 G  c* W0 [6.        維護成本高
    ( c* g/ M, M5 X+ L  [- h. |使用框架的優點:( h# F) j; z3 b* @7 Q% F
    1.        開發效率高 - 有現成的元件和工具
    4 L' O% B/ U) x) }4 Y1 d, |2.        有完善的安全機制" E% k# s: t9 {0 ^7 H
    3.        統一的編碼規範
    3 L' ^1 \( Q# p, t1 ^/ A6 ~4.        易於維護
    : j1 U- J  h. ]$ D! o* t2 y5 m5.        有活躍的社區支持: G& i0 N4 N% M9 |
    6.        適合團隊協作6 v0 d! o: x& X0 z  I9 D: w4 a
    7.        自帶很多常用功能(ORM、緩存等)
    ! [+ Q& v- [4 H- s4 N使用框架的缺點:
    4 P$ y  \1 \$ {; [1.        性能有一定損耗
    8 v$ r7 m0 y! r7 [2.        學習成本較高
      F$ }1 v6 S* l$ H- t9 ]/ Z3.        可能包含很多用不到的功能
    ( C  p: b* ]$ r' u4.        不夠靈活,需要遵循框架的規範1 K7 w/ B9 i' B% `( y" F1 d+ a/ X3 a
    5.        對小項目可能顯得過重
    6 i3 d9 C2 G3 y1 m4 V建議:
    ) V+ P# _" C& P9 h1.        小型項目或學習階段可以使用純 PHP' A" G0 W4 |$ }' d% k( c
    2.        中大型專案建議使用框架; R0 o; x  |# s5 L  O6 d
    3.        選擇框架要根據專案需求和團隊情況
    / z4 b' k: f; l. ?" H4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    & ?0 |  W5 _7 M! H6 J您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    " k0 j8 [& w' ~8 S4 b& [* H. a: _2 ~5 u. }8 a- |7 g5 C
    5 z1 f7 `) |# N3 Q, l# e& E
    . P( k* t, R' o$ s
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。) U5 ~. X$ K+ ~! U2 [& `, }

    4 T" e' a+ y6 v. j這個轉換主要做了以下改動:
    ; @% p: ]% r' W6 Z0 e
      H' h4 [1 ?1 }7 n) {# S路由結構:- c3 D( H0 r9 n* l) D: R

    ( Y5 v4 I! `7 s' E2 L( l/ [使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下9 }2 u8 R- _: g4 i% e* U
    支援原有的 page/mode 參數結構
    1 u, O2 R0 P6 y: l8 g- [通過路由規則自動匹配到對應的控制器方法
    + j6 H- W8 f' \! t  n. @
    $ f2 w7 w  y* f
    3 d4 ]1 c, d/ N7 ^, _控制器結構:) i2 W) b5 L. r  g+ \

    & [8 T7 e7 k* p9 J1 S. T創建了主要的 LoginController 處理所有請求
    1 `1 Z1 Y0 k% n. \5 z7 I保留了原有的頁面類結構,但改為符合CI4的命名空間規範# |0 E1 K/ C8 B9 r/ Z
    錯誤處理改用CI4的視圖系統& G- c; I2 h/ Q8 }! k
    7 L( n5 R+ V  G) u
    & }' F* A, W- D3 g$ P$ W
    類的組織:
    ' j; Q  }' P: m) z" X2 P8 j+ {8 B/ ^9 M& ^/ t$ a& r/ p
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    6 x& ^+ D! k- N6 n4 e, T保持了原有的類繼承結構' ]) B6 @! l5 m$ q8 @
    改用CI4的控制器基類和特性
    & ~; q4 O+ k7 ^- [* e0 w# ~0 `0 M# F1 {( w) ]' V$ d+ `  y6 B
    1 ]- T0 f; L" T% ?7 p/ b
    改進的安全性:
    0 `7 e! |9 G, h4 w5 d8 N. E& H0 e( g6 c: K
    使用CI4內置的安全特性1 ]0 p( d; t2 V2 ]2 \* r- f
    更嚴格的輸入過濾
    . s$ w( d3 h$ L: E更好的錯誤處理機制
    , j( A; g: p1 x! [) g+ H$ ]% P& h1 Q* |# }. X6 p0 I, B6 i
    0 h, r3 E" b: n# J$ f
    ' s2 M# I) Q% b* \3 M0 Y
    要使用這個新結構,你需要:
    % N: G) u: O9 [' j$ p
    $ n. d4 i* y- j9 d+ [+ t: G將這些檔放在對應的CI4目錄結構中
    % O* _% g. f3 q4 W/ ?3 Q確保創建相應的視圖文件4 R; n. h, d$ Q1 d- ]+ D8 ?
    配置語言服務
    ! T4 L0 Y; R+ [2 C9 b+ R根據需要調整模組檢查邏輯8 o8 A( t4 v) b
    . J  g2 d- ~. q4 Z( l4 e- u
    需要注意的是,你可能還需要:
    8 V7 t/ t/ P' w3 e0 }+ `9 A3 z
    ; U9 S, Q% v/ q( G2 |9 V創建相應的視圖檔(在 app/Views/ 目錄下)
    $ r( j; B& }1 F( @3 j( Y0 l4 x! y配置適當的中介軟體來處理會話- @% m  G. Q: E7 @$ s
    實現具體的登錄邏輯
    * c! z4 F: \  J6 S5 P# }6 H+ a6 i  [% |/ K
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?, _; L+ i7 t9 n8 t# `

    $ A; w, J% Q6 b" _% e+ ^8 C; x
    1. <?php
      & F5 p# w! R# O/ V, ^9 e1 Z
    2. // app/Config/Routes.php
      4 |; m* E, c6 D! m* t' G* ?9 a
    3. namespace Config;
      " ~- s" z/ `% u  J: r$ w

    4. % T+ c8 r) H0 y6 W
    5. $routes = Services::routes();
      ! Q' w; E6 ]; O/ S

    6. 6 r( t4 b6 o( R  h1 {
    7. // 添加自訂路由規則+ D6 J" B6 k2 C. ^3 G
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {" P. k' D& l2 K+ r$ ^$ a) V
    9.     $routes->get('/', 'LoginController::index');$ ^/ u; h2 |9 z
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');' Z* x0 T& H5 \  T: A
    11.     // 默認路由處理7 Q2 d7 |/ ~/ ]2 g
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      1 p# m. \% H8 ?) x6 r
    13. });6 \( j: W; w* N. [; Y+ w$ V
    14. 7 |- A/ i. \3 j
    15. // app/Controllers/Login/LoginController.php% ^4 _( u1 Z+ v* m$ J8 v
    16. namespace App\Controllers\Login;1 |* W, l  p9 U8 h' T& L% s! p
    17. 9 Y8 x7 d# N2 f% {8 X6 }7 h8 o% e' P
    18. use CodeIgniter\Controller;
      / w$ D* G( z" L: R6 Y4 A# P8 |* J1 V
    19. use App\Controllers\Login\AbstractLoginPage;, @& c& k/ C4 P$ T8 L+ |# B" B
    20. . j; m6 f4 l0 @
    21. class LoginController extends Controller; V! g% y$ p3 o$ R' I
    22. {
      + d; C7 H. {. W  o$ y* i) N8 N
    23.     protected $pageObj;- U9 D! y) g/ q& ?
    24.     protected $LNG; // 語言物件
      4 l! Y8 J* k2 D; x) v  x5 H! j4 P

    25. 9 V; @, a# A+ w4 ~
    26.     public function __construct() " J5 u7 R: E& i+ m
    27.     {
      # A2 O) ], f# G; E
    28.         // 載入語言檔和其他必要的依賴
        r0 F" k# n4 M' C* y9 {% S
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務9 B  C5 a3 v8 h' q: X
    30.     }6 s7 [8 k. m5 W9 J  [# Y

    31. # G& Y( R* T( x" X3 U( Z2 c
    32.     public function index()% Q) E  R* D: Z2 T, N
    33.     {
      # c( T# z( Z  c
    34.         return $this->handle('index', 'show');
      5 z: l4 l- t/ C) t" _% `1 P5 g  ^
    35.     }; O6 K0 N( h% {. h. ~$ P' u! I
    36. % [6 \; s5 Z6 Z( _
    37.     public function handle($page = 'index', $mode = 'show')
      ) |7 j; b5 K: F* E
    38.     {7 V$ j9 b; i% p
    39.         // 安全過濾頁面名稱
      3 a! Y6 B7 t. [7 E
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      8 d. p1 M6 R6 V- _
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';6 i7 X0 w# s$ K  e& u' a
    42.         ) J) f4 N- x5 m+ J$ W
    43.         // 檢查類檔是否存在
      0 g7 A( _; e2 s9 S# a
    44.         if (!class_exists($pageClass)) {
      . ?+ N6 k2 ~7 \6 ^5 J  x
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      7 t+ C/ Z0 u: h/ p2 {8 {
    46.         }
      " \, P# \8 o! ]/ u2 \
    47. + _! f4 H. @/ ?5 A, W# k5 r! @
    48.         // 產生實體頁面類! [% z0 t% F  _- r' x3 g- U1 M
    49.         $this->pageObj = new $pageClass();
      1 D4 `5 k& z9 ^& t' a
    50.         % E8 Q8 E9 G1 T) h
    51.         // 檢查模組要求3 R: b; `0 H- ?5 B6 y/ H* e8 g  K
    52.         $pageProps = get_class_vars($pageClass);
      # s  T0 Q- y2 F( ^
    53.         if (isset($pageProps['requireModule']) &&
      3 n( x1 K6 H9 R
    54.             $pageProps['requireModule'] !== 0 && % S! \& i( Y' W# g: u4 y
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      : p, p# |" I$ X/ z' ]6 r/ g
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ( i2 _6 P! u  z) ^) _# x
    57.         }+ p$ ^0 f$ i$ Q  l

    58. 4 ]- h6 t' j) K+ A0 _' k
    59.         // 檢查方法是否可調用
      ' S: v$ B$ N9 D
    60.         if (!is_callable([$this->pageObj, $mode])) {7 G( V& j" d& q& L
    61.             if (!isset($pageProps['defaultController']) || & v6 F$ P' ]- V$ w6 r# X5 Q$ C
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {1 B& E) f% @3 F- W/ h
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);7 O3 }( K, v( D
    64.             }
      : @. @5 B6 d3 ^" Q# r5 ~
    65.             $mode = $pageProps['defaultController'];0 V5 G4 ^! k# [- P7 ]
    66.         }% S" m# P0 b7 z: w5 G
    67. + s* H% r5 e5 ?, }! L- v
    68.         // 調用相應的方法
      3 f5 _2 x/ V9 {$ Y6 Q+ s
    69.         return $this->pageObj->$mode();* `% C5 q, m4 }4 ^
    70.     }/ g, C  S" I* [; }2 J# m  W

    71. ( p1 X( |: y* u7 P; N& y
    72.     protected function showError($message)
      " y5 Q) p# J  e! A/ C+ E/ H
    73.     {8 I: K" U6 m7 q* d
    74.         return view('errors/custom_error', ['message' => $message]);+ {# D( O! N% s) V1 d% y
    75.     }
      ( ~! e0 C% P: {) V' Z" y! Z

    76. 0 m: u) U- f2 f5 J: |
    77.     protected function isModuleAvailable($moduleId)
      : z) g8 a  |  L6 Q& e9 J
    78.     {/ t# I# E- j  J) u8 g8 c! D
    79.         // 實現模組可用性檢查邏輯6 k" i1 }7 a1 V9 l+ ?8 P
    80.         return true; // 根據實際需求修改4 a' T) W, {- w! `$ ]
    81.     }5 Q3 i; h; t/ H
    82. }
      6 V+ l) _7 g/ U2 T. k3 V  j

    83. & ^* m! {% K$ h& k2 H9 w7 G- z
    84. // app/Controllers/Login/AbstractLoginPage.php( w1 I/ D# Q, u: _: p6 t8 u
    85. namespace App\Controllers\Login;
      3 _  o7 J. r; t* t6 ~) D
    86. 1 X/ m1 M) x; C& [
    87. use CodeIgniter\Controller;6 ]; h9 Y* ~4 n8 G7 I) |
    88. * J% w- p8 ?* K& X/ W$ v/ i5 _2 c$ D
    89. abstract class AbstractLoginPage extends Controller7 f1 M, {) D2 B& B$ i
    90. {5 c+ F) n: L1 V; m$ \0 ]8 \
    91.     // 實現基礎登錄頁面功能0 X- @' s5 p' I7 [
    92. }8 a/ ^( T8 q) H
    93. ! {" K; S; X+ e  M% v
    94. // app/Controllers/Login/ShowErrorPage.php
      9 T& T6 G' O- R# E6 o# ~5 C$ k
    95. namespace App\Controllers\Login;7 F, [7 a3 w) O, w) e5 \6 m
    96. ) a: T. D8 N4 ?% G* y- C: Z% R
    97. class ShowErrorPage extends AbstractLoginPage- O$ F+ s* O/ C# j8 ~
    98. {
      : L8 o4 m+ }$ Y+ c5 ?4 B
    99.     public static function printError($message): w. }( T: ]2 `
    100.     {0 m2 a: z. M3 n
    101.         $controller = new LoginController();
      # E' v7 _4 l5 z! Y
    102.         return $controller->showError($message);
      ) G- w1 I$ `$ }' p
    103.     }# Q) k: s' \* l8 F: `) u  v
    104. }$ Y/ [" H; d4 `: g

    105. - M7 a' R& ~. G' E+ A
    106. // app/Controllers/Login/ShowIndexPage.php# C% g$ F1 A8 g; i0 P9 Z+ G7 g
    107. namespace App\Controllers\Login;0 F* l  T  C  k1 C: y6 `' s* j
    108. ) _5 g9 }& p) U4 ^5 M1 N( Q0 T2 x$ [
    109. class ShowIndexPage extends AbstractLoginPage: |; p0 V+ M, P9 i
    110. {
      7 n* q4 P  |1 X- v0 C
    111.     public function show()
      ( O7 n. v  ^, T4 Q8 J( J
    112.     {& `; d! S3 n. k/ R
    113.         // 實現登錄頁面顯示邏輯# }' T. G5 T7 _! E2 J! K6 S
    114.         return view('login/index');! C# \) ~/ j2 @
    115.     }
      & {% _: }  |/ C$ U
    116. }8 r9 [, P) O3 p. b; Z& x
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-5-5 04:51 , Processed in 0.012018 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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