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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15239 / 15239

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
      q$ }. U/ D+ O) F4 F, b9 Q% N# xAI 就是站長的最佳幫手。
    $ a# c+ s9 ?- K" o/ d$ {1 z2 Z1 b* N; D" B
    : K# @2 q" M+ _* f  R7 l9 R3 K
    這裡的「新架構」是指後端的架構會有大變化' Y% _1 C* i0 I9 p' m0 P8 k  J
    但前端的 UI 介面玩家不會感受出來有何不同
    / r# M( ~4 c/ S- O- N* d; V6 M8 X0 |8 z: q  l7 `
    2 `1 R! |" v3 U+ |2 }/ N
    為什麼站長要改成新的獨家架構?
    . a4 \' r% I( e/ |! N+ z* s就一樣由AI模型來解釋清楚吧。
    1 n" w: K6 V! s6 c" i
      ^3 P! u+ g6 ?7 z/ i, O& @) u4 r7 ^
    讓我分析一下使用純 PHP 和使用框架的優缺點:6 [8 Z7 O2 q2 B/ |# G; w
    純 PHP 的優點:3 Y0 p+ u! u; f/ X
    1.        性能較好 - 沒有框架的額外開銷
    # s6 c; V$ Y5 a# W6 n2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    ' t9 p  z$ f% p  y' {1 S3.        更靈活 - 可以完全按照自己的需求來設計架構2 Q7 j; [, `( [( O, |$ A; _! ]
    4.        代碼量小 - 不包含不需要的功能模組
    2 R+ H7 o" w2 ]6 R. K5.        適合小型項目% A7 z$ r& T1 _% T0 W) N6 T
    純 PHP 的缺點:
    ; q( q1 V( j2 c' {8 t9 T1.        需要自己處理很多底層細節, k$ p+ `: b9 g% C' X! o0 a1 t8 B  t' K
    2.        代碼複用性差
      i4 S# |9 O+ O5 q$ e6 @3.        缺乏統一的開發規範
    2 D5 f" J+ m- V; G, w8 K: p4.        安全性需要自行考慮和實現
    6 m. f6 Q# l+ Q5.        開發效率相對較低- o6 C. s$ M+ f5 c, Y. j
    6.        維護成本高6 T0 n" i& ]. W/ e
    使用框架的優點:
      m9 A- e7 h) v4 O) k/ \+ a1 W1.        開發效率高 - 有現成的元件和工具
    " h0 u0 R! ^2 a7 r2 T2.        有完善的安全機制- q$ ~) H( V7 S$ n0 l( }, x5 e
    3.        統一的編碼規範# }' r; J$ w- q. N
    4.        易於維護5 `+ _: C% w7 A6 n8 K  A" s: b
    5.        有活躍的社區支持9 L3 _) s% }( b3 |, D) @7 I9 I
    6.        適合團隊協作, o1 t6 p4 [) `) g% [: H3 d- @$ }/ ^
    7.        自帶很多常用功能(ORM、緩存等)
    , X# x" l/ T" D: K* f使用框架的缺點:
    ; E5 D, z2 Y8 v& `/ R1.        性能有一定損耗! ]( u; }( p6 J' C
    2.        學習成本較高" q/ f. O+ Z' z! f/ x9 d
    3.        可能包含很多用不到的功能
    ' N6 ~2 C+ f% M4.        不夠靈活,需要遵循框架的規範; a- E  B7 `+ y8 |0 `
    5.        對小項目可能顯得過重
    $ o8 @# f9 n1 A5 d0 p7 {( ^+ b3 Y' ]建議:8 C; X: s0 U% @/ s' \
    1.        小型項目或學習階段可以使用純 PHP( P% c/ P- F; z
    2.        中大型專案建議使用框架
    1 Y' n  y& Z8 i# a3.        選擇框架要根據專案需求和團隊情況
    6 L% @& F5 J, C2 ^2 t5 h9 ~4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    7 p8 e* B, E( g, ]& ]您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    1 m0 [2 U9 R5 v0 ~9 d' W" i6 i7 p, a0 ]
    2 Y7 O4 k9 Q0 @2 e2 W; v

    ; W: e7 a  T6 ?" D我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。$ ^0 @, t3 G: T- H9 ]
    & C7 X& d; B/ F0 m. j
    這個轉換主要做了以下改動:; |% R& t- }& ?: g
    2 }2 P; A( R1 T2 H& H. H; x
    路由結構:; ]8 l+ k- ?- T, m" W/ ~$ `
    0 n& c. K3 t& E- [  L6 _( V
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    " N6 K% h4 n* w$ o& x支援原有的 page/mode 參數結構
    & u: R: P0 r- l1 g* Q4 u6 D通過路由規則自動匹配到對應的控制器方法
    + W. s, c, G/ b3 w' V) g( x
    4 [% a& K) A8 J' w$ E7 G9 t9 o! l% t  S0 V" Z
    控制器結構:0 J8 a  b1 g# J2 Z% f* L

    4 J- W% I6 C% ~9 K* Y, k創建了主要的 LoginController 處理所有請求: f1 p1 {0 a% z3 b
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ q, t6 Z5 L/ b  d$ a8 {
    錯誤處理改用CI4的視圖系統
    ' g2 Y, \) G5 V0 @% F  t; K- A2 o- }- b, g+ S  r% q1 d' V5 F, w

    $ p) X0 ^) `" d- b  p9 V類的組織:
    . ]! g+ ^$ O2 W% z  g) K
    8 q, _# c* k0 `- Q  a9 b所有登錄相關的類都放在 App\Controllers\Login 命名空間下! L4 g8 h* U% ]1 D2 i
    保持了原有的類繼承結構
      d2 {" Q& n9 R. m, i2 ~改用CI4的控制器基類和特性. h/ @: E8 k0 m
    ; u$ o& S  A' w
    7 |3 |; V$ x/ y- ]+ ~  t
    改進的安全性:
    6 b* S! \. e/ {( P3 |2 q9 \8 B9 N1 G. U* H: N) q
    使用CI4內置的安全特性  [1 J, ^- n; O; G5 D1 K7 J% p
    更嚴格的輸入過濾
    8 |9 U* J9 b% o- \1 }9 W3 N更好的錯誤處理機制
    # l1 F- I( @3 |8 a
    ; }4 c. f8 V/ m$ [; V$ _7 G/ E: p
    ! n; D: _0 I& s$ f. N- U" q$ e0 @! m$ O: ^% |: u7 b  p+ p1 S
    要使用這個新結構,你需要:
      @+ _- N4 f" {8 e- v' v) X1 O' |+ P1 E
    將這些檔放在對應的CI4目錄結構中+ Z8 q" q( J4 `& i1 v6 h
    確保創建相應的視圖文件' @+ a, C+ h+ L* C/ L& y0 b; _( c
    配置語言服務4 z, J4 h: G+ P: F  K$ z. h) X2 `
    根據需要調整模組檢查邏輯9 V- ?0 J; V: p, }' T# u$ v& E9 I
    ! T7 x5 S5 t/ D% x2 f: i# [5 ^
    需要注意的是,你可能還需要:
    , ?7 q' j( `3 I. H$ Z' N! E; O% ~* O9 F9 L3 Q" g5 m
    創建相應的視圖檔(在 app/Views/ 目錄下)$ k' o4 ^: c( R) `- h3 v# r! V
    配置適當的中介軟體來處理會話
    : K) T, S3 p9 j1 W$ H6 Y3 P/ m$ B實現具體的登錄邏輯
    7 o0 k% C% w5 k9 w0 \
    ; h, l4 ?9 F. h; ]1 V- o/ P需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
      |" ]# a+ Q% E6 Q/ z7 H( N, m# o1 z7 G$ b8 A/ Y7 X; T! P7 E
    1. <?php1 R3 _, F7 r) b. r( f
    2. // app/Config/Routes.php
      % f$ D& J, i, ^5 e' m
    3. namespace Config;1 U4 \2 B, |1 O! _

    4. 3 s; `- A' M- o& n9 f  c9 D- n( @9 n
    5. $routes = Services::routes();
      . C: K" G4 M& _' t
    6. 6 R8 \7 B! U( U8 k1 u% \
    7. // 添加自訂路由規則
      $ p2 ?; p8 M" C6 i
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
        B2 E; s- a  c3 W9 y9 A! d
    9.     $routes->get('/', 'LoginController::index');
      2 B+ s, A  H+ L. n1 T7 o
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');) {/ k! G  E8 ^+ \7 d6 A1 l
    11.     // 默認路由處理
      + _1 Z" D; S& |! ]) h
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');6 ~& S, n; |" P9 D( L
    13. });
      3 d7 p* y- n$ e2 }+ H" s
    14. ; J% W! r3 B$ `7 {' N5 [
    15. // app/Controllers/Login/LoginController.php# f, W7 i: \% ~% h# Z
    16. namespace App\Controllers\Login;3 a. ^" z4 g9 r1 p7 _# p
    17. 0 L+ E; _' T6 s+ l0 e1 K. j
    18. use CodeIgniter\Controller;
      % L& N  ?' g- ~0 @( n( |# x
    19. use App\Controllers\Login\AbstractLoginPage;
      " |/ q( B2 @% g1 x9 P% j2 L
    20. . @+ G2 e1 H$ s) V$ d( c
    21. class LoginController extends Controller* q0 y$ j5 I! y# ?5 k/ N1 O
    22. {2 z6 S9 R- ]0 p
    23.     protected $pageObj;) E7 g0 {. H. p9 g0 N, F/ e" s' h$ y
    24.     protected $LNG; // 語言物件0 `3 ~7 L! |' n) r: h

    25. ' A# e4 O* S# O: l: W
    26.     public function __construct()
      0 W# m3 Y% ?7 P, L
    27.     {
      / P" X1 J9 ~( @. C. {
    28.         // 載入語言檔和其他必要的依賴, g: B( Y8 r; @: ]) w/ W: x, K
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務# w. f/ S2 x( i9 Q8 ]
    30.     }5 b; F, Y* |8 {3 M8 M/ Q) j
    31. ! p$ {7 I$ t5 z; B9 s2 |
    32.     public function index()
      & g$ Q: M- D1 `  j: P6 d
    33.     {
      + t1 X7 n7 H3 _( d! {
    34.         return $this->handle('index', 'show');8 I9 `8 l# U0 _* R% l% U
    35.     }
      0 c: J& b, y6 ~2 |" N7 F& q0 d/ P

    36. ! Q' _  p9 F. }$ c8 a
    37.     public function handle($page = 'index', $mode = 'show')8 E  ~. b6 A. ]; `- b* `5 b
    38.     {; {" {. l" p% U) s
    39.         // 安全過濾頁面名稱
      5 w+ G8 @. R0 @' Y
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);/ u6 o* s5 e0 I% @3 ~. ?! }
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';1 Y0 w3 j2 @" ?# [
    42.         6 V. [& b5 h1 I3 d7 H
    43.         // 檢查類檔是否存在
      8 T# l! C( R, R4 W. Y
    44.         if (!class_exists($pageClass)) {
      . ^" {0 Q* ^. y' I' F7 n
    45.             return $this->showError($this->LNG['page_doesnt_exist']);3 {+ H2 J( H, ]5 S7 n, t; _5 Y
    46.         }9 f& B1 f, z! k; N' @/ l: N8 O5 S
    47. ' z- S- n* j5 h' U+ {  E
    48.         // 產生實體頁面類
      / R" j! R2 Y0 s
    49.         $this->pageObj = new $pageClass();: R& {9 d1 B# k# O4 W4 n
    50.         ' ]2 d1 e3 O2 J6 u
    51.         // 檢查模組要求9 d* T3 s# r- z! Y
    52.         $pageProps = get_class_vars($pageClass);: ?- J& |  [2 f+ i* ~* R0 k: H
    53.         if (isset($pageProps['requireModule']) && 2 ~$ `6 L+ L: ^
    54.             $pageProps['requireModule'] !== 0 && ! f7 _$ ^4 X6 O# `0 f
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {3 z! Y) d7 p7 S7 g- q4 X
    56.             return $this->showError($this->LNG['sys_module_inactive']);! Q. Q$ w$ l* u9 I4 P# c5 H& T2 v
    57.         }
      2 e+ H) E4 K3 B. p" P

    58. - [. _7 U- W9 w4 Q, H
    59.         // 檢查方法是否可調用6 R) j0 H, F7 h, Y
    60.         if (!is_callable([$this->pageObj, $mode])) {
      , A; h* m7 x8 _, N: n
    61.             if (!isset($pageProps['defaultController']) ||
        o/ X* d8 M7 s
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      7 p8 h0 H# p% N: v8 C# J
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);4 @, R' y/ B7 ]4 x; E4 L% g
    64.             }& |: e0 ?/ m5 f" l3 W
    65.             $mode = $pageProps['defaultController'];4 O2 u9 T+ H, |
    66.         }& |/ I" Q$ Q7 \6 b3 ^# S5 U" L1 z
    67. 9 ^" ^* V1 M) z/ ]
    68.         // 調用相應的方法
      5 B9 o9 T. Y; R* [) s
    69.         return $this->pageObj->$mode();
      5 O7 ]5 [4 a: k! D/ F
    70.     }5 b  C. B/ q0 \) L: w* a9 u" B6 Y7 a

    71.   r" q" w% z  R$ c- H: Z) o. w! E
    72.     protected function showError($message)
      - z! ~' ~1 C& x, N9 t
    73.     {3 A1 s: A* e4 m2 A% w: N1 {
    74.         return view('errors/custom_error', ['message' => $message]);
      % I9 ^( D4 P1 L. o: h
    75.     }
      5 V; k" J8 V. x3 G9 U% `
    76. 4 H' B& H8 V7 t2 ~4 C
    77.     protected function isModuleAvailable($moduleId)* {3 M1 ]3 p/ Y
    78.     {
      9 k3 n& K  P* u5 }) x5 l
    79.         // 實現模組可用性檢查邏輯
      8 P! ~( q" M, l9 |
    80.         return true; // 根據實際需求修改+ o  L, d' {8 z- c* E# M1 d
    81.     }2 w& H# Z8 V2 Q6 x% m
    82. }
      ! \3 G9 J7 t8 n2 `+ v6 V, N) S
    83. 5 R# n. X! A$ C% p$ X/ l
    84. // app/Controllers/Login/AbstractLoginPage.php
      1 b1 |( ?" w: M
    85. namespace App\Controllers\Login;- P4 H$ H& C/ |# g9 d: a. }: h
    86. & {+ z8 u! U+ N2 V  Z  K
    87. use CodeIgniter\Controller;
      ; t6 X6 B& e' i  ?
    88. 3 l2 W* }& |7 Y. ^
    89. abstract class AbstractLoginPage extends Controller% j6 ^6 O# U$ e9 J3 ]( n
    90. {- h! @5 q3 D' O  Q
    91.     // 實現基礎登錄頁面功能
      1 K, ]  g8 ~+ M7 x7 w
    92. }
      ! d0 N6 S" e( d$ _4 x
    93. $ z+ g" d& O: J! Q7 x6 L/ G% s1 Y
    94. // app/Controllers/Login/ShowErrorPage.php7 F. b6 h, ]9 o
    95. namespace App\Controllers\Login;
      3 C0 g% }# T0 i$ Y' F

    96. " r5 e' e7 ~6 q+ w+ B
    97. class ShowErrorPage extends AbstractLoginPage/ O  \$ L4 ~% s- F  A% W
    98. {7 q" O3 r+ h/ x; U
    99.     public static function printError($message)9 o* N3 `+ c6 Y
    100.     {
      & _& u3 H7 P6 d, I0 u
    101.         $controller = new LoginController();
      # [7 b3 H0 F: l+ v1 S% s
    102.         return $controller->showError($message);
      # S+ j- l8 n# \5 F
    103.     }
      " Z* m# m; _' S" P3 g1 F, g2 S
    104. }7 ?% F$ k( z. A3 i' E: V

    105. $ q1 G+ G, ]2 a: Y
    106. // app/Controllers/Login/ShowIndexPage.php' g3 W0 n: o) g4 q: N
    107. namespace App\Controllers\Login;0 h  R$ |" @! Q9 o6 M

    108. ! K2 I; Q7 K" [* J4 w
    109. class ShowIndexPage extends AbstractLoginPage4 A0 y$ @0 J( ^5 y5 J4 y$ x" Q
    110. {
      4 ~! b0 N# d7 k: e9 c7 P
    111.     public function show()) Z; o) C1 P+ O7 f- p' H" R
    112.     {8 B' h% t# N9 B! x
    113.         // 實現登錄頁面顯示邏輯5 |  u( K7 E$ u' x, j% h! t
    114.         return view('login/index');
      ! N; U3 F/ }- g* o, b! s5 ^, k  X/ V
    115.     }
      # i+ w% J, a* a& {" Z
    116. }
      % t( P* p5 m' q) ]
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-10-20 15:01 , Processed in 0.013765 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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