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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14899 / 14899

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致+ N" d& Z4 j8 b5 ?6 w; x
    AI 就是站長的最佳幫手。
    ) u/ o0 _( Z8 h& s+ T8 x% s
    ( d4 y! x) R: Z) y6 s7 l5 a
    8 u4 T3 f& A4 Y8 a- ?! b0 ]* G這裡的「新架構」是指後端的架構會有大變化
    ; v, b4 u; ^* o. q0 z$ P* u  n( q但前端的 UI 介面玩家不會感受出來有何不同+ B0 W3 X$ S/ I# t
    6 F. U/ c$ z3 X9 a

    8 t# y* P2 ]5 s0 v2 ^# Q6 D5 i為什麼站長要改成新的獨家架構?, N' _/ ]2 \- o" m' w& y
    就一樣由AI模型來解釋清楚吧。! l5 ~2 A+ L4 T7 _) v3 g5 `( M, W
    / R; W2 U% H  J0 c6 k

    % U* n. ~+ @9 M) A讓我分析一下使用純 PHP 和使用框架的優缺點:% X5 U# E6 M" R9 V
    純 PHP 的優點:5 o( B' a6 h8 `5 N
    1.        性能較好 - 沒有框架的額外開銷" u0 _% g: X  X5 e, A! E. A
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識5 v8 i5 |% ?+ k* x7 i
    3.        更靈活 - 可以完全按照自己的需求來設計架構' i: \/ N5 a) |% I1 H% v+ i( u" A1 p
    4.        代碼量小 - 不包含不需要的功能模組! \! f2 b2 t$ J, N+ K! Y
    5.        適合小型項目8 D" t0 `  }5 W/ r; H' I
    純 PHP 的缺點:
    4 K! u: b7 {7 Y; n$ _" J3 d1.        需要自己處理很多底層細節" p( Z* I! D5 C" p6 o  H
    2.        代碼複用性差
    5 g5 L  r3 f0 n: B3.        缺乏統一的開發規範* }6 h/ l- i, ^# k
    4.        安全性需要自行考慮和實現( F7 M# D) t4 u! M+ k. s
    5.        開發效率相對較低
    : n& M# h( Y3 E. X) r6 ^6.        維護成本高( B) e8 f7 @  q( v* j) H' y
    使用框架的優點:
    # }8 W1 _8 {' z' W9 n3 p9 ]1.        開發效率高 - 有現成的元件和工具. z+ l0 I2 C; a1 h! J
    2.        有完善的安全機制
    ' |& F4 U5 f4 O7 b4 g' W! u9 Z3.        統一的編碼規範
    ) [8 {. Q' J2 r8 z" W# f4.        易於維護* h  J! O2 B" T  C) Q
    5.        有活躍的社區支持- y0 |8 i& D; b( Q3 g% Z
    6.        適合團隊協作5 |/ Z+ K8 @' w+ T6 z
    7.        自帶很多常用功能(ORM、緩存等)7 L/ s% ]  h3 W* d* E0 ~
    使用框架的缺點:2 b' U- B; V* \8 t6 u
    1.        性能有一定損耗' b0 u7 G7 }) ]. M
    2.        學習成本較高
    2 L; X& U3 E) |1 \8 u3.        可能包含很多用不到的功能. ?& f/ {3 f/ x/ v
    4.        不夠靈活,需要遵循框架的規範+ t  K  E: c" W" d# ^
    5.        對小項目可能顯得過重# r; a" V- _& G  ~" X
    建議:
    % b7 x3 }( F# B1.        小型項目或學習階段可以使用純 PHP
    ' M: @" ?# _1 Q3 ~- ^$ t4 d2.        中大型專案建議使用框架
    4 s5 A" j& S* w1 s; J0 C3.        選擇框架要根據專案需求和團隊情況* f; q8 Z: }3 d- H- u* K
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇. m4 t) K& X5 @9 O: L/ V) R
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    & o; @& j6 ]6 q4 \( x7 a  Z# c0 D! L( K

    , h/ p* b1 S6 B4 V: U3 M% @) |' t
    5 I$ m  l# J7 Q. g3 O# [9 V3 m6 u我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    # J% Y% Y- u( f; S
    ! u- {2 m- y- R# g& u& `這個轉換主要做了以下改動:
    $ N3 a$ o5 }  y/ _% \$ ~) ^: @, K) G" P5 r
    路由結構:
    , K# p4 o$ D3 h: J# I
    2 J+ z  Q! }- I- m- p2 l使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    & v' M! t# ^; R7 O" a支援原有的 page/mode 參數結構1 y# F. ?! `$ e2 X! G
    通過路由規則自動匹配到對應的控制器方法
    * b+ p* ^/ z: |9 k  X6 o  I- J, M3 Z. R! `

    ! d. B% z/ |$ X& r: ~2 ]控制器結構:6 h  r  ?! W( M( [
    ; g" b) S* _0 y0 C
    創建了主要的 LoginController 處理所有請求
    , I3 j- Y; Y  F6 i4 M# g3 d保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    1 H) e/ `/ B3 y錯誤處理改用CI4的視圖系統5 x% J7 i: K1 M8 h, z" S
    , z" \+ ~" T( C0 c9 k

    6 ~; t2 o0 w  @- i  M7 f3 M類的組織:
    % t8 j% Q9 d) v, o- e' y* Z/ Y
    " c6 f! ?9 ^" z所有登錄相關的類都放在 App\Controllers\Login 命名空間下4 z: ?0 R' g5 [0 B* Y2 s# S
    保持了原有的類繼承結構7 L& n5 n4 Y& x: a' }4 \
    改用CI4的控制器基類和特性
    & K* b# [* U% J
    4 r2 u) K+ y% Z( A
    - _7 l8 K: J' l# a改進的安全性:
    ; I9 a9 w6 t+ Y5 u7 |
    ! x2 g. g$ H1 I) b# s' b  W( V使用CI4內置的安全特性
    9 _9 h& C4 j  `$ A  z. l4 M更嚴格的輸入過濾
    7 x# F8 }6 v( ~) E更好的錯誤處理機制4 V$ ?3 b' c; |3 ?4 U& |
    8 h# N- p' z0 X, o7 H+ f7 _
    * T4 r% ]! ]3 }8 r$ s/ n1 I
    ( ^# f7 d4 Q* i* q, m' V
    要使用這個新結構,你需要:8 \3 j$ S( j, t0 F. p

    3 K/ f2 t$ Q' l9 S將這些檔放在對應的CI4目錄結構中
      Y8 K. g' ^: M: c- y確保創建相應的視圖文件( Y; X1 I& u' z- K4 `
    配置語言服務; F7 q. `# O/ ]. M! I. b
    根據需要調整模組檢查邏輯
    # c( m% A& i8 a% U; J
    5 T" ?' ]# F: w& W8 a5 H$ F需要注意的是,你可能還需要:
    7 F: X1 [4 T* _9 h  q8 }1 O7 E' L
    2 L9 p4 J4 [2 Y- }% t創建相應的視圖檔(在 app/Views/ 目錄下)
    # o# V6 q. w% t8 B配置適當的中介軟體來處理會話
    ) r2 t+ `! k7 m3 V& v+ G5 {! e8 C8 c實現具體的登錄邏輯
    ! D: X0 Q) O5 Y4 \( T' f3 ^# [, `8 ^
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    , S% s$ q" H# L8 |' v
    * C( x8 ?& V; }$ A) j
    1. <?php
      ! v) c4 y9 f5 F, d2 h+ h3 X3 |
    2. // app/Config/Routes.php( h5 g8 r7 {4 A3 d+ y
    3. namespace Config;- D+ }2 ~6 P+ O* r: n
    4. 3 Q5 z2 U2 ]) H
    5. $routes = Services::routes();
      6 u0 y& v& ]  }% [7 Y2 d

    6. / T0 |  h% d9 g# T) C5 P* I
    7. // 添加自訂路由規則% w. ^$ C, B8 m4 t# m, Z% Q
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {2 M: S8 I$ K4 F# i( j3 X
    9.     $routes->get('/', 'LoginController::index');
      , }/ W# q) n6 F' M% h+ t/ O! A
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');% N* p9 J+ \* F  A, V. V4 h
    11.     // 默認路由處理- Z, o& a; w  t3 M2 ?
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');7 U/ g  k- N, h0 e8 g3 x( K& D! S
    13. });$ ^- d# ?  `; p: g/ J, \$ S

    14. $ S( x( q9 y) ^: [) B
    15. // app/Controllers/Login/LoginController.php8 I- l0 t$ F: t
    16. namespace App\Controllers\Login;
      : E% k! ~$ i; Z  d4 K8 z  S1 C' h
    17.   h  K5 j: X# F' Y$ g! }0 @$ Z
    18. use CodeIgniter\Controller;
      3 b" B; v" e( ?
    19. use App\Controllers\Login\AbstractLoginPage;2 |( Q. Y# K( v: l
    20. - R. n7 W! O7 D" x& S! _, R
    21. class LoginController extends Controller3 p0 ~/ @% z3 Y. l8 V$ P3 F0 K
    22. {
      - q! A8 _- ]) ]% q) M
    23.     protected $pageObj;
      # U3 v1 b% z5 B& `& j6 N4 K
    24.     protected $LNG; // 語言物件
      , w+ x- F0 \5 K$ r/ z. N( |& X* F: A

    25. 2 m+ w$ m6 k4 B8 B
    26.     public function __construct()
      ! j1 e2 `' G, P
    27.     {
      0 J; o5 `) n& T/ y1 B( X0 U5 \
    28.         // 載入語言檔和其他必要的依賴; m- c% ^4 V' D' i1 ?( T# N2 ~
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務7 {6 r9 Y) |# z$ t
    30.     }
      ) X+ }# B/ {4 L6 s* L

    31. ' [* |$ }& ~0 H% W
    32.     public function index()% `8 I5 y8 o6 S* x) K- B
    33.     {
      - x6 E) g4 ~8 b* s
    34.         return $this->handle('index', 'show');
      . a' r7 d0 d% R8 l, w
    35.     }
      $ z, L/ T8 N: J5 I" |2 O3 d2 k

    36. 9 |" F) P8 d+ @6 {
    37.     public function handle($page = 'index', $mode = 'show')
      ; q3 q- Y7 Q4 w) i: h1 J
    38.     {
      1 v4 e' l9 c  N" l% f$ z6 h
    39.         // 安全過濾頁面名稱
      / e' e" y2 q- Y  b/ {
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      ) l2 t' E* _  F1 {  \2 `
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';3 S: h9 j! |* h  f
    42.         ( z$ L! w- `: n
    43.         // 檢查類檔是否存在
      9 G- @3 g( m9 K3 f& i
    44.         if (!class_exists($pageClass)) {5 }6 B- D/ s4 d8 e2 Z1 k% W/ I
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
        X0 G: F# J. r$ L
    46.         }
      % r5 v8 {, m1 r# w, i+ U

    47. ' ~! Q+ o% I* l
    48.         // 產生實體頁面類
      . L/ T2 x! q$ a) v1 _9 V
    49.         $this->pageObj = new $pageClass();
      ) U) |+ |, L1 ~4 W4 l
    50.         
      , M6 A# i8 p- v
    51.         // 檢查模組要求
      ( k6 D7 J! r+ b# ]/ `2 t9 I* T- f0 `
    52.         $pageProps = get_class_vars($pageClass);
      & Z. C* h6 |% c5 ~, t: r( M5 m7 K
    53.         if (isset($pageProps['requireModule']) && ; z3 G7 k; q7 p! w+ o
    54.             $pageProps['requireModule'] !== 0 &&
      4 Z- L- f+ C3 j% @- n, [% l, q& f
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {# @( ~) t; q1 l# B# V
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ! F* `1 G0 ~% z: \& J
    57.         }6 K7 E: Z% r2 R$ k
    58. 3 I. f+ a& D4 z# l$ ~- {3 i
    59.         // 檢查方法是否可調用
      ) e+ {# Z$ {( h$ m! Z( O
    60.         if (!is_callable([$this->pageObj, $mode])) {% C9 a; I! V) U0 Z6 o0 ~% Q; K5 L
    61.             if (!isset($pageProps['defaultController']) || - u. A8 e- J; o& f- n! d
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      + ^. h, v) O% M$ w% f8 m
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      ( H3 l  G- d8 n3 m, S
    64.             }0 x3 j# ]" T5 X7 Q9 a
    65.             $mode = $pageProps['defaultController'];  h1 P- w  E! t# h0 C8 h* W
    66.         }
      : ^" ]8 J1 C- B5 `. e3 }
    67. : _2 t% \5 |% Q) I  o9 e
    68.         // 調用相應的方法
      & A; i5 U; c; ~% [, C  G
    69.         return $this->pageObj->$mode();
      2 \$ k/ a% Y) V2 o
    70.     }
      / P, _, A) X# ]: N" ~0 z) A+ w
    71. ! Z* Y& V; q( i5 N
    72.     protected function showError($message)* A2 q: N9 a8 w, a0 t  K
    73.     {
      ! ?5 q+ D& N0 @3 w0 U- g
    74.         return view('errors/custom_error', ['message' => $message]);
      3 v. G% z9 ]# z0 L8 @
    75.     }
        k8 p% X% e4 o9 Z
    76. ' j6 A8 H! Q0 o8 y& }
    77.     protected function isModuleAvailable($moduleId)6 y. ~2 r) j& M' N4 }) E2 @
    78.     {; q" f7 q1 W: N  ~0 B4 I
    79.         // 實現模組可用性檢查邏輯
      ' B9 k. _5 q5 ^. q9 O- q  E
    80.         return true; // 根據實際需求修改, z/ ?0 K% G& F! r5 q/ k
    81.     }9 M' l% [  J' ?- a6 _/ c) P  C
    82. }$ n4 _7 }( ^) K& |1 m" K
    83. 4 c2 `" A* j! i  L( b2 S% g* r2 z8 n
    84. // app/Controllers/Login/AbstractLoginPage.php/ D" n8 c, @& s* O4 }/ D. Q
    85. namespace App\Controllers\Login;
      3 J+ ~, v' Z% O
    86. ' a0 Z. s# ^( g, u
    87. use CodeIgniter\Controller;2 C  l4 a, n6 t- W# T

    88. * u/ i% ^) N# S" ~& f+ ~5 r: k; b
    89. abstract class AbstractLoginPage extends Controller
      ( n. y/ z: E* I$ ^" O9 N
    90. {; Z- h* l* B' O6 Y
    91.     // 實現基礎登錄頁面功能( c, @. n9 @# J) U
    92. }2 Q6 e& h, _# H; E* W* `& f
    93. ; d  l( L9 S7 h' L$ l
    94. // app/Controllers/Login/ShowErrorPage.php/ G5 @7 p$ L' v+ v
    95. namespace App\Controllers\Login;  T+ Q+ K* T3 o* i4 V
    96. 3 h# S# C& f) ]1 f1 B9 g. s
    97. class ShowErrorPage extends AbstractLoginPage+ o4 u; V. o; p
    98. {1 e' j) J$ ?7 b0 v( c  u9 P5 x
    99.     public static function printError($message)# Z2 z! S% C1 X% F
    100.     {0 r7 A$ c# t' R1 d/ C& L
    101.         $controller = new LoginController();" Z* r% A* V; N& J$ R
    102.         return $controller->showError($message);0 E# \0 U9 M/ P
    103.     }1 x' ~0 R3 @- e9 n: _0 r, w% Y
    104. }
      # d- C, A2 |$ ]7 B

    105. . I# `2 G, L7 s7 u
    106. // app/Controllers/Login/ShowIndexPage.php$ V/ G1 F- I, Z
    107. namespace App\Controllers\Login;( f+ [8 p" r# f0 T
    108. 6 z& _7 Y" E7 J# K
    109. class ShowIndexPage extends AbstractLoginPage- c" B' S3 T4 W/ S1 D
    110. {- K8 J  S3 m+ g- `4 q
    111.     public function show()' z: c1 W5 v0 q
    112.     {
      / e  V" e; d( x$ L- H" A
    113.         // 實現登錄頁面顯示邏輯8 M, ]0 a2 \9 D3 x& \5 B7 u8 S
    114.         return view('login/index');
      * N! Z; j3 ?5 j7 Q( [: _
    115.     }
      9 {6 _1 M) \' A4 y' N5 F) b7 ~" q/ w  Y
    116. }
      ( B$ U, n3 y5 V) B, o( R8 c* n" B
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-6-16 07:05 , Processed in 0.015533 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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