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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14307 / 14307

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    1 L! V% I$ K: @) b4 j# ]) A# X5 hAI 就是站長的最佳幫手。! z1 ?5 m" z2 Y) s- J6 T! e. F
    9 Q; k. H- Z& {, z: r0 B9 X
    & Y! q$ j5 y6 ^1 O
    這裡的「新架構」是指後端的架構會有大變化( u9 N  {. m  m5 F8 s0 u
    但前端的 UI 介面玩家不會感受出來有何不同
    9 }8 _, }! X# x
    3 Z5 [# V! G2 t8 Z. b+ m1 V$ O# s! _; }  ~! r; P
    為什麼站長要改成新的獨家架構?: j$ ~/ U) ~& y5 V5 W& p4 r8 K
    就一樣由AI模型來解釋清楚吧。
    7 \7 [$ P. T, E7 v5 U! a
    ! d4 t; M2 q! I# `5 q9 N# l; B3 Z: {$ }1 F% ?: j; g
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    ! Y: H8 \3 e- ^純 PHP 的優點:. g) D1 c, N: j/ i* v
    1.        性能較好 - 沒有框架的額外開銷, ]8 t/ j( d5 J. Z1 |1 ?* a
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    9 n% a% i* r. f# k8 l' |: B+ }! i3 B3.        更靈活 - 可以完全按照自己的需求來設計架構
    " V/ B& u4 [/ n9 L1 r4.        代碼量小 - 不包含不需要的功能模組
    2 ~9 q: y. C" L2 U# {$ E2 N3 e5.        適合小型項目
    : S0 x2 ~3 N; D9 z# I5 K純 PHP 的缺點:
    : r. V0 @% Y  }+ n# ]5 m* r6 y* `1.        需要自己處理很多底層細節
    . ]! X( c7 h; i2.        代碼複用性差" s" v+ [& @0 w9 T; ~2 ]/ K4 c# F0 [
    3.        缺乏統一的開發規範
    ; g- R$ w) q0 V+ j% y1 Z4.        安全性需要自行考慮和實現
    5 d2 ]' i8 v' `1 @7 s5 [5.        開發效率相對較低5 ]0 N  u( k* A" J" F
    6.        維護成本高- @  [  N) _  A' w  [+ L
    使用框架的優點:
    ' \. |! s$ _: s) Z3 D! A1.        開發效率高 - 有現成的元件和工具
    2 K3 F2 g% I- K5 n2.        有完善的安全機制( f8 q! J4 A8 w, I
    3.        統一的編碼規範7 Y( z% o- L/ z( Z9 r
    4.        易於維護7 L, {5 b  E: f  s1 j' E' e- G3 Z
    5.        有活躍的社區支持
    ' r8 \- i+ {4 o1 Z9 U6.        適合團隊協作
    ' ^. Y9 h2 F& P2 f& _7.        自帶很多常用功能(ORM、緩存等)' _# M" f! N9 }7 T" n) ~6 W  G# F
    使用框架的缺點:
    : ~% p  n3 t& g9 {1.        性能有一定損耗$ {+ I8 a# c7 ?, E$ W' z. H
    2.        學習成本較高
    ) N, J4 g; z& r' p; S) o3.        可能包含很多用不到的功能/ C: D, E" P4 t  D4 s, ~
    4.        不夠靈活,需要遵循框架的規範
    % h3 i9 \& x' X7 t) j6 \( h& T  P5.        對小項目可能顯得過重* }. s0 `$ w0 R2 ^% \! z
    建議:2 l/ h, s* b: d/ r8 Z
    1.        小型項目或學習階段可以使用純 PHP
    , K) p' w' i% x0 V' ~+ {5 H2.        中大型專案建議使用框架' z9 A6 {/ H$ c% S
    3.        選擇框架要根據專案需求和團隊情況( u+ f5 _6 p: n- i! m
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    . o7 O5 c& f) O# ?. \0 ?您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    # c* X1 ~# w+ x; E4 c
    # b$ E& s* }) j. o1 B; H
    5 l7 ^5 F* _+ `  B6 T2 N+ V2 P; b8 g* }0 V
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    . {7 d5 B6 p( i8 y9 [4 I0 Y6 I# {: z& @6 J% ~& [7 m" _5 a
    這個轉換主要做了以下改動:! s) B/ A2 _& g* y4 K
    7 o/ M: R0 u# j" F/ j6 N9 I. F7 z
    路由結構:1 w' X1 h" D. r8 T, Y$ z5 `4 d* L% G

    6 s" F. P  a+ s, [( N; E5 s使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ( O0 o# Y  L. b" U支援原有的 page/mode 參數結構% H" Z" m0 L: M4 W0 t
    通過路由規則自動匹配到對應的控制器方法
    ) ]$ O) [1 ~/ i- c
    0 u, E, y8 d" S0 e1 x1 y
    8 Y8 }* T6 i  l- j控制器結構:$ r3 f' e0 Z% s
    3 H2 q4 d0 U! r7 L4 y9 R
    創建了主要的 LoginController 處理所有請求6 T, v  J+ P6 u9 A. J2 g1 a
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    6 i5 X" s+ d1 _9 U  L( A) v: Q8 T$ c/ g錯誤處理改用CI4的視圖系統
    9 H% P& P7 o; D
    0 F# C# |# [8 {9 r8 a6 }, W3 C! G8 t# n& D& V
    類的組織:# E* {/ f  P! l
    0 I; C- B) G* [) w7 A
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    / i4 Y( d! m4 n, H保持了原有的類繼承結構$ V% z9 e' r1 c" S; c7 f' C
    改用CI4的控制器基類和特性
    2 {' d9 J" S5 G9 R
    ( O9 W% M- I- B+ K& {# a' e$ Q4 W4 Q% ~; A! M
    改進的安全性:
    1 b* L: {4 @6 f+ `, p& G  U
    ; X& q# \9 n9 n' |' y$ r9 L& w8 ?0 Z使用CI4內置的安全特性
    7 g9 B4 b, L# Y6 p( N更嚴格的輸入過濾$ X) F5 L6 Q8 f
    更好的錯誤處理機制
    0 D2 t* D. y2 P  E' G
    : @8 u# F( [; [% M+ q5 I
    1 w% ^/ R8 C9 n- e) Z+ d" b! n* y6 R( M  `3 J' ]0 P0 e
    要使用這個新結構,你需要:4 ?7 o2 K- U9 E( P% ~- G  \
    % V' K$ J) O. Y. b- b! K3 o
    將這些檔放在對應的CI4目錄結構中
    % R7 _. s$ \- o4 r9 }8 L確保創建相應的視圖文件
      X7 w" ]  |4 E6 e4 i! S8 Z9 l配置語言服務5 K* u9 K9 G5 E8 O7 V  V% D
    根據需要調整模組檢查邏輯
    2 p6 q9 n5 j3 c# _. Z) J3 D' T$ [$ A! q% {6 @/ j- {/ f
    需要注意的是,你可能還需要:
    ; _) @" c+ @% ]% j
    / ^7 p; c0 a' I8 R7 d8 l0 `創建相應的視圖檔(在 app/Views/ 目錄下)
    " h9 j; B, ?" O+ w  a& l7 y配置適當的中介軟體來處理會話
    2 }, R2 W6 b8 G' \實現具體的登錄邏輯1 ^2 x1 S: o6 V

    # w9 y: B3 U% ]需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    * B9 V9 M# Y5 p  \7 w- R7 c. f1 h9 a
    % ^7 _2 V- f6 ?& \
    1. <?php/ K- @1 W& q4 l3 H$ s0 i" j" M
    2. // app/Config/Routes.php: L7 l0 ~& ~# g
    3. namespace Config;( A, y$ ?, M6 h

    4. + u' S" H' f- N) ~# s0 `) k+ x7 _' M
    5. $routes = Services::routes();7 S3 {; i3 @6 W$ M! F: R$ m
    6. # W2 O' {+ T  X: ]& B
    7. // 添加自訂路由規則
      5 L4 U' t9 N7 }0 f( @- s, l
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' C/ r4 @8 J# |2 z7 ~
    9.     $routes->get('/', 'LoginController::index');4 g4 i, q% {' ^
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      - w( A/ l( |8 ~- v/ @0 `( i& v8 R  `
    11.     // 默認路由處理" N5 J- Z- z* x
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      # k/ s+ O  D; t
    13. });
      , p" }2 ?# z4 N! J  H, h( e# A( u
    14. 4 F- d! L3 C% ~; t. x6 }
    15. // app/Controllers/Login/LoginController.php
      ' X) u9 b" r2 T0 h3 o0 ]
    16. namespace App\Controllers\Login;
      & h- R1 t2 K  D) V7 l- [/ u: {

    17. " f2 d+ q# B" B2 g" Z2 O4 `
    18. use CodeIgniter\Controller;) w! k0 E. ?9 `1 S
    19. use App\Controllers\Login\AbstractLoginPage;
      , m+ O$ Z) r" d5 f4 @' O) ?

    20. - V: w* @5 k. o. q5 {; m2 l0 i' I5 {
    21. class LoginController extends Controller
      6 l% x$ I: E  Q' O' Z% e
    22. {
      * \2 P1 n8 b4 i6 h
    23.     protected $pageObj;
      6 Y+ A2 n* B7 L/ q% p/ q
    24.     protected $LNG; // 語言物件: {4 |$ g7 d- b

    25. ) r5 t% W/ ?' o7 _3 j# Q
    26.     public function __construct()
      ' e9 a: j2 S: ]% Y2 j
    27.     {
      4 J" e) U% Q1 Y2 Q/ h; w5 V9 G3 n
    28.         // 載入語言檔和其他必要的依賴2 R. l8 J/ x, _- [) I7 p0 W
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務1 T( y4 H! \; V% h" R) t
    30.     }
      , h4 [) U" M6 q: x9 H) H

    31. 7 s  n. C7 P( @2 t
    32.     public function index()
      4 m. _% l9 [8 V; K' ^
    33.     {9 s. k4 V" q8 U) Z1 L# S) @0 [9 s; v" a
    34.         return $this->handle('index', 'show');
      6 z. m8 k  N3 v$ G
    35.     }
      # Z) |1 m) A1 {
    36. 0 D  S$ ], F- N) ]1 D& b
    37.     public function handle($page = 'index', $mode = 'show')
      # W% F" e! I5 c
    38.     {
      . v  H2 I% f5 e/ s# c, c$ Y+ y
    39.         // 安全過濾頁面名稱; ]6 e% {  k( c" k9 ~7 u
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      + R1 y. m; ~7 N3 B7 T$ O
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';/ m- m$ x6 Z0 z0 \8 J: k
    42.         ) j' K( L1 O5 k' D' a) X
    43.         // 檢查類檔是否存在) Z& I7 d: a8 i) R
    44.         if (!class_exists($pageClass)) {! P0 i7 x! ^. u* o' H0 m( b
    45.             return $this->showError($this->LNG['page_doesnt_exist']);- d5 E1 B- X! f* S
    46.         }8 o* v& H8 ~- ]9 [9 X/ V7 f

    47. / U: K9 x* `1 j' J
    48.         // 產生實體頁面類
        ~2 W/ Q. R: G, p
    49.         $this->pageObj = new $pageClass();
      4 E( o% M) o* p$ H4 g+ U: {
    50.         
      3 W/ A; }: v1 P* q2 y
    51.         // 檢查模組要求
      % @% Z% W( `, |6 P0 V9 S& U
    52.         $pageProps = get_class_vars($pageClass);
      : R/ e1 Z7 l8 O7 H3 y# n
    53.         if (isset($pageProps['requireModule']) && 2 {" Y6 V+ x! w; u" L9 _6 Q7 j
    54.             $pageProps['requireModule'] !== 0 && 9 k8 K, D4 r; v' k: k
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      4 [5 w5 V0 t+ o, U! \, R- V
    56.             return $this->showError($this->LNG['sys_module_inactive']);7 P% |& a$ ^5 w. }/ ^
    57.         }
      ' H) p0 p; F; q6 h% X

    58. " f! q5 P: X0 K; ]6 p
    59.         // 檢查方法是否可調用2 ~* r* u0 o  q8 l0 p% c
    60.         if (!is_callable([$this->pageObj, $mode])) {
        ~/ g  w& c* d% d4 |; U
    61.             if (!isset($pageProps['defaultController']) || ) g2 w4 L  @% w$ @. H. i; B# @
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 Z7 i' `7 o# c# @- g
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);4 {/ v0 Q: U) k% w) d; r: m8 ]
    64.             }
      8 e! H8 l: v! q* k$ a2 {/ Y
    65.             $mode = $pageProps['defaultController'];
      $ y) ?; I7 D- ~2 Q6 c( x$ x
    66.         }/ ]' R/ ^. v4 `. |1 `5 ^2 L% \) l
    67. ) e0 h- {4 [' K* n7 W: [1 D. \' @7 v
    68.         // 調用相應的方法
      ' h( |" a- p2 e1 x4 l7 d1 Z
    69.         return $this->pageObj->$mode();4 N' M4 h4 a( N) S' w+ O9 P- m
    70.     }
      : _6 M- h, }- c. _2 ^7 }/ f6 }
    71. , E' i) ?$ i2 D1 n1 C5 m7 A. G
    72.     protected function showError($message)& m# ?% {! s$ C
    73.     {
      ' f; X. q; j% |- A4 V4 Q; Z! Z4 X
    74.         return view('errors/custom_error', ['message' => $message]);; z9 E6 b6 T5 F$ C5 |$ ~' w
    75.     }& ^9 p* i' g. I$ t; Y) |- c

    76. 7 j( {  h" }/ R8 `
    77.     protected function isModuleAvailable($moduleId)
      $ o/ h% h, S. d6 s: p7 I
    78.     {, p  |6 x$ `- B. k8 U6 g4 i
    79.         // 實現模組可用性檢查邏輯" l6 a$ w8 Y2 p2 A+ B6 \
    80.         return true; // 根據實際需求修改
      4 @& y: q) c( M' e
    81.     }* [' D& Q6 l. E! V
    82. }; A  I" C5 Y9 X0 w, T

    83. 7 g% k  s! A9 l
    84. // app/Controllers/Login/AbstractLoginPage.php; ^. Q  `9 f1 r1 w6 d% `
    85. namespace App\Controllers\Login;
      + a& n3 i) I5 e* z% o' D" R
    86. % A% `; {! \9 H& B$ _' _1 Q* P1 t) q
    87. use CodeIgniter\Controller;: b& a' U  k1 D/ F1 W$ |. I: U
    88. 6 p2 K8 k" Z0 f9 m3 [
    89. abstract class AbstractLoginPage extends Controller
      " B& [5 H$ g% ]+ F
    90. {
      + |# k% L. M1 v( N3 `5 r
    91.     // 實現基礎登錄頁面功能3 g0 j7 J! S7 b0 p% v
    92. }. S& Z: I4 ]3 b- {/ A4 |
    93. : V' W: g. s) i* p) M8 ?8 v3 h0 R) e
    94. // app/Controllers/Login/ShowErrorPage.php
      9 y- H# O- G! y! q3 E" ]* _
    95. namespace App\Controllers\Login;
      " [5 G4 K- U: y  Z4 R6 D
    96. $ ~) Q, K- x! ^7 u
    97. class ShowErrorPage extends AbstractLoginPage
      4 B% d9 ~5 F; i, N# \# [
    98. {
      9 ^* Y. |: x1 [# ~( T* v
    99.     public static function printError($message)
      8 I: v$ G; D/ l' C6 C/ i4 b# _2 b
    100.     {  M/ H. d: _1 [" n& a
    101.         $controller = new LoginController();$ b& f" `0 s3 q
    102.         return $controller->showError($message);
      - M- K/ K8 e' J6 l8 Z
    103.     }) g" p, g. G7 F2 j: d
    104. }
      . c! F9 e$ i+ z0 z0 K; @, U

    105.   Y$ H7 f3 K$ ?& {
    106. // app/Controllers/Login/ShowIndexPage.php3 W+ S  z  [+ ?* {4 ~- y" X
    107. namespace App\Controllers\Login;6 b9 d( d' b$ K& k0 q
    108. 4 U0 }/ k% ]; T
    109. class ShowIndexPage extends AbstractLoginPage
      # m9 H- f) p# u
    110. {7 F9 [/ Y% L+ O: F% H$ X: D
    111.     public function show()
      7 A, ~% _: }& F
    112.     {8 G. n$ G" c$ s) G
    113.         // 實現登錄頁面顯示邏輯' d# R5 |& F% v$ k
    114.         return view('login/index');
      2 F4 F$ r' \! h9 J2 p/ G  }
    115.     }; q$ P$ P) f0 u3 _7 Z/ b; T3 g
    116. }
      " g& Y& h: q) ~, h8 {
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-11-3 11:14 , Processed in 0.025999 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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