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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14299 / 14299

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    ! z! T# l/ K  Q. {& ^% y+ x& PAI 就是站長的最佳幫手。9 G- \  D* I* ^5 ^: ]

    5 W- I  M9 L4 l% f$ j6 k. Y% E
    : c0 E  O% O4 w3 R這裡的「新架構」是指後端的架構會有大變化3 G0 f' O5 _7 g2 M# V+ _+ a) U
    但前端的 UI 介面玩家不會感受出來有何不同
    1 m& K( K9 }$ X6 q! ^
    4 O8 A, y. |1 J7 s3 L+ t: [- b
    1 t) {  _0 v! m+ T1 Z- o9 r% x% b4 o& ?為什麼站長要改成新的獨家架構?
    . I6 T  C$ e. U3 u4 Y1 P! L就一樣由AI模型來解釋清楚吧。
    5 ?+ a  b+ D6 G2 o9 b; W
    0 ^- c5 f4 r% ~* Q2 s. N2 H- H  W7 g' P, x; [9 R) i
    讓我分析一下使用純 PHP 和使用框架的優缺點:& H! f/ P( D0 {
    純 PHP 的優點:- [, d& n( c6 k1 x4 I0 l
    1.        性能較好 - 沒有框架的額外開銷
    ) b$ B& J, B( V/ R/ L2.        學習曲線低 - 只需要掌握 PHP 基礎知識+ |5 [2 ]- h5 M, T! J
    3.        更靈活 - 可以完全按照自己的需求來設計架構, ~6 m! a: x3 T0 \/ T% M
    4.        代碼量小 - 不包含不需要的功能模組
    + h, O' v1 R6 V5.        適合小型項目
    # K7 J1 U% L  |2 C3 p純 PHP 的缺點:
    / M7 C+ P4 k! Q$ w1 y1.        需要自己處理很多底層細節% O! z' {( v3 f+ j9 l3 t
    2.        代碼複用性差* k3 A& _8 t1 D* W2 o$ v) X  P3 K5 c
    3.        缺乏統一的開發規範
    / E$ a; s5 G2 p  Y4.        安全性需要自行考慮和實現
    1 t2 W) j8 Y1 _5.        開發效率相對較低% M. B( @) C7 T" l
    6.        維護成本高
    $ ~, X9 n! J' W% k4 [! f. X使用框架的優點:
    , L2 n3 ?. T2 G1.        開發效率高 - 有現成的元件和工具; I; M7 \- r' V3 m5 b& S
    2.        有完善的安全機制
    " Q' n2 I$ e$ d- a* q5 N- c3.        統一的編碼規範0 g* w& I8 v' _4 d
    4.        易於維護
    " U$ z9 J! `0 S1 V% y5.        有活躍的社區支持9 [8 o# {7 `7 r1 P
    6.        適合團隊協作
    6 m0 t7 Q7 }: z. K7.        自帶很多常用功能(ORM、緩存等)
    # A5 W1 [  o8 \' h# a7 [' }# B- b使用框架的缺點:0 @* C+ ]8 T& v0 h8 J/ \
    1.        性能有一定損耗
    7 ^7 W) c( m+ j1 g2.        學習成本較高
    8 w, V1 n4 c. y4 l9 o3.        可能包含很多用不到的功能; h) g. y* N8 s  ^
    4.        不夠靈活,需要遵循框架的規範' g( {% }/ w" l, x' p* O- w" X% W
    5.        對小項目可能顯得過重. Y' \% f& _& l4 P0 G, {
    建議:
    ( |2 u: _) s6 a5 _7 r1.        小型項目或學習階段可以使用純 PHP' m7 \! O4 a" u% o8 V$ ?0 m. w6 a
    2.        中大型專案建議使用框架# |2 ^+ D9 h6 I+ Q5 g
    3.        選擇框架要根據專案需求和團隊情況
    / O9 N1 J, j2 E1 Q4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    7 X9 `4 ]" F) Z2 N5 L; m  l您打算開發什麼類型的專案?這樣我可以給出更具體的建議。$ ]5 U' V! y( ]2 B, y, l
    # h* w" B" B+ j# {  B
    9 x3 \1 ~, w3 U7 V3 m  Z

      Z4 X1 B3 E6 r9 L& ]7 R9 A我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。( j6 _# f! R# k* {( C
    9 Q$ n" C, d2 @& R; T( q* F* i+ H
    這個轉換主要做了以下改動:* Q2 [  C) I3 V) q) C7 H

    0 L+ e5 z" Z' {% g( E7 x6 \" Z路由結構:1 S9 m& u5 {, @2 V$ V$ @* S

    + B! z4 }) b1 G: x4 r5 B; J3 {使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    & _2 e) ]0 c: o: J4 y6 Z5 L% r( K支援原有的 page/mode 參數結構$ c2 v8 n8 w! D3 O* c0 K( D$ ~
    通過路由規則自動匹配到對應的控制器方法
    3 ?7 c( d- Q2 c8 t  o6 `1 b
    - ~0 M) H; c3 {8 m5 c/ M! I
    + a7 H: I9 X* }. u# w8 t! L7 r4 u1 {控制器結構:
    0 s5 x% f& j7 d+ }* m  ~+ Z6 z4 p! `/ s8 o( u% l
    創建了主要的 LoginController 處理所有請求$ c' W  S( T* v# m, e/ U
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範* I6 [* ]# q# j
    錯誤處理改用CI4的視圖系統
    9 x* [' h3 h. t% D- j' k) j$ s$ B; ?4 W# }+ w, V1 K4 L
    3 `/ U  @5 ]: D* W  g/ U
    類的組織:
    " e3 E6 [; Z' R% L- n& H6 Q
    6 n( [) `+ z( c# `) }# i0 k# o所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    / q3 o5 V+ v/ }$ e0 N0 h! W保持了原有的類繼承結構
    * [& P1 Z/ P: P% J, M7 f改用CI4的控制器基類和特性) y; w( |- J( P" h
    3 m7 p- n2 T) m' `7 m+ l1 K) c: `2 X
    5 |) Y% C" H& V5 o& I; w& ^
    改進的安全性:4 S# z: k0 ~- [& @7 k/ L
    / n; y& x- t$ f. J( L/ t" W+ }
    使用CI4內置的安全特性. {* t& T6 m# c2 _( F7 ~
    更嚴格的輸入過濾
    5 T0 n8 H: }; G6 `; f- t更好的錯誤處理機制
    , s6 _4 X- J1 c$ r; ?
    , V& B! Q3 M; l: h7 f  Y8 R1 t- S7 }- _6 p; }, p! y4 P, l
    . Q1 |3 Z  ~! q: q9 p& b& \6 B
    要使用這個新結構,你需要:- C, |- s4 z9 \4 c- U6 I  p$ N

      O* H- M: O. ~# V: }8 M) m- {1 v將這些檔放在對應的CI4目錄結構中
    ) }) `: J5 P( R& _/ L確保創建相應的視圖文件
    / }( r* ]5 ?, R3 B配置語言服務1 x$ j& B' M* l; f
    根據需要調整模組檢查邏輯
    $ \5 D7 h, L" T4 b) G2 R$ Y5 n1 I. m# l: V
    需要注意的是,你可能還需要:: i* Q2 u2 Z, A0 \

    $ E, N; t0 c7 ], T. n4 q, Q創建相應的視圖檔(在 app/Views/ 目錄下)$ H# L2 t3 N" J+ x4 J; N
    配置適當的中介軟體來處理會話
      \7 {5 S/ W4 S' o實現具體的登錄邏輯* ]8 i, W7 u/ i" |. M( e
    ) s/ U/ c' I5 J9 @6 z, G" X) N
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    ) t1 b+ J, [6 J# t0 P
    " K- r! b! a8 b; c, m9 \
    1. <?php
      6 a& R6 L1 _1 f- }( b1 R* T% d
    2. // app/Config/Routes.php  D* D, X* {- d9 @! s- g
    3. namespace Config;8 @9 j8 w3 u% m5 K

    4. 3 d! _, Z  ]# m# r9 t
    5. $routes = Services::routes();
      $ ], W/ @) C  v4 l# N

    6. 9 \- e$ Z% I' A+ ~
    7. // 添加自訂路由規則
      + L/ P1 b4 A7 x; _
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      5 i& c* \4 `9 S2 B
    9.     $routes->get('/', 'LoginController::index');
      , @  c, x3 v" t
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" D/ ^* ^6 j2 J4 ?* O# p
    11.     // 默認路由處理! i+ H; r& e& t1 A6 [! D
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      + d; Z0 [" \9 Z+ T" K
    13. });* H9 l) Z' j  \; r2 y  h/ j

    14. , m2 w. }1 L9 ~; I/ n4 M
    15. // app/Controllers/Login/LoginController.php: b, X) s5 c% F) k
    16. namespace App\Controllers\Login;
      , J; P0 C& l# t1 W

    17. ' q2 }; H$ P& M) t- [. p1 U3 n! L
    18. use CodeIgniter\Controller;
      $ P$ ~: x2 [& G: x* O
    19. use App\Controllers\Login\AbstractLoginPage;
      ) i2 a* {! c0 j& E7 T

    20. 8 M1 K( F; L5 E" ^' J
    21. class LoginController extends Controller
      # D  Z% v/ Q" e/ b* O
    22. {0 }4 o1 t1 A" A) b+ q; s' a1 T% ?4 {- {* o
    23.     protected $pageObj;
      6 L( `, z9 W" L* y6 Y1 |  ]  P
    24.     protected $LNG; // 語言物件
      + v9 y5 Q" x1 J9 d
    25. . _- g& b$ @8 z6 N
    26.     public function __construct()
      : Z1 r. d( T' C7 h" }, k# @) F
    27.     {0 J/ I( Q$ a/ l) x( f+ S
    28.         // 載入語言檔和其他必要的依賴
      7 [- d+ _- Z" W7 L# X2 z9 D
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      & S3 j8 T# j, J/ J7 ~4 K2 z
    30.     }
      9 R. I; A' a2 }  q7 Y1 n
    31. 4 y: F  `" W! P8 m
    32.     public function index()( c' ^8 d2 y, d8 c8 r5 _* M
    33.     {
      4 j( R1 O2 {; \" z9 I( }6 S
    34.         return $this->handle('index', 'show');* C. |9 |7 S+ T+ V4 S9 A
    35.     }
      # Y& d3 h! g9 }
    36. & ^; n. _7 L4 p) ^( T
    37.     public function handle($page = 'index', $mode = 'show')  A& w/ W4 C: Z; R1 J- t' w8 v
    38.     {
      - e3 s  S  U& M- \% ?
    39.         // 安全過濾頁面名稱. p+ B+ w, E5 q& S) M( p% J# X% [
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      7 J3 _0 D2 w( g! b& `: ~; c
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      , k2 l/ d0 n% G$ F9 G/ |
    42.         
      ) x  J( U. Z8 f6 A
    43.         // 檢查類檔是否存在
      9 d$ f4 n" k% X5 t4 ?1 b* G2 S9 u! z
    44.         if (!class_exists($pageClass)) {
      4 O! T" z* ~- F
    45.             return $this->showError($this->LNG['page_doesnt_exist']);/ C) ~9 {0 s6 L$ z! O8 O
    46.         }
      3 ?% G) b  h+ A/ z' t" f8 J
    47.   ^8 g6 R2 n  c1 n+ \' A
    48.         // 產生實體頁面類  H% g9 G1 N9 R2 ~5 \7 Y: c
    49.         $this->pageObj = new $pageClass();) J- M5 D: |4 R' o+ _9 G7 i6 f9 d
    50.         
      ; ]0 f$ S4 x% j( v5 H: ]$ L6 c
    51.         // 檢查模組要求& T' J6 |4 V; i6 b% G& R
    52.         $pageProps = get_class_vars($pageClass);, E+ H) I: O* @9 n, r7 _) w
    53.         if (isset($pageProps['requireModule']) &&
      3 ]: @* c. d" x9 u6 d$ C
    54.             $pageProps['requireModule'] !== 0 && , ^4 u" c$ V' X
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      % P; \& P3 S3 N; a
    56.             return $this->showError($this->LNG['sys_module_inactive']);# @7 D, r/ V) k, I
    57.         }( p. w$ O0 t* f& u- I  d  j. g
    58. 9 E% ^8 x/ ]7 ]
    59.         // 檢查方法是否可調用) g& D# G$ B& b+ P6 o& T8 g
    60.         if (!is_callable([$this->pageObj, $mode])) {% F/ b  R1 I  S( W8 k
    61.             if (!isset($pageProps['defaultController']) || ) `+ j8 a) t9 d% ?% b( z
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      . |5 s" Y$ V2 |: g, N& t, _
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      % d) C, z. J' |, w  x
    64.             }
      + }9 Z# n+ _( o/ J+ M# E
    65.             $mode = $pageProps['defaultController'];! g9 G4 X: U% J; B0 C# E# b' L
    66.         }2 e9 g, @! `  Q
    67. 0 j4 i- |) E% j; f' `: o* E
    68.         // 調用相應的方法! E' p+ x: i/ z8 ?& }6 q
    69.         return $this->pageObj->$mode();
      6 m6 {, a/ G+ P" s5 c* b- S3 L8 q
    70.     }
      4 G% \8 b# N5 u6 g# j
    71. - `/ I" G$ e0 ]$ R5 c% J0 ~) k
    72.     protected function showError($message)3 Q  w* A6 x/ O9 X7 V
    73.     {
      ' y; E- B) G5 n6 \
    74.         return view('errors/custom_error', ['message' => $message]);
      , ?1 t. D3 _; ~! B* p9 z
    75.     }
      . f* T2 s5 k0 w7 Q2 X: ~! E3 X
    76. ! z& G. f1 m3 W& A, z4 N
    77.     protected function isModuleAvailable($moduleId)6 U% {( H' ]% f: F8 f3 m5 a
    78.     {" |4 E7 C" w, j8 t
    79.         // 實現模組可用性檢查邏輯
      * `6 O( \. A. K; {; @! x' ]2 f
    80.         return true; // 根據實際需求修改
      % M, s: l* d) U# |/ Z/ ~, T. J$ \' b' ~
    81.     }
      - Z" z% y% X$ E7 o0 j
    82. }
      $ n4 Y( C) u: p4 Q3 v' j
    83. 7 v/ c9 `, @. U
    84. // app/Controllers/Login/AbstractLoginPage.php1 v# [+ k/ Z; M% B$ m
    85. namespace App\Controllers\Login;, y8 t2 [' t  N

    86. $ F. Z) b- E5 C. l' w9 Q
    87. use CodeIgniter\Controller;; E, f6 F: d& \0 ]7 W. a

    88. 8 s! J7 r7 }% [& N) o
    89. abstract class AbstractLoginPage extends Controller; Z4 y  T8 k8 f5 g) }1 V
    90. {
        J; S- j6 q% v8 @+ ?
    91.     // 實現基礎登錄頁面功能- M/ V$ }- _! c6 n- ?
    92. }2 X- \( ?* E, @( S* O0 M
    93. . z  v& [+ G" T& k
    94. // app/Controllers/Login/ShowErrorPage.php
      $ X) W7 c. I- [& P) \
    95. namespace App\Controllers\Login;' e8 l2 `. E/ M" E8 X0 v

    96. + V$ I  M1 }7 k. E( n5 }8 D
    97. class ShowErrorPage extends AbstractLoginPage
        V3 @- q+ L% Y5 b( u5 ^
    98. {9 a8 q6 P; e! p7 N6 z
    99.     public static function printError($message)( J/ x# Z9 E1 a
    100.     {
      ! ?9 o( X2 ^0 I3 F
    101.         $controller = new LoginController();
      : W; I6 N2 }5 K, g7 a
    102.         return $controller->showError($message);1 L2 L, s$ `+ m4 |$ k2 u
    103.     }
      , C1 J- G7 _' D( w/ @0 ?, f( K5 V
    104. }2 }: X5 N* j* z/ `- L
    105. / D4 r1 X8 F1 r4 M" O
    106. // app/Controllers/Login/ShowIndexPage.php0 T# i7 U3 O$ ~* E* T5 j
    107. namespace App\Controllers\Login;
      6 Q4 }  x+ n7 ^3 \, ^9 X

    108. 1 W) t- Y. h2 p' o5 w* u+ L& o- W
    109. class ShowIndexPage extends AbstractLoginPage
      6 h: J8 m6 ?; @; j
    110. {
      ( J) |2 N7 F! g" E) T: F
    111.     public function show()' P/ o+ f6 k, g3 Q1 C5 x" W' @- ]
    112.     {
      ( J% C8 E# W: e! b$ i$ R
    113.         // 實現登錄頁面顯示邏輯: i7 R  h5 K# L2 n# b
    114.         return view('login/index');
      4 w% a- V9 W" ]4 G  d
    115.     }& s7 `1 h* O4 Y! u* X
    116. }: P% Q9 W6 i; l7 |" O
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-10-31 07:38 , Processed in 0.018432 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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