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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14323 / 14323

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    6 n* U0 J7 H* |$ j! aAI 就是站長的最佳幫手。
    ; {4 A8 n0 ?6 e) P. [. b6 H$ O% O  e$ D

    9 m# E3 V2 O- w8 j% c& }# U這裡的「新架構」是指後端的架構會有大變化! J! \4 x+ d" G+ @. c9 E
    但前端的 UI 介面玩家不會感受出來有何不同
    ! @  ^0 i" p! |, c; a8 C4 m& J& X1 {; `
    ! f; l$ u% @+ `
    為什麼站長要改成新的獨家架構?
    - i2 o7 ?3 |- J$ \7 k4 s就一樣由AI模型來解釋清楚吧。0 K! D% O9 k5 x& o7 E! Z6 l
    5 x! S3 {; P% S2 D( w6 L+ ^2 D

    6 i4 R% g3 U7 T# E: i( H/ E# g' w讓我分析一下使用純 PHP 和使用框架的優缺點:# \4 t: ^; ~; ~
    純 PHP 的優點:( j4 N3 o0 C- q
    1.        性能較好 - 沒有框架的額外開銷* {1 g7 A' B9 C
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識" E  E, Y9 `) j2 l3 ?& _9 l& r
    3.        更靈活 - 可以完全按照自己的需求來設計架構" G) q' `4 O2 q& P6 [# G
    4.        代碼量小 - 不包含不需要的功能模組" U6 o2 E7 n% H3 m1 F3 y
    5.        適合小型項目
    & y( a' N# p0 s( q, K  x9 n純 PHP 的缺點:; X9 S& ~( K& E9 e7 P, a" V" B/ T
    1.        需要自己處理很多底層細節
    / J' T9 W0 @/ e2.        代碼複用性差* r8 t) n! R7 I+ ?5 h- \9 s5 ]1 b
    3.        缺乏統一的開發規範
    - o- A$ Y0 j: f0 ~% S) M4.        安全性需要自行考慮和實現( {: I1 Y3 D- V, A. ~# m
    5.        開發效率相對較低7 c9 e3 l# X- w% p! z
    6.        維護成本高
    , Q; ]4 u7 S8 }+ Q使用框架的優點:( P7 K( v5 l) ^+ ?! v6 L$ c
    1.        開發效率高 - 有現成的元件和工具
    8 b' C" C6 z  S+ v2.        有完善的安全機制2 y6 t/ d! n1 c2 [) ~
    3.        統一的編碼規範
    $ \- N' G4 ^2 \9 Y4.        易於維護
    : t% d" h# ?" _" s5.        有活躍的社區支持) [3 Z9 A2 S% p3 z% Z; d
    6.        適合團隊協作; F6 g5 g9 T# Q0 H- J
    7.        自帶很多常用功能(ORM、緩存等): u% H5 ^8 u' ~1 c  F" X4 V
    使用框架的缺點:
    # V' t- o% i* O+ X. C1 p1.        性能有一定損耗
    2 \0 Z  k2 E$ {" a4 ]4 C2.        學習成本較高$ D$ N+ R# T$ D  C, w( g2 k8 J+ S. k
    3.        可能包含很多用不到的功能
    : i, Q# P& |8 ]0 c8 @8 _4.        不夠靈活,需要遵循框架的規範
    , u( Z" C9 v4 h7 ~. {, G( f* ?' Y! p5.        對小項目可能顯得過重% m8 Q7 b% F& G7 R+ F
    建議:
    % V# p% t- v* x* t  u- B% Z1.        小型項目或學習階段可以使用純 PHP
    * i. q" \% R% V$ F" T. q2.        中大型專案建議使用框架6 c! X" l0 }2 T  [% U
    3.        選擇框架要根據專案需求和團隊情況( @, u4 ~1 a; O" i* N, o
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇% W# M7 k/ C6 S  T! _4 w. c  e4 j
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    ) w' U$ Q$ k9 C5 G& c) z5 H% s' O/ K0 ?1 A- O  O
    $ Y: T, ~7 V& Q6 S0 g
    / u2 {9 Q, t  r: s8 h  ^
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。3 n. J! V  T2 J; C4 _

    / k7 y+ j1 Q8 I" I+ F" x這個轉換主要做了以下改動:
    4 s1 {6 R0 y9 C" J$ x; a2 i
    % @1 g9 {7 \$ \9 h路由結構:
    9 O, q. L% L9 h
    / ]' r1 a5 i7 P+ @! o& h使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    % S2 [! N& _4 Q3 y$ Z# C; E" B支援原有的 page/mode 參數結構5 G8 n3 O  J% d9 M0 J9 u* z7 d
    通過路由規則自動匹配到對應的控制器方法
    ( t, H6 G7 d, X( ~. B5 Z2 K7 Z4 [
    # _; y/ q1 N* @/ n4 {  G: [0 @4 [( C( b
    控制器結構:
    . _% m5 ?( D6 i1 C! S7 \
    " {8 r/ v& h. l' s創建了主要的 LoginController 處理所有請求8 R0 r- A  i% |
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    5 w8 I; R+ R% f' X! n* _: ?錯誤處理改用CI4的視圖系統2 @* c% }  X3 W  x

    " K0 n5 u# z3 y* J8 s, |  q; i& i* U# v2 ]3 L
    類的組織:( Q1 ~0 V+ M0 p$ s

    2 T; [( R# j( O( _; H所有登錄相關的類都放在 App\Controllers\Login 命名空間下( `* u! J& d' G% S& _
    保持了原有的類繼承結構
    ; Q) F+ a9 {- h( H$ F- f) k" W7 l改用CI4的控制器基類和特性
    / B+ g* e. {1 p2 F$ p. K1 t
    5 S6 ~! H8 Z8 W( t& {6 P& f* v% u- \' E8 o; ^+ H
    改進的安全性:
    9 B. }0 X- r9 e8 p8 t7 f" o) N. s# F6 }; F0 f
    使用CI4內置的安全特性
    3 v8 a! s; q1 ~. N2 u更嚴格的輸入過濾
    5 ?: O4 A8 Q) v. ^; c, F/ t+ T: z更好的錯誤處理機制) r& J* @  T5 {: M
    & c% R0 x. E; O# n7 _

    $ W: M' p: l/ A- v  r- ~1 D8 X" |
    要使用這個新結構,你需要:
    3 t4 s4 H* t: n' E  e  [7 q1 ~# ?; q( G& [; _# @5 M8 P8 S
    將這些檔放在對應的CI4目錄結構中7 T. d+ P1 x( Z% M  |5 p& `
    確保創建相應的視圖文件
    * N: h  A* l. N$ \$ C配置語言服務4 S' {8 h+ t2 Z3 _3 B
    根據需要調整模組檢查邏輯4 i9 _& e: H1 S9 K8 z, K9 Y

    . q" w' P% R- x( V需要注意的是,你可能還需要:
    : F6 M/ l5 k  {$ x4 N6 o  x( ^& }2 r, x9 k( Z* ^1 F- O
    創建相應的視圖檔(在 app/Views/ 目錄下)
    - z) D7 A4 D0 S9 i6 h  Y配置適當的中介軟體來處理會話
    & u7 n( s1 D) }* O/ b4 O7 ~實現具體的登錄邏輯$ N- n+ s2 }* B+ H5 f1 |0 S

    6 S+ }: T6 k; {; E1 y- n需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    1 r0 m4 w$ G5 Z% b: m
    . W& B7 j9 {. ]: f$ j" D+ _
    1. <?php7 t- a6 ?0 A( W  x
    2. // app/Config/Routes.php4 U. E5 b* \0 _! `
    3. namespace Config;5 |1 c) u. {7 x

    4. ( a1 \" ^" S( F4 `
    5. $routes = Services::routes();
      , Q/ j# }4 r; K- {
    6. 6 D' w7 y: f( u) k
    7. // 添加自訂路由規則
      # F7 Y7 |- V0 R
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {3 s3 o; N0 N1 \# v1 `. G; j
    9.     $routes->get('/', 'LoginController::index');
      $ F2 a( A6 w! E: S' U( b  Q4 u
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');& C# G& [* E- n2 ?( L
    11.     // 默認路由處理* _' y, ^3 ~' A1 ^  T
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');% L8 q) |6 t- @1 \+ o- [$ I
    13. });9 y6 X  d  I' P3 O
    14. - q) @3 S; o0 u
    15. // app/Controllers/Login/LoginController.php: u$ W. g! Z0 n; y* G
    16. namespace App\Controllers\Login;
      * X% J4 r9 }" R0 d
    17. + q' Z! G& G, r' r, c
    18. use CodeIgniter\Controller;
      7 j8 |% e8 Q4 K+ J( [: e+ E3 @6 F
    19. use App\Controllers\Login\AbstractLoginPage;
      ) K) f; B/ P. N8 p
    20. - X9 b( u; \2 Q6 j% n6 e  n8 I5 \
    21. class LoginController extends Controller- C0 M  R- `; w
    22. {7 G% `) w: F6 o; ~5 W
    23.     protected $pageObj;
      ' l% D& j# O/ q' Z, ]% N" {
    24.     protected $LNG; // 語言物件
      4 q) ?2 ~# B" Y1 W: D
    25. & \% R+ Q5 d  s- q2 Y, O
    26.     public function __construct()
      9 @; g) o" T, p1 t$ L+ U8 c
    27.     {
      ! q+ j! O% M1 z' [/ y
    28.         // 載入語言檔和其他必要的依賴
      , H# L5 t8 Q$ c- s, W/ u
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務2 I7 O( i  |6 Q. h; r0 q2 I* W7 e
    30.     }
      & |. u3 c! L5 _
    31. / ~% c6 {* L+ a* I  F0 F
    32.     public function index()% t) Z% A# N/ C* C
    33.     {3 Z! }; V$ G! c- w! r
    34.         return $this->handle('index', 'show');
      + o& {9 B2 F2 X0 ^* F
    35.     }
      # v* {# ~9 f8 m2 N: J

    36. & u" N% j% x0 b# R+ ]
    37.     public function handle($page = 'index', $mode = 'show')- U5 F6 W$ ~& y# V
    38.     {: [2 x  P8 c, r' A
    39.         // 安全過濾頁面名稱; r& w- B& t3 V2 X2 Z6 Y7 g
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);% O/ `" N9 q- A7 ?# @
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';1 o8 Z. |; Y+ H
    42.         , j- P* L& g  l2 R+ d$ Y
    43.         // 檢查類檔是否存在
      ( d5 B- A0 l$ U1 T; ]( }, i
    44.         if (!class_exists($pageClass)) {
      2 ?7 p9 \: L- k( E( `; N
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      ! u$ A% ]" L  a* ~; L+ |6 Z+ }' z
    46.         }
      : D; h  ]2 I. Q, U9 i  ?- c2 _

    47. ) C, z7 L7 l* _
    48.         // 產生實體頁面類
      " ?5 E' s: c& U; M
    49.         $this->pageObj = new $pageClass();
      ) R3 E; A% b0 @
    50.         3 t4 C$ w# x, c/ X. ]4 r
    51.         // 檢查模組要求  o. L' g& S$ t& k1 l# {
    52.         $pageProps = get_class_vars($pageClass);, a3 z; p1 q8 K7 K; x# L
    53.         if (isset($pageProps['requireModule']) && % x' `& i: `+ L
    54.             $pageProps['requireModule'] !== 0 && , w2 A7 U7 B7 w0 J# p0 q
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {% j0 |  d% E/ x% k
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      , k1 q$ w) T. _: y
    57.         }
      / Q9 E+ Q' S- }. z  c) c6 _
    58. 7 ?' r$ K& J, J+ G- l( ], }; p, _
    59.         // 檢查方法是否可調用
      % ~2 f% K: T7 R8 n' B7 O
    60.         if (!is_callable([$this->pageObj, $mode])) {
      - ?5 M. \' p+ d, Z
    61.             if (!isset($pageProps['defaultController']) ||
      9 x* H* K5 T) C3 k
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {1 L5 F/ U4 D0 c8 I- ^5 T# J+ L
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      . L0 p( I; ], V6 y: u4 Z3 a6 O& f
    64.             }
      5 @) f' {9 G9 ]
    65.             $mode = $pageProps['defaultController'];
      . `- {) z; Y3 ?! \/ h3 B
    66.         }
      1 [- q5 K7 S+ `4 N; n9 |5 M4 e; v3 l
    67. ) S7 ^1 A) @7 d  Y9 e# I# r
    68.         // 調用相應的方法
      9 ~! c# i! o! ?1 c, r! ]) a
    69.         return $this->pageObj->$mode();" e5 r# m: @* T; `# {( o
    70.     }
      - ~& R: J5 i* U9 Y
    71. 6 `" Y9 U! h; b. A
    72.     protected function showError($message)
      7 T9 ^( r* F/ N  O1 s6 ], S, l
    73.     {8 `# n4 v. ]) i/ C0 a; Q
    74.         return view('errors/custom_error', ['message' => $message]);# s8 `6 J5 V) c- A; p
    75.     }. {5 c4 S2 N9 }7 X# j- G$ u$ L( \
    76. 6 D' ], f- c" ^7 O$ ]; w; |- _2 F
    77.     protected function isModuleAvailable($moduleId)5 C, A, k) w( r$ o
    78.     {/ A* k, }5 L' z$ O4 b
    79.         // 實現模組可用性檢查邏輯
      ( E% ^! C6 R5 y' |/ @/ x& J
    80.         return true; // 根據實際需求修改
      8 n9 [# B! Q7 ~/ Z( f9 y- k/ K
    81.     }5 @3 C( S* A3 w- _% J1 Q
    82. }
      / Z# M: @& J% D2 L

    83. $ k$ [5 x% [, I+ \0 ]
    84. // app/Controllers/Login/AbstractLoginPage.php
      " Q+ E# d5 ^( ~) E. B- f
    85. namespace App\Controllers\Login;! U6 A+ z7 w- H- @
    86. : y8 r+ }3 r  G( K
    87. use CodeIgniter\Controller;
      - j2 g9 B* R$ A
    88. ; U! _) |: A, c
    89. abstract class AbstractLoginPage extends Controller
      / C" |' n( N1 S0 c2 T
    90. {% e: V2 N6 U0 `- L+ a- D4 r3 r
    91.     // 實現基礎登錄頁面功能' D+ D) N* Z+ q8 V! P2 A! M9 C
    92. }
      - h  ~( M: E4 `& U
    93. , W5 G, o: I& M) o; o+ n* N1 x; M  Q1 c
    94. // app/Controllers/Login/ShowErrorPage.php
      . v0 k2 S, K) m
    95. namespace App\Controllers\Login;- {. [  X5 k" u2 \$ v2 S

    96. ' K1 w7 a. |: H( E4 w
    97. class ShowErrorPage extends AbstractLoginPage
      - J7 }# ]7 I4 ]% y9 i+ G
    98. {+ c! V/ [% u$ ?- w" w8 s6 C8 C
    99.     public static function printError($message)1 t( ?, P0 H9 Y. g* F8 R
    100.     {
      ' e/ T3 Z* K7 i& H# a
    101.         $controller = new LoginController();
      # c2 G7 b0 v; h5 @' d% r2 U3 a
    102.         return $controller->showError($message);
      6 r( J8 p: F2 I; o/ U( x$ @
    103.     }
      0 S& v3 p! G" X8 f0 ?# J0 B
    104. }
      - e$ f2 ~& p4 K

    105. 3 Y) `8 |; z: ^
    106. // app/Controllers/Login/ShowIndexPage.php
      ! t7 u" |1 M8 n/ A7 C. |! A
    107. namespace App\Controllers\Login;8 V2 }/ f- F: q& ^

    108. - v- j$ u) e( R$ e
    109. class ShowIndexPage extends AbstractLoginPage
      - n$ k' u# C" C( D+ T1 p' _' Z/ f
    110. {
      6 A$ L. r6 z8 \) R$ F1 U
    111.     public function show()
        [$ P; W2 G/ y, c0 A7 @9 P* S
    112.     {
        N$ x+ b: s1 E
    113.         // 實現登錄頁面顯示邏輯* J+ c4 |  m% M3 l' T0 c
    114.         return view('login/index');
      7 _+ W' P( P5 J+ ?1 w2 b* i; i; W7 I
    115.     }
        T/ y% Z- N5 P2 ^* S1 M
    116. }- \( b( i, A9 I0 {+ c
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-11-9 09:49 , Processed in 0.015398 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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