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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 247

魔法值:15278 / 15278

生命值:7%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致! M) f% ]& r8 `0 s' l% X
    AI 就是站長的最佳幫手。
    3 D  n! P% j+ R3 o* }7 F( r% t# h1 w& u  i- V
    / a" \' n: ]. d& z' V3 k
    這裡的「新架構」是指後端的架構會有大變化2 k6 X" J1 F, W$ J5 e, |0 B
    但前端的 UI 介面玩家不會感受出來有何不同
    - K: s7 F2 C( R* y
    8 l) ?9 ~- R% L: Q8 d4 H" s$ O8 W8 Q5 d! i0 @. @; x
    為什麼站長要改成新的獨家架構?1 B, q$ P( Z) [% v/ Z- Y
    就一樣由AI模型來解釋清楚吧。; \1 D7 A# D! r

    . [" D, m  m! q  B
    1 W. F7 H! u* G) h4 t4 q4 j讓我分析一下使用純 PHP 和使用框架的優缺點:/ U0 [! C  d- x! c2 p
    純 PHP 的優點:
    + ^8 F& |; F, u7 F6 h5 |; S1 N1.        性能較好 - 沒有框架的額外開銷
    . y! @( V! F5 Y; {7 s# E2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    9 X- z6 P7 n& u- j+ p- c! w5 `3 E3.        更靈活 - 可以完全按照自己的需求來設計架構7 N- M* _, A4 E' h/ _
    4.        代碼量小 - 不包含不需要的功能模組
    3 ~* u$ t3 E" R3 X$ z! E% d5.        適合小型項目
    , `- y3 s( T5 E純 PHP 的缺點:8 w: b. u1 A6 P0 X' k2 S6 a
    1.        需要自己處理很多底層細節
    + q1 ]0 \) X- s' E2.        代碼複用性差0 {' u2 Q: G/ x& @4 ]( f
    3.        缺乏統一的開發規範
    1 U, b: w! Y5 B6 }. [4 m4 A0 F" c4 d% D4.        安全性需要自行考慮和實現
    $ e4 M. q1 p: S( N5.        開發效率相對較低
    & I+ \0 R& a8 P& T8 M6.        維護成本高+ G: N1 [  y( u+ O) v  n
    使用框架的優點:
    : Y/ S! e9 d& C7 k0 }6 q: m1.        開發效率高 - 有現成的元件和工具" O, f7 f8 J: H% d! k  Z$ \
    2.        有完善的安全機制; q5 }9 J- I& D- u6 k/ G
    3.        統一的編碼規範
    6 e$ ~; |: ~3 ~7 M- G2 t4.        易於維護' I3 R5 n9 ]! \  X7 H7 ]# E: q
    5.        有活躍的社區支持
    ' R5 \5 c5 f. e, ~6.        適合團隊協作5 R7 X; U) O* V& p. V4 U, B; k0 M) H
    7.        自帶很多常用功能(ORM、緩存等)
    1 n/ r$ [. ]" x- V/ H8 n4 I- R使用框架的缺點:. B- c- m, u3 b: g% h2 d3 Z, V
    1.        性能有一定損耗8 N9 Y  q* p. w6 Y. s
    2.        學習成本較高
    0 L+ `, G# d' n1 f8 e, |% j3 i3.        可能包含很多用不到的功能
    4 Z( d& U0 ?% k6 @, h9 r4.        不夠靈活,需要遵循框架的規範
    : G7 U; c+ |8 j* S0 a4 d3 l5.        對小項目可能顯得過重# t) c- r& |8 t5 w- U0 A5 g
    建議:8 T) d+ `9 I' C% A
    1.        小型項目或學習階段可以使用純 PHP9 I. a2 \; w6 w$ A3 ^, ^( ~
    2.        中大型專案建議使用框架4 R% [. i3 S5 P; t" M8 o0 B
    3.        選擇框架要根據專案需求和團隊情況
    3 Y1 m. K) L8 o3 W9 d9 G4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    $ H" }1 e2 I( H* e- U6 H您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 Q( D! n: q0 W' w3 L

    5 |) @% J  e; P$ ~8 L) A: w3 N8 p3 q* r6 ~7 @: J1 B* h$ ]$ ^6 j
    # |! f$ w) r6 N+ E7 e& K3 H5 w+ |
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    ; n/ D# ~% S# O0 ?9 {# m  P  e& ]" |
    9 I7 e+ u. W: w1 n這個轉換主要做了以下改動:" l. p2 L( d: n  c# i" }
    # a; a: T% j! e3 Q" j* Y
    路由結構:
    0 B" v6 Y- P; {! Q
    " E  I3 x, X2 s+ C8 L使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下  b/ r! k/ E: ?
    支援原有的 page/mode 參數結構
    0 o+ I: V- \! z, N- x7 R6 i/ u通過路由規則自動匹配到對應的控制器方法$ d. C1 e4 {" p( O; @1 K: v6 Q. d

    + m0 {# g7 d3 V# X! L5 d5 X* p8 g4 Q$ c0 t! |8 d! ~1 ~
    控制器結構:! O% |/ _6 Q* `/ ]/ \

    8 j+ m, O* }: d* s創建了主要的 LoginController 處理所有請求$ w: v, }% d* Y4 {4 h/ ~; Q. I
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ K/ T5 g( P6 Z  o$ r# ]; }
    錯誤處理改用CI4的視圖系統9 c( V- ]7 \' l8 i4 `; v. L
    ( i3 r0 A& @/ m; X" i- j% x$ P
    0 b* K. z( h5 d- U
    類的組織:2 x( ^7 r, g0 I" U
    * M; U4 K$ S: r6 L, B
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下/ w/ \# J1 ?+ d9 w; ]
    保持了原有的類繼承結構5 v' D! C  Q" T( @3 C
    改用CI4的控制器基類和特性
    : w5 e9 z" U0 [# k8 X0 l0 x$ L( ^! }) \( J6 Z- u8 D# g% _# E; L: L
      w4 }% {3 ]1 C0 u4 l3 {- `- H
    改進的安全性:9 w9 Q- d& E. S, J4 L

    ' S+ ]3 x" l; o/ v使用CI4內置的安全特性% A, z- ~9 ?/ b6 @% j, k
    更嚴格的輸入過濾5 X9 u7 N  q) H! V% A- W! l
    更好的錯誤處理機制( x' p) s+ O: @& Z8 r* v
    * P$ F5 X, V% ~; Z8 d

    . ?: ^/ O1 c$ }) ]3 l
    * D; ]5 |6 k) n8 R& K6 }要使用這個新結構,你需要:
    : ?' w" |: q8 w6 T' P6 Z: q1 w' ~6 R* s0 x5 j# m" i
    將這些檔放在對應的CI4目錄結構中% H% [7 M& f  |" d! g( V  J/ u/ \5 B
    確保創建相應的視圖文件
    , `# i! B' P+ o$ H* @0 D配置語言服務/ I9 r8 w" z3 i
    根據需要調整模組檢查邏輯
    : ]4 t* c  w1 {1 S8 U
    & T7 H. \+ I% \: A, _需要注意的是,你可能還需要:# z1 J2 U7 ~; @4 z& H5 `
    2 O; C! b  \# l  m9 z( {' {
    創建相應的視圖檔(在 app/Views/ 目錄下)# m  H. D9 U. u& c# Z% T, L9 \; t, X) u
    配置適當的中介軟體來處理會話5 _4 a% l+ o! M
    實現具體的登錄邏輯1 s) [6 x) S6 u

    1 |$ C4 a6 S' h/ A0 F  R需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?) S3 V* z9 K/ _3 a, y8 ~
    1 ]" f# u7 h4 `* V0 t) C
    1. <?php
      3 Z/ B" G4 Z, _/ Q6 U; |3 }" |
    2. // app/Config/Routes.php
      6 h' d% K$ q+ h! S3 H1 U7 }" j+ e9 q( D
    3. namespace Config;
      ! I4 O8 V' z8 {

    4. , s$ j& v% a! }# M$ v% g
    5. $routes = Services::routes();9 B9 b6 I6 N) d! ?' [9 m8 F- k
    6. - Z& ?" B  f3 h$ E( K
    7. // 添加自訂路由規則/ H  s8 p, d2 ~
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {$ ?' P; T& X! A% U, v) |4 d. s
    9.     $routes->get('/', 'LoginController::index');- c4 I# _% q2 ^2 o
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');0 I* j- ~& y% w% I" ^
    11.     // 默認路由處理
      , r3 t1 g6 k+ r& ^
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      # Y6 z" l& r6 Y" f& |; A+ X. f
    13. });
      6 L: K; C0 `' Q- h1 d7 V
    14. ( ?4 [% s# J& T, p8 _
    15. // app/Controllers/Login/LoginController.php
      4 @" M( X' a& l# h
    16. namespace App\Controllers\Login;; e! N/ _9 `8 N' v- Q9 ~
    17. ; X/ Z6 K" C; F' n6 M5 j7 W( c# \
    18. use CodeIgniter\Controller;6 A+ d! |# m( A& A, ^, Y- m
    19. use App\Controllers\Login\AbstractLoginPage;' K0 T0 l& O; h. `' A2 k* K

    20. - J% ^$ c9 k1 N' S2 D  D
    21. class LoginController extends Controller
      : x, k/ m% |0 y7 A5 I
    22. {" I" E- `6 I1 y: P, V# \
    23.     protected $pageObj;7 L2 s2 q* f4 z$ [2 W
    24.     protected $LNG; // 語言物件
      # ?6 P0 c  o" `" s  A
    25. & p3 f- e8 y% @+ p& U; x
    26.     public function __construct() * Q2 X4 P3 _4 @2 Z' D
    27.     {
      ! e6 c" t1 G$ o/ |. d
    28.         // 載入語言檔和其他必要的依賴0 e" ^1 [6 \' I, N! V- U2 J
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      , M3 L: X' R1 Y6 p. D6 [  b( S
    30.     }
      / ?6 z) b7 c+ {/ G' h
    31. 2 }, m+ n0 V# m. y
    32.     public function index()
        |% v8 ~9 m7 D# \0 ~
    33.     {
      ! h9 g" I5 x) k  c: \' j
    34.         return $this->handle('index', 'show');- w- J5 T8 e: c% D
    35.     }
      - P( p- w/ L& l8 i" W

    36. " R& ^3 L4 K: }) E; s
    37.     public function handle($page = 'index', $mode = 'show')
      5 k1 f* z2 [2 ^; W8 t/ ~8 |9 b: S
    38.     {
      . G0 R( S: m6 p2 U
    39.         // 安全過濾頁面名稱
      , D) y7 C0 |# Q, H' x* ?0 i, \
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      ; G1 ~2 @7 Y. F% [3 H7 S
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      2 S0 O! {3 v2 {1 w. k" [2 M
    42.         8 e' G% z2 M. @  |5 s! o
    43.         // 檢查類檔是否存在( I+ E$ {3 u  C0 Y8 j
    44.         if (!class_exists($pageClass)) {. T" S( G3 G2 x  T. N
    45.             return $this->showError($this->LNG['page_doesnt_exist']);0 g/ C$ R" D8 ?  X. y4 l
    46.         }: D& ?& X3 l( H) G

    47. ) g% ]- M$ R: [$ n& v/ Q
    48.         // 產生實體頁面類
      1 Z8 o) H% H" d6 [6 T  T
    49.         $this->pageObj = new $pageClass();
      * o! r) Z3 M( I$ j
    50.         5 E6 e, `( {0 s1 G
    51.         // 檢查模組要求
      2 ^/ F6 `3 V% Z" q& k
    52.         $pageProps = get_class_vars($pageClass);& b4 t; ]2 [0 ]3 x6 a+ n
    53.         if (isset($pageProps['requireModule']) && ( f( T9 T, \: A2 ?% g& D! \
    54.             $pageProps['requireModule'] !== 0 &&
      0 K. B5 w0 Q/ c- ~! r# j: g
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {, i' [! j0 ?3 D! Z
    56.             return $this->showError($this->LNG['sys_module_inactive']);4 \) o! s/ b0 {' h& L) t( Q- Z. B
    57.         }
      3 y+ A6 K/ S# r7 V, B
    58. 4 L4 t6 {* i3 K+ ?9 `2 i
    59.         // 檢查方法是否可調用( _" M& K$ J* y8 W+ W) k1 B
    60.         if (!is_callable([$this->pageObj, $mode])) {
      1 L6 a- |- g' j. \1 t
    61.             if (!isset($pageProps['defaultController']) ||
        M# Z) i+ W: K" R9 W
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {- o) W. d7 h3 q  l9 n
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);/ t& [' Y: A6 f( g5 |. r
    64.             }% L" ^( E' H% N  W* {% D6 J
    65.             $mode = $pageProps['defaultController'];
      ( Z+ Q1 m  X6 r2 U/ B: d
    66.         }
      * |  ?, U" \% E9 w! C) p

    67. % b4 l+ {0 d* g% @# ?
    68.         // 調用相應的方法
      4 z' g( a7 G5 Q
    69.         return $this->pageObj->$mode();0 i+ c4 j9 z" O3 P7 V
    70.     }4 Y4 Q8 R8 [: M9 |* y4 k4 v& x
    71. 1 D" p1 r6 e! c( G/ D; }
    72.     protected function showError($message)
      ( H. S1 a7 s( ?, G
    73.     {
      ; F$ \: A/ V7 h; `* T
    74.         return view('errors/custom_error', ['message' => $message]);
      4 j# V3 z" X1 V7 }: K) [; J% Y; H
    75.     }
      9 o2 k$ v& C7 X8 f  Z
    76. ) z* k/ S! \1 U' m; o. j5 p
    77.     protected function isModuleAvailable($moduleId)
      , }, M: o# F( D
    78.     {' h; z6 ^9 m* @( G% z
    79.         // 實現模組可用性檢查邏輯3 i4 t# ^. T! g( S6 x
    80.         return true; // 根據實際需求修改0 b8 {! C0 l' B3 w4 o
    81.     }( _( z/ Q7 g  V" y1 f& a
    82. }) V% Y2 _  J0 c5 L; ~' G& a) {
    83. ! ?& P" {- c9 v9 v' ~7 V
    84. // app/Controllers/Login/AbstractLoginPage.php- p, z( t; Y+ f# |
    85. namespace App\Controllers\Login;
      / o4 S6 S: W5 w" |6 c5 f
    86. 8 I6 [. ^$ S# F5 B8 A
    87. use CodeIgniter\Controller;# W" j5 a4 {3 O! v( t9 J0 W

    88. 4 C% \, c! M/ D# J0 V/ O
    89. abstract class AbstractLoginPage extends Controller
      2 w, y9 D& A$ M% h  F: l+ V7 N, D1 x# B
    90. {- c8 R  H: Y1 V3 V
    91.     // 實現基礎登錄頁面功能
      3 J9 A# o* I8 g2 }. l! n1 Y) b
    92. }
      , w0 G1 P- `# k/ \% j) y' y. X, A
    93. # L( c! {2 @% n2 u5 ]* D
    94. // app/Controllers/Login/ShowErrorPage.php6 f7 t, D. e% P$ v% R! x" G  W" c
    95. namespace App\Controllers\Login;
      % d" X2 P. J# m3 }& V# c
    96. ! x2 k0 F) _, O1 X) B0 d, K* s' R0 b
    97. class ShowErrorPage extends AbstractLoginPage) Q' A0 j- f1 W1 Z1 o, X
    98. {
      * g$ @  t& ?9 K% `+ `# B' d) k' M4 P8 I5 Y
    99.     public static function printError($message)
      2 I/ j- _, z& {4 d9 U7 W
    100.     {5 d0 ~- }: n+ ?7 W9 i. s8 Q
    101.         $controller = new LoginController();& b6 r( W8 L" |, w+ e* }2 @0 z
    102.         return $controller->showError($message);
      " U. v8 m5 A3 h( l
    103.     }/ w: h& m( u: d6 i6 r4 E8 V' j- j
    104. }
      , k5 l" s- y' M

    105. ) o# N+ `0 M+ U$ a3 v4 A( i
    106. // app/Controllers/Login/ShowIndexPage.php
      % c$ }' Q  O4 h" g8 g$ @4 H
    107. namespace App\Controllers\Login;
      - P7 L8 H" ]  P5 l8 v2 ?
    108. 3 `' r" k( ^. y
    109. class ShowIndexPage extends AbstractLoginPage( D; j  A  ?1 Z, x6 D
    110. {+ W  ~" u4 ]- m8 q6 F
    111.     public function show()3 i' b9 o  X- m+ `5 S: x& \
    112.     {# a! H6 t) W; ^6 T2 g! e
    113.         // 實現登錄頁面顯示邏輯
      ; \+ n8 F/ ?  Q9 W9 O3 l& E0 Q
    114.         return view('login/index');
      / y8 a6 i. G' }4 H- _7 c) H  J1 r
    115.     }6 s8 ?+ q" N% ~' M0 j
    116. }
      ! ?0 |. z! U9 p6 a
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-11-3 15:57 , Processed in 0.010601 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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