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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14626 / 14626

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    + v# e4 a1 V# a2 p: W( F, bAI 就是站長的最佳幫手。
    - \1 C: }9 S- I9 x. _" n
    + d' D7 k: g1 ^0 H$ q9 Q+ ^8 `& Y9 b
    這裡的「新架構」是指後端的架構會有大變化' J; }7 {) X( k; s
    但前端的 UI 介面玩家不會感受出來有何不同8 `% j* a! {) g4 w4 k1 ~0 H
    5 m# w$ U% {- J# O" M& W

    6 \+ _: Z3 F9 s為什麼站長要改成新的獨家架構?
    * h9 ]' z5 Q' q就一樣由AI模型來解釋清楚吧。: k3 V  t/ m9 d0 V8 K* d7 B2 Q4 L

    ( w: y! L. E) v3 b8 m6 r0 L2 ^- x! R4 q- ^" f/ j/ [! J2 o$ p
    讓我分析一下使用純 PHP 和使用框架的優缺點:; O3 D, p  [1 o5 o# T8 w* Q9 O$ o& _
    純 PHP 的優點:# b# J) }! d( ?* y3 d5 v6 u9 J, o4 Z
    1.        性能較好 - 沒有框架的額外開銷4 E' t) M& _3 ]
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    $ x+ N$ B8 X/ U& ~1 ~3.        更靈活 - 可以完全按照自己的需求來設計架構5 f  f" v3 Y. j; G
    4.        代碼量小 - 不包含不需要的功能模組; [0 C( [6 ]; @( _4 g
    5.        適合小型項目
    / z% P1 ^: x" O6 q8 |純 PHP 的缺點:
    ; t. T1 L' ?  s9 d0 H( T8 h1.        需要自己處理很多底層細節
    8 b- r# s) T8 q+ R/ T2.        代碼複用性差
    , h  G7 G( `* d3.        缺乏統一的開發規範
    , L8 f- x! j9 q0 m0 \4 s4.        安全性需要自行考慮和實現
    7 U" r3 F" z3 n+ W6 o9 v5.        開發效率相對較低( A! O! ?6 L' E; @$ A
    6.        維護成本高
      q- i& C6 L! r" ~/ [使用框架的優點:2 M$ Y7 u; ?3 k9 w
    1.        開發效率高 - 有現成的元件和工具
    7 B# S; g3 F" F7 `# b1 D2.        有完善的安全機制, @& ?  P2 k+ A' P  v' ^
    3.        統一的編碼規範
    3 @) X6 q8 @- X) l& {4.        易於維護) k) I( Q9 q) Y- s: |' H/ Y
    5.        有活躍的社區支持
    $ t3 {# m- _+ q% C' J6.        適合團隊協作$ d, o. h0 r  L- A' m
    7.        自帶很多常用功能(ORM、緩存等)
    % E: ]$ G- E. n使用框架的缺點:
    - B* l5 ?" R1 r6 S$ _  m" l1.        性能有一定損耗
    - U" [; B5 o( U2.        學習成本較高# b" x# P7 \" x* ]4 H
    3.        可能包含很多用不到的功能
    $ y' W  O, c, m3 l9 _( x/ m9 v4.        不夠靈活,需要遵循框架的規範' _% H5 l9 T& c# B% V# _
    5.        對小項目可能顯得過重
    . {7 S5 L, M7 d8 q- D* {# Q8 ?建議:( Z6 W! Y' ], M+ Q- j; R. @
    1.        小型項目或學習階段可以使用純 PHP! p& R/ Z* K7 q3 J  _, x
    2.        中大型專案建議使用框架
    5 S7 j  s/ K+ S2 _3.        選擇框架要根據專案需求和團隊情況8 w8 S! Q$ Q- l4 R( Y$ G
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇: w# s' ]$ L, P4 A
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。4 X& O, M9 n; x4 f( o
    - K* X  t* _9 \- l; ?0 d

    - J! I' I3 f- p- Q9 ]& O8 v" y. R: {& Y' X$ T8 ]7 E3 t& O
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。, S: @5 |# `, |& M' O7 `: R

    ' i: D& Q. D4 l5 Z' y* u這個轉換主要做了以下改動:% n7 ]) ~/ t$ `) G+ J2 d. K2 [6 S# O
    3 f9 A$ y1 |) B7 Y. }% `
    路由結構:5 H" }% F# w5 C8 ]0 g

    : Q- R& [+ q; e& ^/ K. v: Q使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    7 d( q+ W& i0 M0 U8 e支援原有的 page/mode 參數結構1 S3 K  Z6 M. ?5 n# s
    通過路由規則自動匹配到對應的控制器方法
    0 [" W* Y1 ~% c/ T0 H( U1 E: X. m: Z0 W& [# Q
    6 \$ E) G. o  z6 ~4 ~# E
    控制器結構:
    ; `  z8 T: N( T! \' w, F- G8 N# w2 J* P) |" T" X
    創建了主要的 LoginController 處理所有請求
      {3 n% a4 {  u5 X; ~. F& i保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    4 I$ ]. j6 h5 o$ f" G" @  U錯誤處理改用CI4的視圖系統
    ; N& T4 a3 Q; g% l# J# ~! R. p
    / Y/ t0 k7 K3 @5 w! R; E0 ]2 A$ L$ J) x" p) O! h# ]% c
    類的組織:
    8 B& m1 x9 U- X' d/ ]) F- C& o+ W' R
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    6 y7 e/ x/ n+ [. j保持了原有的類繼承結構' H1 M, R" d$ _' Y) ~* z8 z
    改用CI4的控制器基類和特性6 a) ]' {3 b' ^  w
    ; ?! ?* b# V- Z  G9 r) X6 o

    ' @% v2 k3 X! z; L4 p! s1 @改進的安全性:
    - ]' @! h% B' Z& L
    2 `) k0 l6 C! y3 P, @# O; V6 a使用CI4內置的安全特性( b- H6 e- n% a
    更嚴格的輸入過濾
    + z3 u( N, l% B, c! d" M: k( G更好的錯誤處理機制& ?' p) @/ f( [0 r

    , R- u* C% a' d! ]9 S$ P, f6 ~& j0 a) x, `' ~/ U

    ! Q, l8 q9 J1 x4 y要使用這個新結構,你需要:
    . y- A( c/ J7 p' \% q2 Z+ r' C, e: }& t; _
    將這些檔放在對應的CI4目錄結構中
    ; @0 r1 v6 _* S$ S確保創建相應的視圖文件" `1 {* `8 Y* X0 y
    配置語言服務7 z: c: y: L# q0 x: f2 ^6 b
    根據需要調整模組檢查邏輯
    + ]1 W. y8 }0 o
    7 A. F4 u5 n1 B( y8 U$ V- v7 u2 L需要注意的是,你可能還需要:
    ) ?$ F( O8 y0 q( Q3 A- R- F' X8 e
    % L  Y- l+ k5 S2 J! i# b& W9 q創建相應的視圖檔(在 app/Views/ 目錄下)6 y$ o1 @% n' m; I: Z+ Q0 M
    配置適當的中介軟體來處理會話
    9 t/ @; ^; M; r0 G: h實現具體的登錄邏輯4 }( N( k# @. B: O& ^
    $ {3 z: E# O7 R4 Y: u- @2 J
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    ; r3 K' R# o# A$ L$ h% b0 A* T9 X
    1. <?php
      1 p/ O& X$ i/ s- |
    2. // app/Config/Routes.php
      3 m+ i8 A, Z& w; |" K; M
    3. namespace Config;
      & `* N2 R) q, M7 ~% C
    4. 0 A# y( P, H* R
    5. $routes = Services::routes();
      * D' ~4 Y8 `' M
    6. $ \/ ~. p$ p7 S) c8 d, k
    7. // 添加自訂路由規則/ X7 I0 N8 n0 `* P- |' P
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {" K  t$ M0 s4 o+ e' |* P( [
    9.     $routes->get('/', 'LoginController::index');" n$ I6 }2 |) ^# G+ c
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" Q1 G4 ^) z# e" r. a* g' L. N
    11.     // 默認路由處理& {+ j6 [" \8 \
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      * w5 m% b( l2 r1 b  u7 l6 l% L
    13. });
      & F( c: _( a, Q8 e$ t- ~2 P, a
    14. $ o8 W7 k2 }1 t1 p# w
    15. // app/Controllers/Login/LoginController.php7 j; u3 G7 t: T
    16. namespace App\Controllers\Login;$ W2 E8 \% z3 @

    17. 1 k) h. |4 P5 ]# F3 c8 n# l
    18. use CodeIgniter\Controller;
      : ?& k: @& ^* e$ Y
    19. use App\Controllers\Login\AbstractLoginPage;# S9 |8 K- {" I3 V9 T0 d2 B2 U

    20. - `% b7 p" T, X7 a5 k* v" T
    21. class LoginController extends Controller: \8 y. Q8 K) \3 B3 R, W
    22. {
      ) F4 {; q, Q  \4 d" w# I
    23.     protected $pageObj;; T8 Y2 J4 \, r0 L3 Z
    24.     protected $LNG; // 語言物件5 ]8 I. b  N& C' V  T; V
    25. ( O) T! W& M5 `" c# i
    26.     public function __construct()
      - _. W; y) Y7 Y
    27.     {
      $ E: \' c$ U4 O! F6 S
    28.         // 載入語言檔和其他必要的依賴
      ) l! d, W/ D6 J  j
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務9 n& N8 c8 m4 Q+ N5 y' L8 e
    30.     }6 C) A* S. V( U9 I  _3 B
    31. 5 G/ X  ^/ n, ^
    32.     public function index()2 R: i5 u/ w7 f- K
    33.     {
      4 H0 x! k0 o$ ~% T) Q7 X$ d
    34.         return $this->handle('index', 'show');
      % i2 @( C. \5 ]7 c( I/ F
    35.     }, x) v! q$ a7 n) e

    36. ! U& L( Y/ h! s- a& c, `
    37.     public function handle($page = 'index', $mode = 'show'); G& H' @* ]9 w$ f  _2 j6 }
    38.     {1 S7 B) `4 X  j
    39.         // 安全過濾頁面名稱
      " i9 H9 U- v0 D$ h1 L+ a) C+ }
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      + N# x( l/ w/ s9 Q: {% ^* C
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ; R6 y% |$ m/ g; q' x
    42.         
      # \) X; L/ ~# R$ D) p) N' i
    43.         // 檢查類檔是否存在" _+ w3 U( A; E; Y
    44.         if (!class_exists($pageClass)) {: y6 c) E, h$ }% q% H% I
    45.             return $this->showError($this->LNG['page_doesnt_exist']);& A8 n8 ~3 O( U. _! ~
    46.         }
      % T7 O' J- X, K: H  Q0 e1 R) u
    47. * O! J6 m* B& ?
    48.         // 產生實體頁面類
      + U$ N; H) v# j6 b& p' C; Y; |
    49.         $this->pageObj = new $pageClass();
      4 ^1 |7 s; S" P$ x) f" P: L
    50.         
      + ~+ Q5 k. z; Q7 }1 o
    51.         // 檢查模組要求* t# q/ X- ^0 F4 c" ?+ N; o
    52.         $pageProps = get_class_vars($pageClass);! J( n0 @3 E1 t, Z: l3 r4 ?; b6 x
    53.         if (isset($pageProps['requireModule']) && - c- P- [2 q% `3 V* _* F' p& A
    54.             $pageProps['requireModule'] !== 0 &&
      . [6 Y3 K, F+ n3 m) X3 P3 S
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {0 d+ o" F" v/ J% B& K
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      % W+ o2 c' U8 B$ y% H7 p* l
    57.         }) b9 D: ]" u3 g; I
    58. ) x. k8 @- \6 Z
    59.         // 檢查方法是否可調用- D# l; I( N% L7 e, @
    60.         if (!is_callable([$this->pageObj, $mode])) {
      , I% |& r$ T! r$ U. \
    61.             if (!isset($pageProps['defaultController']) ||
      7 w- p5 j$ W  @; L1 J
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      $ \# M2 j4 u# e" q; A1 \
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      7 n/ H+ |" b  Y
    64.             }1 ~: k% l( X% z7 b+ T1 _
    65.             $mode = $pageProps['defaultController'];! ~% c# G% \8 o$ _7 d: K
    66.         }
      : n1 T7 C5 j& A5 Y

    67. . w" [$ N" I/ q, h, W3 C1 F
    68.         // 調用相應的方法2 Y2 L0 k& J$ i" p
    69.         return $this->pageObj->$mode();
      1 P0 X5 T9 N$ E
    70.     }& Q7 R$ i! X5 S$ E$ X' E7 Y' t& m; w

    71. % v+ D! |( ~) E5 ~9 o( `
    72.     protected function showError($message)  F* L7 ?! d* r1 w/ s4 e$ E' m/ Z
    73.     {
      6 A1 q( T# k9 k. |) y3 n
    74.         return view('errors/custom_error', ['message' => $message]);' ~" S% t7 h) F  h
    75.     }1 q6 x! I. L# w8 u
    76. 2 R- S, u/ ^& V
    77.     protected function isModuleAvailable($moduleId)
      " r' F: B( g" D. b0 @4 p% g
    78.     {
      ; P! Q) J. u' W  Q% I+ D
    79.         // 實現模組可用性檢查邏輯
      $ l# A: _) P+ x
    80.         return true; // 根據實際需求修改
      / A. D( m' a$ o- L6 ]1 n! T. u
    81.     }
      ! c- h- z) G. y# m3 |
    82. }
      7 Q2 i, {1 g& V, \

    83. ) Y8 |. m9 ^5 d4 I
    84. // app/Controllers/Login/AbstractLoginPage.php
      8 J+ X! Z+ ^, e
    85. namespace App\Controllers\Login;- ]( h5 L$ s  l8 L, ]4 V( O
    86. 3 G" M: e# q' a: E2 U* \7 i
    87. use CodeIgniter\Controller;
      4 y; K+ J2 U/ F, n7 w
    88. # }3 {) K9 b3 ^/ S8 `# b
    89. abstract class AbstractLoginPage extends Controller
      9 W% b5 B; i7 u3 p, G  b
    90. {
      & i5 m% s+ [7 H9 |- x8 D
    91.     // 實現基礎登錄頁面功能
      9 g, @2 e4 u( \3 M- V. q8 `
    92. }
      6 G5 e7 \+ D4 C3 _! w

    93. ; L8 [6 A  h/ ?6 R. a* T
    94. // app/Controllers/Login/ShowErrorPage.php8 E( @# L, ]( X
    95. namespace App\Controllers\Login;6 q3 E) D5 ?# m6 s9 i7 M
    96. - c& L9 l4 H9 G/ _9 J
    97. class ShowErrorPage extends AbstractLoginPage0 e, U! H/ M1 B* J; t( |) E" j$ R$ K
    98. {  v2 P; D0 J, u0 |
    99.     public static function printError($message)
      7 K: k. Z, Q, R! E
    100.     {
      & T' p9 G0 w7 C
    101.         $controller = new LoginController();( ?4 S3 B! J4 v8 Q
    102.         return $controller->showError($message);
      , h4 n$ J# l/ ~
    103.     }
      ; g# E1 D! s( x2 r6 y* J* `
    104. }
      ! t/ o+ g/ G! x) B* T7 Q

    105. 3 _- c) p* e6 [: X6 U* {$ M
    106. // app/Controllers/Login/ShowIndexPage.php
      1 {- k( @7 ^* F8 ]
    107. namespace App\Controllers\Login;% Y& l0 d" ?3 P' J, C* w, q

    108. 5 O8 y; Q0 i0 n9 u/ z/ s9 ]. a2 v
    109. class ShowIndexPage extends AbstractLoginPage0 Z  B3 ]! e9 ?0 y
    110. {2 B6 U+ b6 j: ]8 Z" z
    111.     public function show()
      $ u( Q8 v: ]. @
    112.     {( G, M1 p- Z3 M) }% ?) o
    113.         // 實現登錄頁面顯示邏輯& Y0 t( q  f+ D' J" U" g% R
    114.         return view('login/index');& O3 ~4 L& \. _6 M: y
    115.     }/ e8 w3 A, u8 U) l
    116. }- w4 V# ^8 g% h( x1 w, `! D
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-3-3 03:35 , Processed in 0.007092 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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