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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14246 / 14246

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    7 D( d2 F; o5 D: EAI 就是站長的最佳幫手。
    - Q8 P- J5 M9 I8 x0 C1 r8 O, B" Y3 v% r9 l

    - Q4 T3 T1 W2 A; [! Q這裡的「新架構」是指後端的架構會有大變化8 i2 h  t5 B# B+ L3 Q, O! Y0 d
    但前端的 UI 介面玩家不會感受出來有何不同
    + P- \7 O6 j5 |& P
    - ]% u1 l4 g; E) M4 m- f4 m, z2 N" ~8 ?" K
    為什麼站長要改成新的獨家架構?
    , I9 ]  b8 Y) {. X- f就一樣由AI模型來解釋清楚吧。
    4 A; S. V! q! h7 y  I9 g
      w$ Q! U' z7 s6 T7 m4 [- F, U, x8 X& I$ {- ^) J* Q) V& I& T
    讓我分析一下使用純 PHP 和使用框架的優缺點:8 [; [' }& m$ G2 c: j5 z8 L
    純 PHP 的優點:5 B: T  H2 @3 h
    1.        性能較好 - 沒有框架的額外開銷: }3 L# X1 L: o/ F7 C% L
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    - T( G* H2 t" d7 A% B9 O* f3 s3.        更靈活 - 可以完全按照自己的需求來設計架構
    ( X9 s- j1 @1 c  E. D2 U$ z0 E" b4.        代碼量小 - 不包含不需要的功能模組
    . m2 g. o3 I4 e( z2 O/ s% U7 n5.        適合小型項目0 w5 A* `# C* g) C! k# w8 a  O, @% z
    純 PHP 的缺點:: \9 @7 [2 D6 n" b2 I! Z
    1.        需要自己處理很多底層細節
    9 X2 K% b" f0 v: A7 u2.        代碼複用性差
    * U  ?+ p. W$ R1 a* O  c0 s3.        缺乏統一的開發規範
    * P( O6 i' R: V1 P) a9 j' t1 n* t4.        安全性需要自行考慮和實現
    ! y$ H5 E: K' m5.        開發效率相對較低+ R6 t' n% f3 Z4 {# \
    6.        維護成本高
    2 J7 e1 |/ R8 b; \9 s8 s7 \. g使用框架的優點:
    2 y: u; H4 Y/ w, |1.        開發效率高 - 有現成的元件和工具& B) h% B: A3 w/ w3 U5 v% W
    2.        有完善的安全機制4 g$ P% q) M1 V4 f! y3 ]6 f
    3.        統一的編碼規範) K5 L* |+ J$ U
    4.        易於維護
    * j8 j8 \$ n" G6 B& X1 m5.        有活躍的社區支持3 r0 S9 }4 o; |( l- V; n
    6.        適合團隊協作
    - I4 T4 @% m7 Z, z7 k7.        自帶很多常用功能(ORM、緩存等)
    2 e4 A& _4 r( i( C) V3 m6 [) s  M使用框架的缺點:
    2 m9 S$ f- B. M1 T0 d8 q8 C$ \  u8 `1.        性能有一定損耗
    - ?6 @, B" @- T2.        學習成本較高
    & D' Q% {2 U5 O# s3.        可能包含很多用不到的功能' w- ^) q$ l& ~
    4.        不夠靈活,需要遵循框架的規範& ~2 o+ t8 u' ?
    5.        對小項目可能顯得過重  |3 R/ t7 ~% B" L  d
    建議:
    & G' q) \4 G; t7 X1.        小型項目或學習階段可以使用純 PHP8 W- A6 ?3 v/ k, _8 @! D
    2.        中大型專案建議使用框架- Q; f2 I5 G( R6 X! D8 t
    3.        選擇框架要根據專案需求和團隊情況7 L0 A& A, M7 ~% E$ h4 l
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    % a( U! e! R& `您打算開發什麼類型的專案?這樣我可以給出更具體的建議。* x3 t( T2 T1 t5 @" ^

    3 V1 j& S! b2 W* [- E- Y2 {+ V5 _' [( R1 k! o; M& u' S

    ( I7 S1 k$ r+ v1 H/ G我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    . y  B( I+ }6 L- y/ @! I; O7 u! \; E8 Q7 i
    這個轉換主要做了以下改動:6 m; s$ c8 m, q* |0 r

    ) F. @! ^' t/ i/ O. J路由結構:/ D, f  B$ Y9 A
    9 r7 w4 m! \1 |" E
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下: @7 ]/ x; W5 @, c3 T- a
    支援原有的 page/mode 參數結構8 q! |3 j- R* H7 r2 F4 m/ A' B
    通過路由規則自動匹配到對應的控制器方法
    : h7 d) a3 ?% C% ^
    8 ]1 X" j3 Q1 t: M5 x* l2 x7 y
    - O; R1 y! |3 |. Q/ @3 o, z控制器結構:
    2 X. A6 t; Z) V% E4 \2 g5 [& l; H
    ( I# v( n4 y6 Y, f4 `; r創建了主要的 LoginController 處理所有請求
    $ ~# V6 K! g3 |  ?0 ?: l保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    7 J* V7 k/ G! H; T9 ^錯誤處理改用CI4的視圖系統
    3 k: }1 J% R- }/ Q! u8 X0 G0 f; S5 d. {) v0 O; k( X

    : S% U! J# x) t! x) a類的組織:
    + |# C6 m" G* g4 P& v) M! b0 U- q9 E4 }1 g
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    + j* k( s1 t5 s7 W/ A- j0 o保持了原有的類繼承結構
    : Z! K5 U; G0 F改用CI4的控制器基類和特性0 r! T! U8 M/ G; c1 i" I' _& r, b2 {+ C

    $ R, I- n/ u- i
    ( S1 ^6 c0 ~' ]- s改進的安全性:  U+ ?7 v+ K; O2 E  t6 d# N
    ! t: ]9 H6 _8 R5 r1 t
    使用CI4內置的安全特性
    6 K& _* K+ \9 X5 W更嚴格的輸入過濾8 `; m- u" d4 D( `+ W/ M3 S! g2 @: X
    更好的錯誤處理機制. ~% K# T& u* C, G6 F% W% V

    2 \6 e0 x: g3 i7 ~: i$ s# S. T# ]) n  @8 r" R
      x/ Q. r1 a6 A# y. v4 M% {* }9 O/ E
    要使用這個新結構,你需要:
    , \4 l6 |9 I& N. x, Z5 U- e
    , k4 O% O2 ?) w8 a4 F將這些檔放在對應的CI4目錄結構中9 c( U  C' [. z7 K2 q5 J
    確保創建相應的視圖文件0 I7 u( d9 C3 n4 X/ x; E& x8 @
    配置語言服務) K7 b$ P6 S- B' e1 c/ ?
    根據需要調整模組檢查邏輯) c8 y4 `; i% W4 L7 p
      K. e5 ?+ q& k% t5 O$ Z
    需要注意的是,你可能還需要:
    1 z0 U& q; P% N  M4 N  w& I" V
    % v5 k# n6 f" a2 v創建相應的視圖檔(在 app/Views/ 目錄下): n) Z4 U0 b0 H2 Q# j" R
    配置適當的中介軟體來處理會話9 J- i- K4 B' f. w8 p2 {
    實現具體的登錄邏輯
    ( |3 ?/ o# ?4 k. D. s$ N/ e! Z5 h4 j  i# T' b
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?4 S  F7 d6 P( c

    6 s9 k$ }" t8 R2 b2 ?7 f
    1. <?php
      . |0 {7 l' a: W0 k/ f6 f. S
    2. // app/Config/Routes.php
        q! ?* a) _5 O; R
    3. namespace Config;
      - ~! I+ x9 L$ e& ^) |6 e8 e5 A1 g
    4. " ^- P$ P5 }& v6 u. ]6 x
    5. $routes = Services::routes();. |& R0 Z8 y* p2 v+ _5 j

    6. 9 i) v: A3 g& [2 [% q2 W
    7. // 添加自訂路由規則
      3 ^0 o" q8 s0 p2 n
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      : h( S) G3 L+ L5 c2 ^0 y! Z) y) o
    9.     $routes->get('/', 'LoginController::index');
      , K! m2 t* b" E7 b0 J' o: X1 V) Y( M. n
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      $ K. N! T, G' a" k: i: g1 R0 j
    11.     // 默認路由處理! a& R0 q: {9 K) @# i
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');2 [- S1 v( x+ W- P1 U- E
    13. });
      2 r0 P2 d9 p* @  |, v8 P

    14. + s9 U( g5 R% T* `
    15. // app/Controllers/Login/LoginController.php2 w6 r0 q/ l" {, O
    16. namespace App\Controllers\Login;, r6 y6 C. [! G

    17. $ O" w; f8 a2 D5 _- G
    18. use CodeIgniter\Controller;5 D8 U. q0 w( O& S% d
    19. use App\Controllers\Login\AbstractLoginPage;
      3 U% y1 r) N0 v; P) K7 r

    20. 4 ]: t8 x4 Y, d' u4 ^5 d! ?# }
    21. class LoginController extends Controller
      ! t& W7 b: m3 U& f
    22. {/ E# K" F4 r1 f' |
    23.     protected $pageObj;
      % z/ L! ?+ r' }7 Q
    24.     protected $LNG; // 語言物件
      / ^% ?* g! m5 S; T% o, v
    25. 2 u" E  p; s  I0 [- @" X" U
    26.     public function __construct()
      & [- t5 U* Y, C! b7 s9 Z
    27.     {4 D% l& N5 |8 v/ h3 e6 U2 [
    28.         // 載入語言檔和其他必要的依賴
      ( l! v9 y- U/ ]+ F. p8 ^0 b3 A  h
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務: G! _+ R  L' O3 @. Z
    30.     }
      ! M* _# J0 M5 @! Y0 J

    31. . |. H$ x2 f# J6 X0 q
    32.     public function index()
      7 z" B" R$ ~3 s5 |$ D
    33.     {$ G$ y( f  m8 v& N6 |/ [$ P
    34.         return $this->handle('index', 'show');5 H+ @3 r# v$ x/ T( V* r. z
    35.     }, ?4 }3 b, ^- l" n$ C
    36. 1 L. }5 p" u7 ~" Q  S4 N8 |  f
    37.     public function handle($page = 'index', $mode = 'show')0 ~6 w; w: y3 r* Q: V$ s3 h4 c) t
    38.     {
      + Q. t% L# @* Y  i
    39.         // 安全過濾頁面名稱' Y. Q- f! N& B/ o- O
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);% {, z5 X0 o# d) l6 d
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      6 N! k" }/ p8 {3 {  D! |! r
    42.         , w# H9 J# t1 R* V  P
    43.         // 檢查類檔是否存在
      2 n$ E* G5 y/ O2 C# k$ o" L
    44.         if (!class_exists($pageClass)) {
      9 A6 s; h" L+ g6 ?0 D
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      0 T! Z; q2 `" D0 r" k7 p
    46.         }1 J' e& [. {1 G$ B3 {/ g
    47. * n7 u% _: ?+ `5 L, c* M
    48.         // 產生實體頁面類
      , J9 N6 E3 {, A+ \
    49.         $this->pageObj = new $pageClass();) S, l8 u6 U* f9 T# w
    50.         
      8 n4 l4 v1 {! d( T3 G; X  A9 f
    51.         // 檢查模組要求
      4 E$ D/ z+ V% U  @  n" [% u
    52.         $pageProps = get_class_vars($pageClass);0 S# `0 _% b+ n0 X9 U* F' l! F
    53.         if (isset($pageProps['requireModule']) &&
      + I- \  h1 j; r
    54.             $pageProps['requireModule'] !== 0 &&
      " l1 H4 B4 Y0 o! h1 P9 M8 i
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      . M3 D1 ^  R2 s0 J' i! g
    56.             return $this->showError($this->LNG['sys_module_inactive']);7 k' x$ v: I- \% p( K5 w
    57.         }' D& Y7 H6 ?8 t% t$ l4 ]
    58. - a/ U; x! }. O1 M; s
    59.         // 檢查方法是否可調用* n2 ?. K- }( @. z5 [4 w2 ^& `% \
    60.         if (!is_callable([$this->pageObj, $mode])) {4 r1 b1 a) ?0 s
    61.             if (!isset($pageProps['defaultController']) ||
      & U: O% Y- g  M* e1 e0 f7 C
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
        T$ R% O( `+ `
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      & C3 T& l1 f4 L% x  `# e
    64.             }
      ( n% |9 j0 y! F% c6 _! a/ E
    65.             $mode = $pageProps['defaultController'];
      , C4 |! r) z7 O
    66.         }1 B, X4 g7 Y4 I8 [2 U! {8 t
    67. 4 i( a( Q0 z4 r0 }' B4 E) ^
    68.         // 調用相應的方法
      / Q* P: b5 u7 l1 q6 [
    69.         return $this->pageObj->$mode();, }- z; m% }! F- V
    70.     }" }2 `9 M. S6 ?9 L4 e" i$ R
    71. # E" @6 w* t9 W, j4 N
    72.     protected function showError($message)
      . w- g  j* @( h% N! H5 c; q. ?
    73.     {5 e: e  ]$ Y8 @& E+ M' O) T
    74.         return view('errors/custom_error', ['message' => $message]);  ~; d7 B. y5 K. B; ?
    75.     }5 n# \* i* k1 X
    76. 8 Y0 t9 M6 e" Z/ z. Q* u5 M' @
    77.     protected function isModuleAvailable($moduleId)- L7 B. B: _) l' K' q: P! }! ?
    78.     {- i: ~+ q7 X( ?) o9 W5 w  T2 P
    79.         // 實現模組可用性檢查邏輯3 L, U; s; ?3 H! B4 N/ F
    80.         return true; // 根據實際需求修改
      ! R- f0 e/ _" o3 ?, U
    81.     }
      2 h. @( r7 C' l" s3 A1 s
    82. }* t% y4 O" ^; N# g- U1 f5 o
    83. * l5 A4 L' T" P# f, K. c+ |
    84. // app/Controllers/Login/AbstractLoginPage.php
      # \* Y0 Z& I/ O3 Q1 e. [
    85. namespace App\Controllers\Login;
      0 x3 f$ }/ ^3 {
    86. ! \* d! q- y6 W) x% f
    87. use CodeIgniter\Controller;
      0 {6 d* Z4 v# n) l) z$ p3 b. b

    88. 9 r5 X6 H* I" O
    89. abstract class AbstractLoginPage extends Controller
      $ j: _1 e0 T# g. P
    90. {
      2 N9 k  C6 T) s5 R" P: m" j; i
    91.     // 實現基礎登錄頁面功能) I6 W& O. K  |# W0 t3 L. |
    92. }" Z5 g  Y" o: q8 g

    93. 8 U. K9 x' r: ]5 q8 D- \# W- i
    94. // app/Controllers/Login/ShowErrorPage.php
      8 }' E6 w6 ]+ D2 m6 R) b
    95. namespace App\Controllers\Login;
      1 }2 g, }8 w- u4 L
    96. ; b0 a& T- \9 `5 L! U/ I8 h
    97. class ShowErrorPage extends AbstractLoginPage
      ( B) J. E6 B8 H7 I  R8 Z! u
    98. {8 B5 c: u  }4 T2 U' w
    99.     public static function printError($message)4 @4 R; i1 y$ W; x
    100.     {
      0 h; R9 T5 Q- C% d% S# M8 Y, H
    101.         $controller = new LoginController();" q. o7 V' B3 m! {- \* N2 N1 a
    102.         return $controller->showError($message);5 X8 t8 L4 @, f- u' N: V. }9 k
    103.     }
      ) u3 P+ m  I! T, N. U+ w
    104. }
      3 m" Y. Y7 \* F2 A2 x* H
    105. 7 X4 h* m" v8 }& H# b4 V: `
    106. // app/Controllers/Login/ShowIndexPage.php; e1 S' {1 D# w7 G
    107. namespace App\Controllers\Login;5 W3 @- z) N8 @

    108. $ R+ r8 B" {% [5 A- c! f/ P4 w2 ]
    109. class ShowIndexPage extends AbstractLoginPage2 V6 c9 `! j( V% |; e- t
    110. {; O# B1 Z7 \& O1 x
    111.     public function show()
      5 `- ]5 w7 V& m3 H6 T, U7 }+ U
    112.     {+ S8 h6 N9 c2 o4 f4 e0 ?
    113.         // 實現登錄頁面顯示邏輯
      1 E1 ~+ C+ ^. m( D" @1 C5 R, }' m
    114.         return view('login/index');
      , |7 k) y! }( w
    115.     }& U1 R$ P* W" H' \) m/ V
    116. }
      ! p# ?# x1 g. e* r( d6 U- t
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-10-10 23:21 , Processed in 0.015114 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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