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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14520 / 14520

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致8 P7 ?$ S" V2 M
    AI 就是站長的最佳幫手。
    9 {) h5 F1 F; a6 i; N* O1 `; D5 Z& ?5 @: u9 Y& m

      C; P( F7 L2 t' @這裡的「新架構」是指後端的架構會有大變化
    9 U6 @6 O# c4 u, V( G0 z9 R: J但前端的 UI 介面玩家不會感受出來有何不同
    8 u2 F8 H1 @4 i  v; j
    & z* K. s& A& }* b* @$ P( Y$ q$ o: [; `+ P# A6 G7 E
    為什麼站長要改成新的獨家架構?" {; g9 C, X8 r3 \& D- d% H
    就一樣由AI模型來解釋清楚吧。4 K3 G- T3 R1 r$ V9 N* e& o& j

    9 _1 a. Q5 U" v( c( a1 [6 f" w9 @! @4 P
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    % {, G# W9 l8 a8 V: n純 PHP 的優點:
    , E/ e# c8 p" c: K( ^- Q; [1.        性能較好 - 沒有框架的額外開銷
    : c9 c. g9 F0 S0 u# E- R4 k2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    , y! }0 t% x" |& X0 e3.        更靈活 - 可以完全按照自己的需求來設計架構% x% c" J1 S- ?3 K- @5 f
    4.        代碼量小 - 不包含不需要的功能模組
    ) P0 e/ {" F: e" l: X% u2 Z5.        適合小型項目2 ^( y  X! w/ B
    純 PHP 的缺點:
    & r0 t3 o3 f$ L" A$ d; L6 ~# E1.        需要自己處理很多底層細節
    " ?. a& X. o* y5 O3 V% Q2.        代碼複用性差
    ( ~: G" V) [4 k  s3.        缺乏統一的開發規範* a0 k1 _) D" {2 F/ C' D4 T) M
    4.        安全性需要自行考慮和實現% z) g7 l$ z& P: m
    5.        開發效率相對較低
    $ U6 y- y, x, _  M/ E# Q# l% Q& ^' k6.        維護成本高
    ! k7 H9 S; M$ C使用框架的優點:$ W1 u( M3 E& A$ a
    1.        開發效率高 - 有現成的元件和工具
    : V- }) m, |; R% x# b2.        有完善的安全機制& i, x0 b3 b/ P! e. ?1 `. P; T
    3.        統一的編碼規範. g' W! k) R9 J# l/ ]
    4.        易於維護
    . ?2 B" Q/ z. w& ^: s) H+ q5.        有活躍的社區支持
      V  e( h1 G! O5 f# [4 a6.        適合團隊協作
    * |* @% R9 T/ k& |7 ?! h7.        自帶很多常用功能(ORM、緩存等)
      h- W& ]# g2 H使用框架的缺點:
    6 b- \' ~* X" h3 r1.        性能有一定損耗
    ' O' c" {- _$ t6 m2.        學習成本較高
    # O0 P0 ^* R5 H& R! z8 ^2 A# h- T3.        可能包含很多用不到的功能
    3 C0 Q# |1 [1 I0 _. D  B4.        不夠靈活,需要遵循框架的規範
    $ N! L" v5 A7 J2 H7 @/ M" _5.        對小項目可能顯得過重# v9 I- Z7 p! S+ G3 K0 o! a
    建議:, x9 S7 N: \, |$ _) t4 x, S1 Y
    1.        小型項目或學習階段可以使用純 PHP1 o' U# ~; y0 A4 }5 ]3 E  l
    2.        中大型專案建議使用框架/ E0 M& F9 Q/ z
    3.        選擇框架要根據專案需求和團隊情況7 r! w; H) N9 O0 v" V: b) H: V/ i' u
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    ) P' h$ H0 {  F' A* l3 z+ d您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 \% Y5 i% e( g$ |$ }, y

    $ ^  S( [4 @: Q" q! r% F" C+ Y. h7 f) n- `" ]
    ( W/ U& d6 S& {  l
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    1 f) w$ H: M0 y6 ~! G9 l3 Y7 e) W" P) Y8 ?+ g, I
    這個轉換主要做了以下改動:
    2 S8 H; ~0 ~0 `6 H0 I. B* ~; b1 w9 m+ b
    路由結構:0 r  u6 W/ ^- o, H. i
    # ]+ M0 ?- s9 y9 Z; l. W
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ; F$ S9 I2 ~) i2 o- C支援原有的 page/mode 參數結構: d, r" N9 ]# c% {
    通過路由規則自動匹配到對應的控制器方法
    : F9 b& [: `) m
    $ S9 x) m; `9 d7 t
    $ V3 C* C: H! e! z% X控制器結構:4 L! J+ k! E8 O8 R7 M; [! ?+ F$ r

    ( E/ C8 S2 c2 h) w( ~創建了主要的 LoginController 處理所有請求6 C9 `. I/ m) I5 d  G
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範6 }3 @8 P0 O/ J# H+ k6 r0 U
    錯誤處理改用CI4的視圖系統2 F' j. X6 d3 v% M; g
    9 L4 K+ {) r! V1 q# g# H" @2 y
    + e. x9 v& M  i7 t; }
    類的組織:
    # f0 J3 @4 m+ o7 c
    / l$ \; P/ X& K: ~所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    9 W  x3 n$ U& {$ D+ d保持了原有的類繼承結構/ e. y. ^' ?; ~& m3 V+ C+ _9 @# b
    改用CI4的控制器基類和特性
    0 t# u, [7 L0 d' F2 K
    . `+ P9 m& l2 u
    1 L( j( V! U8 {改進的安全性:# p1 f& I  E$ S6 c7 z
    5 H$ z4 W8 T; a
    使用CI4內置的安全特性% O+ W) G8 s+ v, h
    更嚴格的輸入過濾
    ) Q  w- r: z6 H' _5 d# F6 E0 {; s更好的錯誤處理機制% d0 y. _9 G% C9 j4 B$ i1 G7 b5 J4 g
    ; U# G! C: ^) z* O* q" u2 C2 p

    . ^* V9 k2 x7 G5 f2 _, N+ ^: r/ y5 Q
    要使用這個新結構,你需要:
    ) l# W( l! ^. i& [. a# r/ W" d) a  I
    , r2 ]5 n2 y0 r/ M5 _. ~將這些檔放在對應的CI4目錄結構中- o1 `$ |- n& a" n! C+ H
    確保創建相應的視圖文件
    6 v) J$ M; [7 N# ?: A$ \5 G配置語言服務
    / G- i5 y. u8 p6 u1 V根據需要調整模組檢查邏輯
    3 y% Z- \1 v3 N1 W+ [0 o* V; d0 N4 v8 P' ]; }5 v# g/ b- u  ~; k
    需要注意的是,你可能還需要:. ^( Y1 H! I+ U% o! `  n9 M
      s2 Z. U3 q" }2 k, L, M
    創建相應的視圖檔(在 app/Views/ 目錄下)
    ! t, \6 n2 r4 Z0 a配置適當的中介軟體來處理會話
    + f5 p0 Q& C. |# i實現具體的登錄邏輯) I, Z# Y  G" ~) q' f9 p3 I
    1 {% k- {# f3 C& L- w3 ~
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?/ d4 ?* X2 d: s( ~: f

    ( s" ~, S# H" P# y- o% d. z% q4 H
    1. <?php& V7 h/ R: k. S$ _2 S
    2. // app/Config/Routes.php
      " t6 K3 v# V' g* p7 @4 t9 y
    3. namespace Config;
      8 ^- k3 x: |/ R7 a

    4. $ q  w. [6 d7 y* m# A; q, E
    5. $routes = Services::routes();
      9 i( o1 G4 d1 n* w
    6. 9 A. U- i4 c! H* @6 m
    7. // 添加自訂路由規則+ u( ^: g! s& ]0 d  k
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {6 C) c! d; Z" }) c7 J
    9.     $routes->get('/', 'LoginController::index');- v/ I0 @" [8 m: X" w; y
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');2 ]8 Q+ q, C, E- V, Y
    11.     // 默認路由處理# k2 s0 X4 |- h4 W
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      " ]3 L  @: Q7 T+ {# p$ p, \7 k5 }
    13. });
      ( i! y- q+ C; h& r  `
    14. / H+ `7 P9 }; \+ U3 x" B
    15. // app/Controllers/Login/LoginController.php
      & ~5 c# n0 t% Q9 C
    16. namespace App\Controllers\Login;
      ( _$ W2 U, T7 E* L8 }. K9 t1 r

    17. " X5 E4 h/ I, J
    18. use CodeIgniter\Controller;" d! V5 B$ O6 B8 e- Y9 f
    19. use App\Controllers\Login\AbstractLoginPage;4 S' g# S3 q8 }: W! s
    20. 0 T2 L6 d5 V8 a+ K7 p
    21. class LoginController extends Controller
      ; h  e6 }( R! A
    22. {
      1 s# q& L. w; z. ?% [. R* I
    23.     protected $pageObj;+ e4 o4 s: U8 E# n/ Y; m
    24.     protected $LNG; // 語言物件9 v! Q3 W0 e3 `. `: }
    25. ' }6 O% b) [- A1 g$ Y  r. v& Z0 C
    26.     public function __construct() / H; k: `* \/ y8 ~/ d) n
    27.     {$ N$ y. M# L5 R" I9 `
    28.         // 載入語言檔和其他必要的依賴
      . F" [! e/ f- K2 Z) b
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      * g/ A, u& ?# v' u# c
    30.     }$ n6 }7 I% H/ |
    31. 9 F# H5 {) v6 z3 g* u+ r
    32.     public function index()4 Y* n" G; |# G+ r, S* s. l9 f
    33.     {% S7 L' o' z& J! |+ z# [
    34.         return $this->handle('index', 'show');
      6 X. B% |. A  J8 d/ X/ M
    35.     }
      * _7 S9 \9 g# v; E5 v9 ^( |* |

    36. - ~. M0 E  Y3 {$ E, M6 t
    37.     public function handle($page = 'index', $mode = 'show')
      $ e0 c) k) w7 D6 D" g
    38.     {
      ) e  Y" D- W  D
    39.         // 安全過濾頁面名稱
      % o' _  }; v3 k5 n1 X# D, T
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);3 s4 x' D8 ?/ D5 [; {  H
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';3 m6 n2 a- }2 S( ?' _
    42.         
      & d  v' Y' S1 d  V1 U: C
    43.         // 檢查類檔是否存在
      4 _0 Q$ g4 j; S7 k  I
    44.         if (!class_exists($pageClass)) {; k: }4 E! B6 W3 R6 q
    45.             return $this->showError($this->LNG['page_doesnt_exist']);  d# R+ l. @; U2 A2 m8 i
    46.         }  c) l- _2 N$ E
    47. 3 j( l# r6 J. j
    48.         // 產生實體頁面類
      8 G, M4 T& R- Z/ M) y1 b! J- ^% w
    49.         $this->pageObj = new $pageClass();0 p1 U* \6 M* D7 ?
    50.         
      # Z# X0 o+ }& ]
    51.         // 檢查模組要求4 E. Q: H3 u  q# v1 \& Z4 `5 B
    52.         $pageProps = get_class_vars($pageClass);
      6 }! ]  a- M9 _( N8 V& G
    53.         if (isset($pageProps['requireModule']) &&
      8 j+ H, P  N9 A
    54.             $pageProps['requireModule'] !== 0 &&   t1 W/ q- \1 V8 {
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      + |7 _/ j7 L" Q/ f, ?8 P
    56.             return $this->showError($this->LNG['sys_module_inactive']);& Z1 R% Z- K! K/ ~3 \) E6 V
    57.         }
      , }. ~6 H0 i6 g3 y

    58. - J6 z+ a9 T, U4 ]7 ~/ p: M8 }
    59.         // 檢查方法是否可調用6 q. Q% }3 o6 @" `
    60.         if (!is_callable([$this->pageObj, $mode])) {" ?' V$ c- k. W$ `8 b
    61.             if (!isset($pageProps['defaultController']) || 1 }8 y+ M8 L" m6 `: O2 ^7 m- M
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      ! s2 K& F+ V6 N9 V4 g7 |. [
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      & i* B- S. T, h" u. u
    64.             }8 n; a% a0 Y" K+ {" [: I3 @- _3 c
    65.             $mode = $pageProps['defaultController'];
      , g* G8 J: J! ~1 B: X
    66.         }
      1 F, g' z' ]8 P" w8 d4 v) u2 K
    67. . S4 Z3 ]7 n* `$ ?$ ]% x( E
    68.         // 調用相應的方法1 p$ v; C# C5 u+ P
    69.         return $this->pageObj->$mode();
      ; f. v) u, F5 E" T! _5 W6 |  E2 k
    70.     }' l4 P: b- [# _8 a' u

    71. : W: @$ L% R0 \4 {/ }& g# c% \' k
    72.     protected function showError($message)9 y1 q, X$ R9 M5 z4 z; }' `
    73.     {- m3 a( B5 `$ H) S1 A! T
    74.         return view('errors/custom_error', ['message' => $message]);0 c( m& @7 k4 H" [4 t  h; W$ g
    75.     }
      - Z6 E0 m, @2 Y& D  }2 h1 {
    76. : X" S' d" Z5 v: k; D7 \
    77.     protected function isModuleAvailable($moduleId)
      # e6 N( o+ V9 u% z- W2 K
    78.     {
      ; Z* \+ F/ p, g! A* J( R
    79.         // 實現模組可用性檢查邏輯0 C( A: y& J% N8 {4 N0 |
    80.         return true; // 根據實際需求修改
      $ H# |5 D. v: W4 q+ z
    81.     }
      4 O' p' P4 O9 H, y. e! @% L
    82. }
      9 S( ]7 D0 `$ p9 T" X; X

    83. 8 `+ @' ^! e9 {
    84. // app/Controllers/Login/AbstractLoginPage.php9 a% U2 i) V: A7 t! v+ q4 s
    85. namespace App\Controllers\Login;
        u% n/ R! F( L' Q/ ~
    86. , @. s6 Z+ c% e6 h$ }
    87. use CodeIgniter\Controller;$ u0 ~, o5 q7 D
    88. # G# U: j9 q7 P' L$ k
    89. abstract class AbstractLoginPage extends Controller! D- b. {1 B9 a* ]4 K! K- U
    90. {
      % R) K! f# F( S3 T% M
    91.     // 實現基礎登錄頁面功能2 e4 r  a3 C% X/ @1 m
    92. }
      * |7 Y  a; r# p- }) V5 [/ c
    93.   B; r: B) d: _
    94. // app/Controllers/Login/ShowErrorPage.php
      ; U8 c. O/ \' c! G8 r% d
    95. namespace App\Controllers\Login;
      / c: n" m. }* H/ z" I5 e- w

    96.   H' l  a# }$ G3 Y2 o7 x
    97. class ShowErrorPage extends AbstractLoginPage
      ) t7 p- G5 Y. Z6 i& ?* }5 }9 B
    98. {
      # Y$ I' A! i% u2 h
    99.     public static function printError($message)
      , ]2 }: T/ A2 q/ r* K' t. A
    100.     {# m: o" Q" i4 t; \
    101.         $controller = new LoginController();
      6 ]6 s6 \- k7 y, }
    102.         return $controller->showError($message);' }( p9 c( P6 z" T( p1 g& s# a* Q
    103.     }
      % k6 i& o& Q9 m
    104. }
      # H& \- u7 W0 A0 ?' N9 w$ y* P6 B
    105. , r3 u0 Z4 W3 B% a+ |+ @
    106. // app/Controllers/Login/ShowIndexPage.php; r* E# V1 O9 F! |( d, ~
    107. namespace App\Controllers\Login;! d6 P: c( d7 W4 V1 T9 w6 _5 C
    108. ( @- B$ M. o) g1 U5 _- A
    109. class ShowIndexPage extends AbstractLoginPage- O3 D8 i0 X* a* ?' B+ M. s
    110. {
      ) Q4 y1 ^. g0 q& t7 A# h+ m
    111.     public function show()
      0 C: H8 L  f1 T" U/ H
    112.     {
      $ |1 v1 X4 j% I, D1 {, m. s4 e3 @! U
    113.         // 實現登錄頁面顯示邏輯) w# m  L3 c: G4 B, c1 [) U5 [! a
    114.         return view('login/index');' Q8 i/ j# x& K5 {/ _
    115.     }' u% ]. M# m$ [1 ]. S8 \
    116. }
      : K7 A- e7 h  {8 ?% e4 S! b! v" R
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-1-20 15:51 , Processed in 0.020718 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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