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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14335 / 14335

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致  d5 J' W. T- g3 b
    AI 就是站長的最佳幫手。
    1 C- |: x4 ^, ~9 Y, r" e% _- |. K, I- V% `; n
    5 G$ @. Q" z/ H. a. Y1 D" [
    這裡的「新架構」是指後端的架構會有大變化
    , @7 G, @) H+ Q0 W9 u' Q但前端的 UI 介面玩家不會感受出來有何不同4 |5 j3 ?4 e0 t- V$ X* N* t. T7 [

    1 c2 l0 b# k; ]3 U: l& n
    / c0 t# q5 ]  A9 q2 }/ J為什麼站長要改成新的獨家架構?
      r+ P( `* Y2 i! j; p就一樣由AI模型來解釋清楚吧。
    0 u! Y0 y& [! r; S9 [7 f
    2 U9 [6 Y+ }2 p/ p8 x" W" j4 a6 ]. }; Y; q% k
    讓我分析一下使用純 PHP 和使用框架的優缺點:) T' [; B: h7 z+ D4 D* @: k) u/ b
    純 PHP 的優點:
    7 ~' ~3 B" s' ~8 d1 z$ v1.        性能較好 - 沒有框架的額外開銷
    ! m3 S, C2 v9 ]4 z2.        學習曲線低 - 只需要掌握 PHP 基礎知識% w- }2 ?/ h+ _4 ]0 [9 W
    3.        更靈活 - 可以完全按照自己的需求來設計架構9 F1 W4 l3 Y' _, e" G/ l
    4.        代碼量小 - 不包含不需要的功能模組
    ' W0 L/ C7 F5 {# v  c, P5 E! M5.        適合小型項目9 M' e# G- M7 b4 u+ I, o
    純 PHP 的缺點:
    " o9 v! p2 M  I6 o* G1.        需要自己處理很多底層細節& U: Z; d: d9 D& J
    2.        代碼複用性差0 j; E7 K1 c! a* T( m9 t7 `
    3.        缺乏統一的開發規範
    " r; {% g; g' S4 ?: E3 x4 |! i% i4.        安全性需要自行考慮和實現
    / B& u' Y+ i, B! _5.        開發效率相對較低
    8 T; x7 H8 L0 x1 {, d  C6.        維護成本高  Y7 c$ m. \& u
    使用框架的優點:/ e7 A8 q7 z5 t
    1.        開發效率高 - 有現成的元件和工具
    3 [" f3 Z; U$ o2.        有完善的安全機制
    : g: J3 n4 z3 V5 N3.        統一的編碼規範
    $ \% U2 ^- E+ z7 W4.        易於維護
    + i/ I8 N8 x6 O* {5.        有活躍的社區支持
    7 V/ c' k+ x  d% j! \) G$ H6.        適合團隊協作' p8 e) [0 g7 g. _  w5 K; d
    7.        自帶很多常用功能(ORM、緩存等)
    7 b5 ~( A. G7 o# r" m使用框架的缺點:
    6 R  V0 g. T3 Z4 u4 f1.        性能有一定損耗% |* }) |2 Y( P2 ~% [- v( J
    2.        學習成本較高5 R7 Q+ L0 a* |: t6 Z& C( Q: @4 Y
    3.        可能包含很多用不到的功能
    2 d1 z/ p3 j7 M, A5 f4.        不夠靈活,需要遵循框架的規範' @" u% X/ p6 f( z  S
    5.        對小項目可能顯得過重4 G  r. O( P! [3 b
    建議:
    5 U( l4 ~6 n% n! H+ W8 g1.        小型項目或學習階段可以使用純 PHP
    # m4 I# B- F8 ?2.        中大型專案建議使用框架; M' c/ `& @( x4 L$ {+ q& M: u
    3.        選擇框架要根據專案需求和團隊情況2 Y& K, i  H9 m/ j7 W
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇2 b$ _+ g9 H1 l: p  d: W
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    3 z9 s+ T8 X) F  h  ?6 A9 x7 ]5 t  m+ K) e! |# D& Z
    . w4 Y% Z0 p; b
    ) T5 n  f" z; v/ @) i
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。) c; D. M1 _2 o& _3 y
    8 H& m# `+ ^" N( F6 K0 b
    這個轉換主要做了以下改動:
    ! X4 ^- S5 i- c/ F2 E) P8 X/ j9 G/ v' b" f- c! u
    路由結構:
    ; M1 y* m$ m9 B
    / C' W1 `' ?7 y  n* Q使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ! b) D* C2 t) n( g3 |8 w9 G& G. Q支援原有的 page/mode 參數結構4 s1 I" |: ~2 P7 g  C
    通過路由規則自動匹配到對應的控制器方法
      O7 ~" K8 W* a  r+ p- u4 Q7 e% A% F* o2 y& a; p8 \, v; J
    ( I  y- p" _$ D. ?
    控制器結構:
    ! \0 C6 U/ O* I) J. `
    : b# ~  ?; p2 w' W8 d創建了主要的 LoginController 處理所有請求( l) c  P+ [, w) m) }4 T* |" ^0 F
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ v0 S+ z; v, R( X
    錯誤處理改用CI4的視圖系統* {) w4 X+ L  o& C2 V8 v( s( e" c% V
    " Z: s: e! }+ ~6 l6 n, Q3 N- J
    7 k& `( w8 o; |; [' O% _
    類的組織:
    ( F( A7 m; p% U
    ! _1 C* ^5 V4 P) @( q. s所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    7 }2 s2 E$ J% \2 [保持了原有的類繼承結構2 o5 k- P  {! h& K8 `9 E  |
    改用CI4的控制器基類和特性
    9 x  M8 a' P3 T" P% U
    2 K; o" r; W4 d" z; [# h0 b+ H3 ?) m% r0 c& j. h8 y
    改進的安全性:
    9 |, X$ x2 l1 B0 t' @2 {6 |' n' [; W0 _1 q
    使用CI4內置的安全特性. j0 T; v+ N8 E  ]. R5 i& ^
    更嚴格的輸入過濾
    # F- M7 g' E  Y/ O更好的錯誤處理機制
    - Z- h* o3 ^3 q7 U4 t) d* X, p+ E
    , B3 O' Q; F8 ]6 Q6 e9 X* B3 s$ q4 O: I, U  p, I* A1 U

    ( ~6 D  M+ ^( y7 ]要使用這個新結構,你需要:
    1 _7 V/ {7 M' U& K' S* Y9 F" V  V
    將這些檔放在對應的CI4目錄結構中
    3 j8 M) I& X7 p1 S, k( g確保創建相應的視圖文件
    + L5 e5 {$ h9 w" |配置語言服務
    2 H2 d/ s8 ~( x. j$ s根據需要調整模組檢查邏輯
    0 }5 \% O( w$ Z3 P% g
    1 ~, h$ j: @7 u( Y$ @需要注意的是,你可能還需要:
    # P* f. B5 o: l4 J- Q" |9 \- j6 v& x" C" i
    創建相應的視圖檔(在 app/Views/ 目錄下)7 i" V6 N( `! ~2 ]8 y
    配置適當的中介軟體來處理會話
    6 H6 c& L/ s  u) R實現具體的登錄邏輯' f2 ~- z7 x" f/ h" a

    $ X0 P7 u/ c$ }  b4 S5 ~/ P, @需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?! |; h  `( T4 H1 w, U8 I

    7 f4 ]* |5 \$ I
    1. <?php4 I0 I5 W$ z( k
    2. // app/Config/Routes.php$ |- A& q- _! G
    3. namespace Config;
      - S% @  _4 @* o
    4. " [9 \5 f2 g. L, e6 }$ z' L) N
    5. $routes = Services::routes();
      + A# h' v' y7 O# T9 z/ S5 C
    6. # T, w, e5 ~& Q! [
    7. // 添加自訂路由規則
      " T/ p$ X9 N( x' @; Z! \, \. Y% n
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 V9 }9 K$ R) ~8 ]- P6 q& `
    9.     $routes->get('/', 'LoginController::index');7 K/ _0 q% n* m. }3 K! D
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');) `( F! W' {: S3 S4 n, m& O( p# s
    11.     // 默認路由處理) M. Y7 N! I! x" B
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      ) j7 \" Y9 g" E: S5 g7 \
    13. });
      ! N2 m7 Q' @" v( b8 [! ^: t, B5 y

    14. 2 r" G. }) t5 |- K( Y6 h# {0 \! ], A% q
    15. // app/Controllers/Login/LoginController.php
      8 `1 M. C6 ]8 N/ Z2 q- G' ^
    16. namespace App\Controllers\Login;
      * Q& `  ?* u& ?) G& o, o
    17. 7 x5 e* I6 E3 {! r- S8 @
    18. use CodeIgniter\Controller;% v  A1 L* l9 A4 C0 W5 k  D
    19. use App\Controllers\Login\AbstractLoginPage;9 e2 J- v" k+ z5 D
    20. " n" ~# h/ j) ?8 P
    21. class LoginController extends Controller
      6 t! T2 x( z6 l$ f/ i4 c
    22. {
      5 E6 G& [& j1 V
    23.     protected $pageObj;
      2 K" V: V1 W7 r* [* E7 C& O# }
    24.     protected $LNG; // 語言物件) q  o! O; N2 D% Z/ ~
    25. . `! y. p  ~* N- F. ?4 x
    26.     public function __construct() , @1 Y. V" F/ ~: H
    27.     {5 K+ U% Q6 e& x1 e# P
    28.         // 載入語言檔和其他必要的依賴9 ^" l. \6 P, ?5 o+ d6 X
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ' M, _- A: t4 v6 f; i5 M
    30.     }( k$ h6 z! w" k& v

    31. 7 h) `3 B$ T3 N3 N$ z
    32.     public function index()" t1 P9 U2 S, K# e$ U
    33.     {
      + k5 ~1 \2 N3 t6 H: N" D  ~9 h
    34.         return $this->handle('index', 'show');8 V% {0 g' F' x0 \
    35.     }
      5 x, n9 _% P) X) S

    36. # f9 F, T1 v3 e- t# \' s0 A
    37.     public function handle($page = 'index', $mode = 'show')
      , o+ G' T# z. K% `
    38.     {
      $ }2 v4 W  ~- O( C- X! Y6 x: ]& j
    39.         // 安全過濾頁面名稱
      $ V+ ~3 ]' v7 L* G6 _
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);; W* g$ k) ~) Y  G" S: d
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      & B: \! v, i% g1 m
    42.         " i$ B" C7 n- `0 m' f! y* z& S3 g5 E
    43.         // 檢查類檔是否存在6 m8 X/ n1 m2 ~/ h5 u% g$ ?0 ]" B
    44.         if (!class_exists($pageClass)) {
      8 S" J: X5 h/ {5 ]$ s7 _7 d" t2 K# I
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      2 [, W& e  R2 s  _" I
    46.         }4 {( @& u8 W- n# I
    47. 4 i9 l7 G2 ^3 T9 j. }$ L
    48.         // 產生實體頁面類
      / X/ ^( L  E0 @9 ]$ t6 r0 Z
    49.         $this->pageObj = new $pageClass();
      1 \, s$ k! }  T& u% o" m
    50.         
      8 C% N# R6 V8 Z1 k8 C4 R
    51.         // 檢查模組要求/ Q. F8 p+ p; K2 e" ?4 m. A
    52.         $pageProps = get_class_vars($pageClass);6 h5 O8 @- E* T
    53.         if (isset($pageProps['requireModule']) && ) l6 {& R7 o0 @" N& W
    54.             $pageProps['requireModule'] !== 0 && ( c- T: I+ x9 }' B; k5 {
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      + n& Y  O: l; T6 W+ v
    56.             return $this->showError($this->LNG['sys_module_inactive']);" [$ H' R% Y  Y4 v
    57.         }* ]2 K. n' R8 w9 ^
    58. ; p9 Z/ w6 X6 X$ I  w* V  p1 c
    59.         // 檢查方法是否可調用
      * K; J+ w" A1 [8 C# A( X. W
    60.         if (!is_callable([$this->pageObj, $mode])) {. B: R* D6 B  X1 {
    61.             if (!isset($pageProps['defaultController']) || , O9 r5 k3 R+ ~+ L) u; m( H& K
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      9 ?# S$ x9 x. S* o! @
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);1 ?/ ^7 i3 D$ W. Z/ O2 |
    64.             }  Z2 {6 I, L: x+ a: `
    65.             $mode = $pageProps['defaultController'];: B& N* N6 S4 |, j) x
    66.         }+ x, j! o) c$ l0 x

    67. $ ]4 I; j/ P( L$ j
    68.         // 調用相應的方法
      ; g/ j+ [1 Q% ?, _# `* U
    69.         return $this->pageObj->$mode();
      . R  t* g! O2 M
    70.     }
      6 ?6 R) g" I, l" V. s# i

    71. / v; i, P3 {" w: k3 y, @
    72.     protected function showError($message)
      5 Q$ R$ x1 U6 c! }6 Q2 [
    73.     {
      . `' _6 S5 i) f
    74.         return view('errors/custom_error', ['message' => $message]);" o& h" o9 N. {1 ~6 |
    75.     }
      5 }) q5 Z5 S% E. k9 V! @# k& H
    76. 7 S3 O' b/ m8 n8 q% m9 }
    77.     protected function isModuleAvailable($moduleId)
      + k7 F: R3 _4 y' ^1 L! @
    78.     {
      * e# v, `* X9 D1 Q. d
    79.         // 實現模組可用性檢查邏輯
      1 \8 E$ R  h6 k! b" |2 H
    80.         return true; // 根據實際需求修改  t: |5 F2 d/ y/ R5 v: j
    81.     }* r* K) u4 ^0 H5 c4 o' V0 ]6 K
    82. }4 u5 ~% e' Q$ c
    83. $ |5 j. D$ _- {0 y- F
    84. // app/Controllers/Login/AbstractLoginPage.php& n4 Q' T' R0 k% D
    85. namespace App\Controllers\Login;0 X! e0 Z+ C# d+ L4 h
    86. & C+ I% j) c2 L# u8 N2 _
    87. use CodeIgniter\Controller;
      ; I) w* Y) M" \9 S& t. A' m
    88. ; G$ p( i+ L$ g: j
    89. abstract class AbstractLoginPage extends Controller
      ; }3 f: s  V, G0 M) E5 U. x
    90. {
      % v2 ~" M# k+ a5 p
    91.     // 實現基礎登錄頁面功能
      8 Y# _& X2 g9 a3 q
    92. }6 w, M8 I( J! T! [
    93. ; N% h8 K; [7 D& ~) k
    94. // app/Controllers/Login/ShowErrorPage.php
      * y9 d, G4 S4 j* v1 [! e  c
    95. namespace App\Controllers\Login;( v; M, u% L5 n5 I; m" q0 m. _' B

    96. % ~' u0 {1 v% \4 y
    97. class ShowErrorPage extends AbstractLoginPage
      " v) b/ g' K- S
    98. {/ @; |" V- y4 K3 i
    99.     public static function printError($message)
      6 Y2 A8 `0 d6 u! y# ^* M
    100.     {8 _; P3 J* l5 g/ D: n4 V
    101.         $controller = new LoginController();" |# B5 @, X6 J6 ?  M  E
    102.         return $controller->showError($message);; P8 y! l+ h* A
    103.     }/ a' k' p8 |0 C- G* ~4 B, r
    104. }/ f$ c6 m( t$ D$ R/ Z

    105. $ Z7 Z) }1 m: o% h7 n
    106. // app/Controllers/Login/ShowIndexPage.php
      0 K0 i1 h# K# ^6 {5 B7 v
    107. namespace App\Controllers\Login;
      1 e: m7 T! j5 `9 T1 E

    108. & T# ]  w! U' n; z2 a, w
    109. class ShowIndexPage extends AbstractLoginPage  c/ v/ G3 P2 ^/ V  W' z8 F, v
    110. {
      1 [" S  q: Y: A# W/ }2 e& }" D2 |
    111.     public function show()$ x, e% ~) d9 T# Z# C7 }5 k4 V& U
    112.     {; O* f' ]. A4 t0 \8 W  T0 }- K
    113.         // 實現登錄頁面顯示邏輯
      - Q3 l% |5 `+ k* N2 ?" J
    114.         return view('login/index');4 q8 G+ h. A. j
    115.     }
      2 J( B; E$ k8 C* ]4 ]9 o
    116. }
      ) o4 c6 `8 o- w: l: [
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-11-14 07:27 , Processed in 0.018851 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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