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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 244

魔法值:13397 / 13397

生命值:4%

升級   100%

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

    [LV.Master]伴壇終老

    發表於 4 天前 | 顯示全部樓層 |閱讀模式

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致; F- U4 Y6 v- d/ {7 B# b
    AI 就是站長的最佳幫手。  h4 m. O/ q( {2 Q" F

    0 q  a8 r- F/ z' T. O6 J0 @0 ?  K* _: M' Y
    這裡的「新架構」是指後端的架構會有大變化
    + y* @9 j1 _5 ]$ x* v" V但前端的 UI 介面玩家不會感受出來有何不同
    + f: i6 I! J  |) f: y; e
    / [6 l( ^9 P, [* g( E) @5 J
    % M, _/ v. W8 o" [為什麼站長要改成新的獨家架構?
    8 G& v( G9 }% U& W! S! B4 q就一樣由AI模型來解釋清楚吧。
      R- l& y7 B+ g4 @9 l) ]# |
    * b5 k  k- T$ r3 q: j3 R. u" `$ M2 {7 z! Q# n5 r
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    $ z4 P+ V/ y0 ^8 c純 PHP 的優點:) b" J/ K! m% m' R6 u$ K
    1.        性能較好 - 沒有框架的額外開銷' f' {3 I) v7 P" @" V' }& c
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識. O6 v  M% E7 h0 ?$ }
    3.        更靈活 - 可以完全按照自己的需求來設計架構+ F2 I5 o& d( }8 r' k3 s
    4.        代碼量小 - 不包含不需要的功能模組
    2 k3 B$ I5 }& L, O* |5.        適合小型項目% N: E, ~8 f: z5 J& x
    純 PHP 的缺點:0 B. }1 l- S8 A2 }, P$ P: g; r
    1.        需要自己處理很多底層細節
    ' `& n0 s; ]; b2.        代碼複用性差: y/ `4 Z, b/ x, t6 i( P) p, p0 L
    3.        缺乏統一的開發規範- d9 A% t7 Y3 |: q0 [0 k* u
    4.        安全性需要自行考慮和實現; d% k; l; `. P7 g7 p% A
    5.        開發效率相對較低
    # B' h7 S( {0 o0 f( h; ^; }7 @6.        維護成本高9 g+ M8 ~( v8 |: [
    使用框架的優點:& V* e2 D5 [4 \8 L8 ?
    1.        開發效率高 - 有現成的元件和工具
    # X, q7 B( P/ Y7 S2 k3 k* V2.        有完善的安全機制- H8 q9 ^2 U. G" @
    3.        統一的編碼規範( A7 G* \- r% ^. h% F' a6 `- p
    4.        易於維護
    6 r0 J7 S2 S$ F- K1 S! K5.        有活躍的社區支持
    ' A7 P  x) r/ ], e8 v& e6.        適合團隊協作
    ) f/ M  |0 E5 |( e! Z0 i8 N7.        自帶很多常用功能(ORM、緩存等)
    : B) F3 G0 G0 g: `, X3 @! d1 g" G使用框架的缺點:
    1 h4 F5 O( j" {% m8 J1.        性能有一定損耗5 }; o( e: R  b; B; y2 K
    2.        學習成本較高( I4 M. K& o% U! ^' E6 E/ C
    3.        可能包含很多用不到的功能
    2 ^& z3 V# h* x( I3 c/ l5 @4.        不夠靈活,需要遵循框架的規範
    ! q8 f; t7 Z( q" v& N5.        對小項目可能顯得過重
    # O7 W6 z/ Q; z! u( T, `: d3 Z建議:
    ) M) e, g2 p4 ^2 K1.        小型項目或學習階段可以使用純 PHP
    ) K( a+ e5 e$ J# U6 }; h2.        中大型專案建議使用框架% B& x5 N1 u* T  T( ]6 h; P
    3.        選擇框架要根據專案需求和團隊情況
    8 P2 ?% c* h  l6 K2 w4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    . u5 j# s, P  g1 h您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    ; H& r. g* s$ x' E& ]5 `) s% t: A. @8 v- r

    # k0 a  o" }1 u* m) \& x9 B
    $ Y# t4 {  y; Z! j我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    5 U- K" K/ s9 J2 f
    * S7 V4 J+ E0 I2 o4 Q這個轉換主要做了以下改動:$ |! v1 g: N! C9 x: g! |

    ; ~" E) e% ]- T' T- q路由結構:
    ! r& s$ ^9 _7 c; i) F( u+ K9 B7 _& i: ^( h& l# }, z/ s
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    : l3 [2 d+ N- L0 j支援原有的 page/mode 參數結構
    . m/ G  ]4 U: C/ }" O3 ?7 y通過路由規則自動匹配到對應的控制器方法" \' Q: I! m: Z) ^2 \
    % ?5 J& ?; M8 `; {1 y. a; p5 h; J
    * g% x- y1 y( C/ l* [
    控制器結構:
    5 K. Y( ]% i& }
    / w+ y. ?  y! q: K% }! Y5 w; _$ @創建了主要的 LoginController 處理所有請求5 Z% {2 c; \6 z* I+ ^7 g, W7 ~
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範# @! i- _( {% Z  ?( S% I' d  f! V
    錯誤處理改用CI4的視圖系統
    + |" }; J8 ^# f% R
      S) _7 p# B; e* d" u/ J. y
    $ q. N" _# j% ?" ^. r類的組織:
    7 R' V! F* U+ u* c; T2 C
    5 o. F2 {5 S# _/ U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    / i% m" z. @. {: d5 _3 J保持了原有的類繼承結構
    ) e0 X3 S. C% Y* V$ I8 x改用CI4的控制器基類和特性6 Z3 g, j! r5 J
    ! Z6 X, N* Y% o- z$ h, y
    ) y8 y8 V& E# z2 N1 Y5 U, ~! v
    改進的安全性:( X, N% N: K  [( W
    1 N, |2 ]& E2 g" Z
    使用CI4內置的安全特性, R# u0 s+ W/ v5 X  Z* {3 s: _
    更嚴格的輸入過濾9 z$ }* G5 }/ r' j: l7 `2 i
    更好的錯誤處理機制
    % b6 O5 @; i1 Y( N! _( D
    " @' q9 \$ o% R: e+ a! b. F0 m
    - Q- O! u6 o1 R, m8 ?! n
    + f7 r5 e9 g$ Q3 y- Y( r9 C. }, [要使用這個新結構,你需要:- }" e$ |& `; M6 B7 z
    * m3 W2 a* D/ s) F0 z: t! C
    將這些檔放在對應的CI4目錄結構中( c$ f! P) ?4 }. P$ t6 Y
    確保創建相應的視圖文件4 I+ R: D! U% O+ b
    配置語言服務: w6 R' O( R" _* y# Y
    根據需要調整模組檢查邏輯
    1 Q: a/ H4 a% c6 R3 O/ W4 Y6 o- x7 ]" V" l  F# k/ @! |9 \
    需要注意的是,你可能還需要:
    : G3 H0 \1 _; {" X: C3 o
    ! U, C9 g9 o3 e) b創建相應的視圖檔(在 app/Views/ 目錄下)) u7 Z: U# s, N" G) ~  B
    配置適當的中介軟體來處理會話
    3 s" A: ~, E3 G6 J9 I# g  C7 L! S& v實現具體的登錄邏輯5 B; ]) _4 x) C' K3 v/ H1 u; q

    & \5 c/ S( m' L( [8 F$ d( d需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    6 J. y1 v3 ^! o7 ^/ I- @1 @- z; ^. D3 F3 y
    1. <?php
      * {, K% I' X6 y, R% }
    2. // app/Config/Routes.php; M& P! N* V& U
    3. namespace Config;9 F: k/ R) u( S( x7 n; ^! L) S

    4. 3 f9 U, u! F+ _5 O' S" Y
    5. $routes = Services::routes();0 }7 h4 V8 ]( L' O4 `

    6. % t2 O$ d6 N6 Z# w# U
    7. // 添加自訂路由規則0 H( ?% Q# Z8 g7 r
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      3 l# \  X6 t" j( x, E0 u$ H" e2 v. u
    9.     $routes->get('/', 'LoginController::index');
      , Y) \0 o7 K, b' d
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');' `7 }3 C( \! O$ L
    11.     // 默認路由處理
      0 X" o% H4 p! Q* `" L: G
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      - q& ?% l4 N% t1 @, E: V4 Z
    13. });& A2 j4 }  k6 m/ N9 T3 l8 D7 ?

    14. , W4 R) ^; K& s4 n
    15. // app/Controllers/Login/LoginController.php
      4 c, s; C& d2 |, [/ z
    16. namespace App\Controllers\Login;
      8 {* f! L2 w$ X2 R# ~
    17. : q/ Y3 b, X8 [! j" F. x& }* T
    18. use CodeIgniter\Controller;
      8 I& L; j; v/ W0 Q0 }
    19. use App\Controllers\Login\AbstractLoginPage;
      7 Y1 Q. ^; ]  U8 a: {4 C
    20. 7 M) Q: F$ A6 N: }
    21. class LoginController extends Controller8 w7 h3 v2 T7 O" n3 u8 V
    22. {0 B9 d8 P. }! ?* F; F& O
    23.     protected $pageObj;
      , N( T0 G( p# Y3 `4 x7 r
    24.     protected $LNG; // 語言物件0 V4 c0 H! y& V
    25.   ]( }6 Q, }) E, q. N
    26.     public function __construct() / B* E8 w) e1 m; N
    27.     {; l5 j: b, N) u
    28.         // 載入語言檔和其他必要的依賴* }! W; i% Y5 J% [6 \9 A
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務; ^) n1 r0 E1 G
    30.     }/ `) t% z# [7 o, U2 x# l- y

    31. ( |$ p  ?! f* X, P+ p& p  e) }
    32.     public function index()
      % K5 W9 X, ]8 m9 E! J4 u
    33.     {' F- i0 l/ G' |6 v5 W
    34.         return $this->handle('index', 'show');
      1 p  l+ Y5 K; {1 o; |& j% {
    35.     }, q2 Y! i3 |% N% C* T. T3 h
    36. ' ?( Y9 W6 j1 B$ C8 i4 [: `% G
    37.     public function handle($page = 'index', $mode = 'show')' m8 ?) d. Q- k4 R
    38.     {: n9 n' J4 y: Z6 Z' K
    39.         // 安全過濾頁面名稱7 B6 v3 o5 x! x$ H3 p
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);! B' X$ j7 F6 R+ p3 B: m
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      0 _- f1 f8 D" |1 @4 `
    42.         
      7 O+ W4 r1 ]* g% Y3 E- |% m- Y/ V
    43.         // 檢查類檔是否存在
      4 n1 y# X* G4 W' k. G) C) v
    44.         if (!class_exists($pageClass)) {
      # E$ [3 @/ e' m
    45.             return $this->showError($this->LNG['page_doesnt_exist']);: e4 u& p- h9 r* U0 m5 |
    46.         }
      2 v# A3 G- n! z1 v: M& D
    47. 4 q0 F" g9 r( z& n
    48.         // 產生實體頁面類! |& I/ ]* R  D& e- A
    49.         $this->pageObj = new $pageClass();
      . o& ]# {& B' C0 r* ]! M. S( t
    50.         
      7 m! \0 U& c- D1 X, E
    51.         // 檢查模組要求
      " z2 U; J0 u+ C3 y1 }$ R
    52.         $pageProps = get_class_vars($pageClass);" K3 V( c  }) K
    53.         if (isset($pageProps['requireModule']) && 2 _/ f+ r% L  ?' n) `, i1 W4 C
    54.             $pageProps['requireModule'] !== 0 && $ u5 u  C. [* P' Q. y2 w9 d
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {. u9 E( E9 _) G5 L  Z) S) i* B, k  s
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ( z, g7 ]4 W; J% ~
    57.         }
      * t8 @6 y# x8 }& r

    58. ( ~0 O0 @' i1 M! V% K9 W1 P+ x5 M2 V
    59.         // 檢查方法是否可調用2 B: A4 B6 K( K: p2 l7 k
    60.         if (!is_callable([$this->pageObj, $mode])) {( Q3 c; W5 M$ e) o: [, e
    61.             if (!isset($pageProps['defaultController']) || : w7 t( ^4 w4 g5 y9 u3 E) b0 S4 K
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {! o: D0 m: {4 m2 n/ }
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      $ P/ S2 z- Y0 E2 o' p
    64.             }
      + y6 o% K/ B. L4 y
    65.             $mode = $pageProps['defaultController'];
      ) i2 |3 k7 @# {! F
    66.         }
      4 `  C% Z  h- N; ^9 E# ~

    67. " Z7 y$ C4 `! P( k: v
    68.         // 調用相應的方法
      " o) w6 W! L7 z5 t
    69.         return $this->pageObj->$mode();- o) y  c3 Y' Q+ K0 G: r
    70.     }- t9 L  ?" {" S# k( A5 @% d! j

    71. 1 I# q: l" D/ W2 a* P9 H% Y
    72.     protected function showError($message)+ o7 r0 a0 P9 B4 ]4 I
    73.     {5 m. G) z5 F# ]" W- p
    74.         return view('errors/custom_error', ['message' => $message]);
      9 h. K% c  s  ~% H
    75.     }
      ) J9 s1 @& l0 C! O$ a
    76. ! y4 v& ~/ L. T
    77.     protected function isModuleAvailable($moduleId)
      ; F% L4 ]- X% N2 ?0 y) o0 J1 v
    78.     {4 l, U2 L* D+ {3 V; |3 l& K( @5 x( Q, ]
    79.         // 實現模組可用性檢查邏輯
      3 B# y: U& E! F' w
    80.         return true; // 根據實際需求修改, x& ]# J; c  T2 _5 Y' x
    81.     }
      * H9 ]3 }5 ]3 Y8 F! d+ S; \6 i5 J
    82. }
      * ^3 Y% Y" p4 b1 d3 J5 O
    83. : `- y6 P6 l# g2 N/ X( Y2 G+ Z- `6 H
    84. // app/Controllers/Login/AbstractLoginPage.php
      % |( }! r2 w% T7 |5 T
    85. namespace App\Controllers\Login;
      3 h4 K- a6 o1 r
    86. 9 I* c5 N2 y, l0 w3 b3 s
    87. use CodeIgniter\Controller;! v  x7 V' W8 E& k# C! r& l
    88. ! s! r$ ~  s0 I/ |+ f
    89. abstract class AbstractLoginPage extends Controller3 X- ]6 u# |4 `8 D
    90. {
      : w8 q8 E/ ]/ Q, f: l+ f4 T
    91.     // 實現基礎登錄頁面功能% W+ S% I8 w2 k- I
    92. }& x& f2 V$ C3 v/ S; w! x) v( v

    93. 2 M  `/ g- y4 z7 a
    94. // app/Controllers/Login/ShowErrorPage.php- n6 z4 z/ w0 R7 [2 {
    95. namespace App\Controllers\Login;
      $ L& |: h, o! G: G, d

    96.   a, i: F# a( s5 L+ U. D
    97. class ShowErrorPage extends AbstractLoginPage
      $ \0 v( }, l1 u
    98. {
      % F" n7 ^2 B5 O( r) @2 ~
    99.     public static function printError($message)
      0 F9 H- s& w* d3 L. J
    100.     {  R6 q. j$ h+ ?4 b
    101.         $controller = new LoginController();, w4 R, k& s  A
    102.         return $controller->showError($message);
      7 G6 r+ j8 r, z, J8 W6 I! e$ w
    103.     }
      5 H# Y. W  j4 n# x& q% _$ h9 L
    104. }
      ( k3 y% e8 o3 K4 u" g, y
    105. ( z  J7 h! D$ X6 V, g8 o
    106. // app/Controllers/Login/ShowIndexPage.php
      ; r( ~2 _9 l( ?5 f
    107. namespace App\Controllers\Login;, U5 t, F( q& a* H& V  ~0 e
    108.   f% I, W7 i( l
    109. class ShowIndexPage extends AbstractLoginPage
      $ p0 ?+ a- X: Q: E: J
    110. {, m7 w% P* e; J# H# h4 T
    111.     public function show()
      & F1 P0 D) P0 x4 F+ G  J
    112.     {0 s( j$ F0 j. D& Z; V9 V- ~) E
    113.         // 實現登錄頁面顯示邏輯. r- k, J& r7 u, e. B- |  Q
    114.         return view('login/index');4 S5 X/ C) Q- ^  ?+ x' b
    115.     }% x0 Q- P) a/ Y1 e3 K
    116. }
      0 f5 @' _& e; G1 r% l
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2024-11-21 14:47 , Processed in 0.007940 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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