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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14354 / 14354

生命值:5%

升級   100%

  • TA的每日心情
    慵懶
    6 小時前
  • 簽到天數: 5774 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致: }  F9 q6 q7 |
    AI 就是站長的最佳幫手。  k6 S0 U8 D. G; O1 S. b

    , O! P1 V: B+ T- Y' I1 a  b" x' k; s) H( _
    這裡的「新架構」是指後端的架構會有大變化
    " B7 a$ ]' C+ m/ j, s: y! O但前端的 UI 介面玩家不會感受出來有何不同
    ! ^. `- D  T$ h3 M( z5 k
    5 `, }. S; m  [
    : B$ A$ F5 c5 s0 W0 B9 J為什麼站長要改成新的獨家架構?8 N2 K) p- t7 z: y
    就一樣由AI模型來解釋清楚吧。
    . q& ]: C' E! b! b" k0 X3 u1 A* t. X. T
    : ^( Y1 p, e) P* S- y* E! P( c
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    / {' c9 ?& m8 [+ U純 PHP 的優點:
      H3 K' V* U! g+ R! J- O1.        性能較好 - 沒有框架的額外開銷1 I, C( L4 i# q6 r* d7 b
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    8 w( P9 p% C; t+ _: g1 Q3.        更靈活 - 可以完全按照自己的需求來設計架構
    & d# e; z% T" u$ F/ P, t4.        代碼量小 - 不包含不需要的功能模組
    2 Z1 A! e8 T, `& i9 z5.        適合小型項目
    0 w2 ]9 x* H' }4 ~- y8 D' Y純 PHP 的缺點:  Q2 @% }# y0 e6 o
    1.        需要自己處理很多底層細節- E' v& b5 b. Z( {
    2.        代碼複用性差- ^. l& W5 D( ]
    3.        缺乏統一的開發規範
    : A) n1 P  ~$ t! |4.        安全性需要自行考慮和實現8 u  H9 T* p; }; X6 @# I( H3 l3 o
    5.        開發效率相對較低, B  F# ?- `8 z' t+ V) X
    6.        維護成本高. \+ G$ o0 ]4 \1 _# k; m' i
    使用框架的優點:
    % `7 {" r- C  M8 c1.        開發效率高 - 有現成的元件和工具9 `# G# q) N5 o3 u0 F
    2.        有完善的安全機制& w8 E" P4 r4 y/ ]0 e& n7 [
    3.        統一的編碼規範
    ( X2 [6 ~8 k: I4.        易於維護
    ) X* v2 m: B/ S5.        有活躍的社區支持
    # t" i. J8 V! z$ [2 M+ V  }) j6.        適合團隊協作+ b- z2 J) ~9 U, o* s
    7.        自帶很多常用功能(ORM、緩存等). o5 P' s/ R2 Y: _8 W0 q
    使用框架的缺點:
    1 b2 k, J5 k# E! c4 \! e6 L* g1.        性能有一定損耗7 s$ H+ E! k/ l; t; X
    2.        學習成本較高
    - n, \5 T/ p6 n* A5 ]3.        可能包含很多用不到的功能3 _# B: O: ~, F3 l. T3 X
    4.        不夠靈活,需要遵循框架的規範
    & J' A! S; x3 d$ }5.        對小項目可能顯得過重6 F2 Z% q7 h% A, r% s2 i: ^! T
    建議:1 e! t" O% z( E/ l$ v' G
    1.        小型項目或學習階段可以使用純 PHP
    * t9 f+ L* T# z# K2.        中大型專案建議使用框架' O) e' c2 ^4 v# F
    3.        選擇框架要根據專案需求和團隊情況
    & u6 M' V& V! Z: E0 s) _0 j$ w' ]3 y4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇# H- `. O9 M# q3 k; ]6 R# c2 H9 v* Q
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    1 Z1 `: `9 _( e8 b* V# ]$ `/ t
    % X: E* v' M# @8 S2 V8 I+ k
    5 y- J; y* s# ~( j. d/ f4 O* B" `! n3 w
    ; G% Z, l5 v6 ]: p' \2 K我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 e; m& r: g- |* k# G% X/ U2 p& P
      J- `1 c" D" P4 z) G6 e: _8 {
    這個轉換主要做了以下改動:& \3 A1 y# |9 H/ b( b* u

    . t8 c- z9 v( \. S) n! n路由結構:0 v9 @0 I0 v) F; ?9 x

    2 e+ s) k0 }' Z6 |7 X$ A8 \使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    1 C: Q, c2 {8 Z+ f4 i" b支援原有的 page/mode 參數結構; u3 Y3 l$ W+ f5 S& g, D
    通過路由規則自動匹配到對應的控制器方法
    & c6 n# [9 X" ~8 F
    8 q0 y1 ]; X* A+ y: S3 l% H, M( v6 r8 e0 p4 m% E+ c) M
    控制器結構:( N& |; E- c( }2 n  ^3 H: J

    % L! X5 C5 G. \創建了主要的 LoginController 處理所有請求% @. N* w- S9 m
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範  X- X9 \% q! `
    錯誤處理改用CI4的視圖系統& k  k8 V# y, `+ _; ~
    8 x1 G$ X- T# Y* Z" ]+ [/ y* \
    2 [: N; |8 x0 L7 g& L9 u
    類的組織:
    % C# |' O7 K" E+ g$ Z0 v  r1 g2 {" C, z5 a' C; K! D
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下. g5 z. F' c4 u* m- d
    保持了原有的類繼承結構5 [7 K5 k! b8 ]/ i/ o
    改用CI4的控制器基類和特性
    & I. d. v+ `9 C- J7 p2 C$ n  }0 S0 V4 P% {7 @6 Y

    4 W+ y, K+ y  S& S8 k改進的安全性:, l1 M; _( C: L! C

    4 i) t) c% V) }! V使用CI4內置的安全特性4 m  e8 _! U0 K5 H
    更嚴格的輸入過濾" g* E* _% w5 O: ?5 O0 U
    更好的錯誤處理機制; i1 N) |- E" ^) `

    ( C* K6 y$ `! |, U' U/ w. v6 y
    0 l. d  m0 E% n  E) ^
    + q8 V, ~7 ~5 q+ i要使用這個新結構,你需要:6 u; B! V1 l* Q4 r' ]

    , W4 f) x% h" p+ Q  q( @將這些檔放在對應的CI4目錄結構中
    9 C' p0 @. d3 a" W* ?確保創建相應的視圖文件# `' ~$ V" y9 E2 l2 f  ?  z
    配置語言服務
    5 k. A0 K5 M0 l* T; F, @, r根據需要調整模組檢查邏輯; f! R) v* n$ W6 L

    0 N. {6 y8 d! O需要注意的是,你可能還需要:* B) |9 ~+ B8 O3 f1 p# B
      L' E& @) e1 Y# T4 Z7 b  I! Z
    創建相應的視圖檔(在 app/Views/ 目錄下)4 O  q& X' J# C' D
    配置適當的中介軟體來處理會話
    . C' h2 F* [- e  X" U& ^% u實現具體的登錄邏輯( c3 }2 ]. }. g* [, }% `" Z  @4 k1 ~
    / u. ^1 r" a9 I: o, x8 I
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    3 ^1 `9 P7 V4 e* M: u# v5 D/ r; j$ k/ K$ l5 Q1 y; u) ^
    1. <?php
      5 Z9 q0 z; @5 r( ^+ @
    2. // app/Config/Routes.php
      & d& I. V; ?2 r
    3. namespace Config;* e: i# o3 i0 O% j' D8 Z* K# O! J. s

    4. , v; ~/ w4 d" ^  U; {
    5. $routes = Services::routes();
      7 ^6 B4 D' E4 t* r

    6. . K& H8 W# N5 M' Y
    7. // 添加自訂路由規則2 O& h9 X' s( R3 E' i. c7 s( ^
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 Q" K' a; J7 k/ E! G! }
    9.     $routes->get('/', 'LoginController::index');/ L; J6 Z& |$ C4 p' ~1 r
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      9 b' q1 ]/ Y: ?; T  a
    11.     // 默認路由處理7 ^& h) p  B6 p2 k) m
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');. ^7 ?7 I, G/ g7 K! m5 q+ c0 y- Y
    13. });
      : ~. z3 u4 N. K" A0 P

    14. " R- p/ j) a% P, ~5 g7 p, y7 E
    15. // app/Controllers/Login/LoginController.php. [/ Q3 h! x8 ?- [, [' r8 a
    16. namespace App\Controllers\Login;
      ' `' K, ]8 U% _! }3 a
    17. . v  x8 Q1 G. A& Q2 P5 {  w0 V: [
    18. use CodeIgniter\Controller;9 N( ^2 z/ y5 s5 y4 Z
    19. use App\Controllers\Login\AbstractLoginPage;9 ]# e2 h# n& d8 E& ?# y& U
    20. ) v4 V- j% N% c
    21. class LoginController extends Controller; F  h0 i% V; a
    22. {5 t% v6 f! H5 i- X, n9 z
    23.     protected $pageObj;2 C: a3 e* ]- r$ a
    24.     protected $LNG; // 語言物件
      ) X( o( f* C5 ]; S2 J' O" L
    25.   S1 ~/ H3 `/ X( `, c
    26.     public function __construct() ) j: P3 P) c# ^
    27.     {$ C' G4 Z% |7 ^( A- i
    28.         // 載入語言檔和其他必要的依賴
      - g# \/ Z& K& T# z- \) H
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      2 _* S1 B+ h% G' X
    30.     }- b% {* U7 ]6 U$ _' ?) s6 }; Q
    31. " G% \8 z5 B  y8 n5 a' R3 Q
    32.     public function index()
      6 f: n) L3 z, r4 S$ B1 y8 G
    33.     {" ~" v" t& h0 q3 h: t1 r( I
    34.         return $this->handle('index', 'show');
      8 y1 U. y+ e" L- d4 C% }3 {% H
    35.     }4 S" i9 j- [5 n) r6 @8 H

    36. 9 }6 p0 P0 U' k* D* a# D8 Z
    37.     public function handle($page = 'index', $mode = 'show')& R& W1 @: k8 P& i2 C
    38.     {
      + k( I" P% K8 F; u4 F- k, O
    39.         // 安全過濾頁面名稱2 @/ X; ?3 [" e# @" V7 W
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      % R& l( h- I5 d% L- O! `. U( g9 D" m9 J: D
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';8 _/ x; D/ ]- \; A1 M
    42.         
      ( V% f1 j0 Y* _* U! t. I+ ?
    43.         // 檢查類檔是否存在
      . i1 @/ \* P; E+ |! H: `: F
    44.         if (!class_exists($pageClass)) {
      0 R% R0 E# s3 k' w5 i& i0 Z, e
    45.             return $this->showError($this->LNG['page_doesnt_exist']);5 B0 ^& [1 a0 t/ c6 D
    46.         }
      . N8 [- L; x* m& O7 P+ A+ ^
    47. ! R9 D. T. H- D
    48.         // 產生實體頁面類5 Q5 ~# Z& @, b4 S1 J
    49.         $this->pageObj = new $pageClass();
      9 V2 z0 |) }' O0 k4 o" U
    50.         
      , N' A: |" @2 Y* \
    51.         // 檢查模組要求2 s7 B1 `  t+ d1 W
    52.         $pageProps = get_class_vars($pageClass);
      ) R# d- o4 ~+ c2 ^+ Z7 C4 g
    53.         if (isset($pageProps['requireModule']) && ! \1 u  Y' t  l8 r
    54.             $pageProps['requireModule'] !== 0 &&
      6 B* P+ J1 T( k3 z8 T" Q& V
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {* P; s0 T2 `, ]9 _, v
    56.             return $this->showError($this->LNG['sys_module_inactive']);8 @' x% U+ f9 ~$ T" @
    57.         }
      6 f) p" D1 ]: E1 R% A0 N; R, h' ?! q, Z

    58. ) N) M+ w4 m) a0 V/ {- N7 I# k
    59.         // 檢查方法是否可調用3 g( U, C; H$ {' F+ i9 z
    60.         if (!is_callable([$this->pageObj, $mode])) {1 e$ X- X% \' b: o2 T! S* X) Z: ]
    61.             if (!isset($pageProps['defaultController']) || 7 p) ]4 ?  C' \
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      % ?& m; E( g* ?
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      + [. m' u, z( {5 _* N( R
    64.             }
      4 A- O2 y' ?4 ?
    65.             $mode = $pageProps['defaultController'];6 e4 R& _  X. \; Z; N: q
    66.         }0 e6 V3 G: R6 x/ a4 L+ ^$ c3 g$ I( W
    67. . ^5 v, ^" Y* ]# `& B) j5 Z
    68.         // 調用相應的方法& C6 N0 |! Y$ X4 U+ T) o
    69.         return $this->pageObj->$mode();7 q; m* I6 W0 B" Q) r# V: f) u
    70.     }
      : }* T1 u' }3 {
    71. # q, X; \- V# d0 p  y. Q
    72.     protected function showError($message)
      0 `% P) E: j9 I8 ~3 m. f
    73.     {) G9 t! |. g( ~& H' l3 a
    74.         return view('errors/custom_error', ['message' => $message]);
      0 v% P) X' X$ B$ ?9 t2 j
    75.     }
      3 O0 x: d" w. P5 ]% A5 S3 t

    76.   r, ?- [; R* Z/ y# ^  ~2 z
    77.     protected function isModuleAvailable($moduleId)
      " z% k1 @. S* P9 S( H" Z
    78.     {
      2 S6 D2 T' V6 u" C
    79.         // 實現模組可用性檢查邏輯0 Q9 ^4 ]4 ?; G/ z
    80.         return true; // 根據實際需求修改7 F/ z( R' w$ Z
    81.     }
      # X' a4 L1 }! p7 s6 V3 F: U
    82. }
      $ W0 w% i& A/ E/ _9 p! R
    83. + l. w& d: J6 Y! |4 m
    84. // app/Controllers/Login/AbstractLoginPage.php. q! r1 w: |* ^. p/ F
    85. namespace App\Controllers\Login;2 t& C7 _: j9 _7 O+ }

    86. 3 r/ j. c2 |; \& H" p9 `1 n8 w9 G
    87. use CodeIgniter\Controller;( k3 \1 W7 U3 T' S+ b; @
    88. % l4 K9 r% d( _# t6 Q/ b
    89. abstract class AbstractLoginPage extends Controller: n' o: T' |1 Y' K
    90. {
      : V7 B& L' q9 B5 |
    91.     // 實現基礎登錄頁面功能
      ) R# D  a4 f6 E8 \+ [3 r& P$ D; p9 ~
    92. }5 `- t+ ^$ `7 d, k& v

    93. " I5 B7 m/ b( V9 o" M
    94. // app/Controllers/Login/ShowErrorPage.php2 G8 e' C; s, A) {/ c9 G
    95. namespace App\Controllers\Login;
      / U# o! h; V; K

    96. 2 M0 B5 p+ f: O# K( ?5 n
    97. class ShowErrorPage extends AbstractLoginPage6 R. B9 J0 T' T) W, @8 u, m
    98. {' U3 H, A6 M! x, L
    99.     public static function printError($message)9 p. H2 J+ K& [6 K
    100.     {
      ( c' t; U0 n6 a% I
    101.         $controller = new LoginController();8 e$ E. U; e" ~; v# q3 D
    102.         return $controller->showError($message);" D$ U$ G( q2 }2 x. ~7 I9 Q7 m) H
    103.     }; z$ H3 L  C: Q) ~
    104. }& ?0 \# q4 S8 o, V5 v  L/ S! j# x

    105. ( n: R; `2 a7 \
    106. // app/Controllers/Login/ShowIndexPage.php7 a2 Q+ m  A& q: e9 e) N- n
    107. namespace App\Controllers\Login;
      + y4 ~1 d# B0 F
    108. & n7 h" h6 L" m( x; E% b& b/ F8 d
    109. class ShowIndexPage extends AbstractLoginPage
      ( O) Y: j5 O5 Y4 D3 ?. f
    110. {8 R: L, Z2 f* a' d0 w% ]. [9 s" C
    111.     public function show()+ A9 \1 x$ I( j& R, N
    112.     {1 i  C0 f$ ^, n" C, v
    113.         // 實現登錄頁面顯示邏輯
      1 t9 [9 Y$ t# ?) X, n- T- s
    114.         return view('login/index');9 u8 t6 W' ~  ^% ]  p3 S/ F
    115.     }, J5 n, G9 x/ Z( A$ ~4 e
    116. }. u& K  k2 s, a4 {" P: {
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-11-21 07:31 , Processed in 0.016492 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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