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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14087 / 14087

生命值:5%

升級   100%

  • TA的每日心情

    昨天 01:17
  • 簽到天數: 5674 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致) Z5 @3 I* c2 V% x1 `1 p9 J
    AI 就是站長的最佳幫手。  o; d% Z2 ]) [4 a

    6 Q9 J2 p; D( D  e' @0 v
      J" ~( y6 {: h) W) J這裡的「新架構」是指後端的架構會有大變化$ a4 z9 \6 T# d  V
    但前端的 UI 介面玩家不會感受出來有何不同
    3 O$ P; N$ x5 g$ d' Z2 R# J( J* u# ?, y! o
    * |* `- T# y* \; E9 V0 S: N5 M
    為什麼站長要改成新的獨家架構?
    1 m. m) s- I/ Z( ]) o就一樣由AI模型來解釋清楚吧。  Z) s3 h4 B, y, `' s$ N4 v

    : w% K5 H/ l: }0 M$ o( e
    % S6 i. E9 g8 O讓我分析一下使用純 PHP 和使用框架的優缺點:
    1 e5 O. x5 u" e% L; q" V純 PHP 的優點:
    7 a: X% q9 l/ q; e  M* u1.        性能較好 - 沒有框架的額外開銷4 p! s% l' _. P& x; f/ v% ?' A# n
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識- [5 ?& B7 }, n+ A; o) `: a
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    3 C& `. ?1 a- l" M4.        代碼量小 - 不包含不需要的功能模組
    3 Z6 `$ X& J+ z$ ^& {5 d5.        適合小型項目; i* t+ x# N/ D3 D, w  x
    純 PHP 的缺點:' x2 @! U+ I& l
    1.        需要自己處理很多底層細節
    ( H9 Q5 x7 P" _; U2.        代碼複用性差
    2 D9 Y4 c/ D( ?( m; ]% S4 k' d& b3.        缺乏統一的開發規範
    4 e4 n7 y4 F4 d5 E. G4.        安全性需要自行考慮和實現
    4 {8 j9 c) _" B5.        開發效率相對較低/ Q" s. p! x* C$ v  }" Z5 F0 b
    6.        維護成本高: p( S9 N/ o6 n9 I0 w
    使用框架的優點:: u/ X+ {( Z) q2 O8 v: P, Q3 x
    1.        開發效率高 - 有現成的元件和工具1 y4 n( E' U- s( @
    2.        有完善的安全機制! q' b/ h5 I4 {& }
    3.        統一的編碼規範( J% h/ i  p$ ~9 q7 k0 f
    4.        易於維護
    7 N4 z& Z9 `; v5 W( @5.        有活躍的社區支持2 F& g5 Q9 o6 H- F9 [$ W6 p
    6.        適合團隊協作2 w; \/ ^" X( q4 U  M2 _
    7.        自帶很多常用功能(ORM、緩存等)
    " C4 T; O+ W' K) K$ V0 H使用框架的缺點:
    7 r' {& K; w6 U& _. {- R1.        性能有一定損耗& {* p) Q% d5 Q- r$ n; h" C. @
    2.        學習成本較高
    1 r  F- r! L9 K; L1 g" N; H1 `' U3.        可能包含很多用不到的功能
      b. K) |8 V' j. n) P7 M3 d9 [4.        不夠靈活,需要遵循框架的規範
    . O/ K7 t" s3 ^5 p4 S! e5.        對小項目可能顯得過重& N5 V( h0 Q" B1 q) B7 L+ w) g7 d
    建議:, n' W& n' K- V' T9 \; v: w
    1.        小型項目或學習階段可以使用純 PHP% J* o% s$ S6 i5 G; V
    2.        中大型專案建議使用框架
    2 F3 n' q8 T- g( z( m7 u. Z3.        選擇框架要根據專案需求和團隊情況2 ~( p. y5 x9 G4 z9 ^
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    : ?2 t9 ]/ t) f( B您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    ( L3 J) ?. i. a) y$ E4 @% G9 W: ?, R* m7 N

    * ]' d0 \4 Q4 m& A* v5 n9 P' P$ O& e
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    ' \9 S- C. @3 N& X1 T1 i, g1 _. D$ r8 s" v7 p% M4 O
    這個轉換主要做了以下改動:
    ( e! h: Z) r' Q2 I: M9 L. ?5 q6 }+ w/ p0 g' Q1 z, d" H1 c% w
    路由結構:
    2 m5 k! ?$ D; L8 [6 w; W) j
    - f. Y* T9 m% K, I; Y使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
      I" A6 L& a* }" p/ b支援原有的 page/mode 參數結構
    5 ]6 g& l5 m) H0 O通過路由規則自動匹配到對應的控制器方法* W5 ^, u2 h0 F  {

    % J/ L3 ^  V2 u; v+ [( g9 {0 E& m. V  b6 u# w2 A5 F; r; e6 @
    控制器結構:0 T4 a. D( b" ?2 y0 `8 j0 C
    8 {5 K9 g; _! j7 Z% n- O! O
    創建了主要的 LoginController 處理所有請求  `) B0 J5 S0 r) Q- @6 l
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範, R3 D9 _; b# f# ~- d, J: y, |
    錯誤處理改用CI4的視圖系統; h% C3 X$ k" D. [. ~8 Q( q8 C' C9 C& `* z
    5 z- m# ^7 ~: @) H! a

    5 e2 i! L- w9 h類的組織:  l  c" h/ [% E- |/ U; T
    0 |2 q- g7 R- w$ s
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下* N1 X0 N( K9 t- D2 J
    保持了原有的類繼承結構: c/ r9 G+ r4 g1 p2 @
    改用CI4的控制器基類和特性
    ( {% D1 U9 T4 y1 T* [
    8 @$ `9 A& l3 B" y; \* }( E0 h
    0 \8 l- R/ m: I; }改進的安全性:2 A% s# n% ^. q; q+ r8 z
    - I6 \) d# C/ i4 ^& }
    使用CI4內置的安全特性
    4 `- R( x" r5 J3 Z更嚴格的輸入過濾+ v) u5 y! f& F6 @# {8 I$ P
    更好的錯誤處理機制
    0 M* V2 ?; h) i# ]3 b- w# q! n- q* `( D: x) U4 u2 J1 t* R, x

    9 }) ^: R# Y* J# l, f; e! s  f, V) u, i& B2 j1 W  p2 x
    要使用這個新結構,你需要:
    - e) \. R* a7 n3 l6 O" F/ c# n
    0 H) Z! j% y( X. ]7 \4 a8 f# C將這些檔放在對應的CI4目錄結構中
    ! K( q9 U! u: N; O! `# Z5 X確保創建相應的視圖文件( H3 D$ h1 a$ b
    配置語言服務) C  ^9 i- @- {' L
    根據需要調整模組檢查邏輯, P" @, u" r1 ^1 E8 j

    * ^3 g" F9 |8 u* A需要注意的是,你可能還需要:
    , F( U2 Q9 R( S/ r
    * ~* T! _* _) [+ j& e2 n3 V創建相應的視圖檔(在 app/Views/ 目錄下)
    % V2 h* i6 {) ?, g- m配置適當的中介軟體來處理會話
    3 T& ^& S9 \6 t+ i& ^7 T* u實現具體的登錄邏輯
    4 k; K( T# o2 O: `9 S/ f4 y! }3 v5 C5 w+ v/ V% f$ c9 @, o
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?7 h9 Q. x2 I# z. i# c- p# T

    1 ^7 R- B9 }0 M( O" @
    1. <?php2 d* k; S- H, o# U
    2. // app/Config/Routes.php
      . Y% ~* A* F' G8 l  h$ p0 A
    3. namespace Config;' J9 o- N3 l. g

    4. - g: `" N+ B1 G/ R" d) h! J. J8 E+ ]
    5. $routes = Services::routes();8 ^* [/ ?+ D7 l* M& W! O2 L

    6. & f1 v8 k: P4 Y8 b' X4 X1 _
    7. // 添加自訂路由規則% m' g' o" q+ p, n* Z
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      $ y! W6 r. f9 N& W- A$ G
    9.     $routes->get('/', 'LoginController::index');/ C  D% @! ?8 x; }, {1 k
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');6 ~/ k, I/ P7 P, j
    11.     // 默認路由處理
      ) x3 |! e1 n1 B1 |: B$ h% u
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      : s8 m3 C& o7 L0 V+ \7 N4 ~2 M
    13. });; w8 q2 G' u& [
    14. 2 l( y$ i8 F9 `! N) Y) ~5 M8 q5 T
    15. // app/Controllers/Login/LoginController.php; L( x8 c9 V9 g% u, Q8 U
    16. namespace App\Controllers\Login;$ t0 W+ @/ W* R  t8 b% @

    17. ' g( w, l, Y3 M; p8 r" {7 z) ^1 m
    18. use CodeIgniter\Controller;
      % E% h. p5 i# O4 ~
    19. use App\Controllers\Login\AbstractLoginPage;# l- v! c6 M/ ~

    20. . Y# g: f! @$ }! v  v, D5 d
    21. class LoginController extends Controller" Z& e! G- I3 M8 t- J" l
    22. {. \3 ^  h( \# b: t) i* \$ m/ A
    23.     protected $pageObj;# L; D$ ], o8 `! \
    24.     protected $LNG; // 語言物件
      # l7 J: Y" E4 E4 e7 a/ r
    25. # V8 Z4 o# u! i. f$ _
    26.     public function __construct() 2 o+ u- u, W! e5 a
    27.     {
      5 W2 i# `6 M* s( u7 n
    28.         // 載入語言檔和其他必要的依賴
      : m+ a2 l  ?: j# X# w, y# S
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務& `4 Y: W! y2 W, S$ }, ]. M1 U$ C
    30.     }
      ) z1 A* O9 a; K$ W. U. w6 w7 v' K
    31. * m2 v( y; }( h, }
    32.     public function index()3 j6 M7 Y6 _. u# @" a
    33.     {
      ) Z  G# f+ ^; y# B
    34.         return $this->handle('index', 'show');# X* L1 f- x; }: l
    35.     }
      0 S9 R9 {' I# D2 [8 ?9 U

    36. 8 i9 L1 c) G' i8 ^( A/ M
    37.     public function handle($page = 'index', $mode = 'show')
      ( f& }" \  g$ h+ J! D: c
    38.     {
      " U; G  H4 ~  x; L
    39.         // 安全過濾頁面名稱
      + ?* S$ ^# d1 ]& c* ~
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      * h( c: h* c/ r# L: ~$ ]0 b) A
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ; T" k' y$ F7 N1 X" U4 Q8 l; z
    42.         
      ! h1 U( k6 Z- Z1 ~
    43.         // 檢查類檔是否存在+ Z1 j5 ?9 _; p& W3 H" {( Q
    44.         if (!class_exists($pageClass)) {
      # z& A8 ~0 B: w4 l! d9 D
    45.             return $this->showError($this->LNG['page_doesnt_exist']);, c1 Z3 e& L: p5 I
    46.         }9 F( Y" y" n, A# Q1 d7 H  p/ V

    47. $ f3 F" n4 x$ i7 v# I7 {! g
    48.         // 產生實體頁面類
      ) a5 \) B0 \$ A
    49.         $this->pageObj = new $pageClass();
      - s  @  ]% ?' j+ G' N
    50.         ; T6 j0 Y2 i  N6 s: u
    51.         // 檢查模組要求: C/ b9 U0 |/ ~. J) T+ u. i+ T
    52.         $pageProps = get_class_vars($pageClass);% o3 O% I4 M$ O
    53.         if (isset($pageProps['requireModule']) && " G5 T2 j- x8 Q+ {6 h2 J0 b/ C1 B
    54.             $pageProps['requireModule'] !== 0 &&
      , B9 p' p- e/ s* k' T" t8 H
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
        h( v3 Q/ g$ ?0 }3 f
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      3 p  C4 r" Q$ e
    57.         }
      4 F. j3 @. \8 }4 B. e

    58. ' X/ e3 e6 D# w; W. T! X
    59.         // 檢查方法是否可調用
      7 T2 w8 d' B! e3 R; q' v) x
    60.         if (!is_callable([$this->pageObj, $mode])) {& q4 C8 m$ N4 M2 y' w
    61.             if (!isset($pageProps['defaultController']) || 4 g# p5 }6 c$ I9 |, P% L
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      ' G* V& F- I( R+ r
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);' B9 w5 O! J; ^8 I+ s2 J
    64.             }
      / Y& S: _" L# ^' @8 y
    65.             $mode = $pageProps['defaultController'];
      7 {$ D* f  \0 h6 @
    66.         }/ r8 p1 v9 p& Q) ?6 G( Z

    67. $ n! P' A" D, ?8 d: o
    68.         // 調用相應的方法
      * Y, k, x  Z. l4 k8 s4 X
    69.         return $this->pageObj->$mode();
      , L" V; o' ~, r; S& h
    70.     }
      ) Y- Q9 n" z: Q4 @6 u
    71. % {* u5 a  F3 ^6 W* H! R' G: E( l+ R
    72.     protected function showError($message)
      1 b" n, z! g6 u! b- Y; d8 T
    73.     {: i) E; b$ v; x/ n' f" i
    74.         return view('errors/custom_error', ['message' => $message]);+ \# t- ]1 f2 D; u* a/ A
    75.     }( S) [+ _& ~, e% u/ Y; T) h5 J7 g
    76. 4 M! r  o( P3 K9 e% E* f; I
    77.     protected function isModuleAvailable($moduleId)
      3 f! [/ Z+ c! g
    78.     {
      2 ?: |: W# y$ p. ^; a1 P, g( b! b, a
    79.         // 實現模組可用性檢查邏輯) W6 [8 d( B- e7 Z3 t5 G
    80.         return true; // 根據實際需求修改/ L+ v1 k- w/ k% g7 _7 m3 Z0 x
    81.     }
      & {% L; ?! \; p+ e
    82. }+ c. W- K# b) x5 D9 G; M

    83. 3 B* p* N/ U! {% ]6 X
    84. // app/Controllers/Login/AbstractLoginPage.php
      4 s. _0 e3 G! u0 q
    85. namespace App\Controllers\Login;: `/ g7 h1 K7 Q/ C, R& m8 ~
    86. - b7 R- l, n" A0 H4 n
    87. use CodeIgniter\Controller;
      + r1 X0 z3 i0 W: S1 a& D3 t

    88. 6 f5 z4 F! {8 O& |$ O$ k
    89. abstract class AbstractLoginPage extends Controller
      ; E# h& X+ Q& o, E
    90. {
      " W0 _( z- j/ L/ {' F( Z  k: }
    91.     // 實現基礎登錄頁面功能9 L' W6 v, I  h% f
    92. }" U4 r" ~+ s  B5 c3 w
    93. ' J/ _$ m1 F' m1 J
    94. // app/Controllers/Login/ShowErrorPage.php
      7 F2 J0 s) k8 @* {! a. w
    95. namespace App\Controllers\Login;6 u- I, c* y! P2 b; K
    96. 1 r4 j8 l+ t2 K( h. E+ D+ {
    97. class ShowErrorPage extends AbstractLoginPage
      ; G- K2 a& I/ G* w
    98. {% [: I0 }1 W; o# ?- v
    99.     public static function printError($message): n2 T' P8 h+ z% w. H
    100.     {
      + I' |6 R& Y7 D8 [2 _/ n
    101.         $controller = new LoginController();- F; Y- b3 S. R  V; z5 }) x
    102.         return $controller->showError($message);
      5 W6 r- e6 f! W* ^& X
    103.     }$ O2 A$ D+ A) C  f
    104. }
      " C. z( e8 H; m' H4 s" `

    105. " A9 L! |& [* Y* v
    106. // app/Controllers/Login/ShowIndexPage.php2 |3 z% ^6 N% g& }% @* M! N( q
    107. namespace App\Controllers\Login;; T. t, f9 [, \" G
    108. : g. S* T  A- N! T" A
    109. class ShowIndexPage extends AbstractLoginPage
      ( y- b3 a4 Z: ^( h
    110. {$ n0 H' s7 l" n- @- D$ x
    111.     public function show()- w, I" [! p" v4 R/ W) W1 R# Q
    112.     {& [4 F- c7 X3 i" L
    113.         // 實現登錄頁面顯示邏輯( Y9 z' l; h$ q" J2 P7 e3 B
    114.         return view('login/index');
      & [/ Q6 H8 ]' B7 z
    115.     }
      - o3 M: _' S# |: M/ }
    116. }- B+ e1 {: P$ w. i% ^% G
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-8-11 13:58 , Processed in 0.015341 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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