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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15012 / 15012

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    3 t% n2 M1 I0 k5 H% ~1 h4 a$ mAI 就是站長的最佳幫手。6 g" _4 J, [& F" Q

    , ?# T0 k1 L; T$ T6 r) v. P  o0 `( C# X& G3 p1 ^4 i) E
    這裡的「新架構」是指後端的架構會有大變化4 k% v# i% ?" T
    但前端的 UI 介面玩家不會感受出來有何不同2 Z$ ~3 ?/ ]) W8 d
    4 D3 s+ @- x' T2 G+ I3 `

    # O- S( K. t' N* e" B為什麼站長要改成新的獨家架構?
    9 \- a" d9 W0 F4 }$ B5 M* k# \就一樣由AI模型來解釋清楚吧。9 ~. i) q" ^: D! ~- }. q* B' G

      c" ~! F. b0 [5 ~. D- U: w
    6 U: b/ j) a* V4 m- w讓我分析一下使用純 PHP 和使用框架的優缺點:
    1 ?# U+ J0 ]) z" ]/ Y: Q純 PHP 的優點:
    2 W$ u2 l5 J$ s0 Q8 \/ O1.        性能較好 - 沒有框架的額外開銷
    6 \  M3 \: j& f) v7 W2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    . G7 M9 N% G$ g/ c3.        更靈活 - 可以完全按照自己的需求來設計架構
    ( n1 t8 O) T& D# G4.        代碼量小 - 不包含不需要的功能模組
    & w# x8 f* t: x4 W2 z+ Q5.        適合小型項目# t; {9 x' ]/ D
    純 PHP 的缺點:+ c! X4 V4 _& t8 [
    1.        需要自己處理很多底層細節, l2 ?( M3 l: T$ _/ i$ \/ [$ o
    2.        代碼複用性差3 v" Q2 C! r" U+ b. f
    3.        缺乏統一的開發規範! Z* \: S. n# }0 G9 R
    4.        安全性需要自行考慮和實現* B: k, [3 }" C3 D: J
    5.        開發效率相對較低. w- Z7 v4 a% I& o0 o8 w$ x/ z
    6.        維護成本高+ C7 t* S4 k8 w9 N: C* [
    使用框架的優點:2 r) h/ L5 W  V, o
    1.        開發效率高 - 有現成的元件和工具5 U$ D3 c: C* S& E7 M
    2.        有完善的安全機制
    ! ~; Q2 h. w9 }2 S; c, B3.        統一的編碼規範5 s$ O0 E' {8 P$ s
    4.        易於維護
    ; h; C1 H4 K2 k4 Z& D$ L9 G5.        有活躍的社區支持5 w) e3 l) m5 k7 t5 U
    6.        適合團隊協作3 M4 o3 m& s' o, ?
    7.        自帶很多常用功能(ORM、緩存等)
    ) y* _; @' p0 s2 e! J' I使用框架的缺點:, @  m4 i& N& z) X. p+ M
    1.        性能有一定損耗; I4 w( T3 ^. V6 s
    2.        學習成本較高# D: h4 t/ u" U% p5 v# t
    3.        可能包含很多用不到的功能
    8 K2 c1 c# q; g" e/ ^4.        不夠靈活,需要遵循框架的規範
    5 }% {0 k8 @. O" l( O$ ]9 P* x; e" h8 S5.        對小項目可能顯得過重
    0 w* v& G2 [$ s- B建議:
    2 U  ~9 I  R" D2 O: U1.        小型項目或學習階段可以使用純 PHP
    / B" Q9 d) p- ?& s' r" ~% O2.        中大型專案建議使用框架3 t7 D1 s: X2 I/ e9 d0 ?
    3.        選擇框架要根據專案需求和團隊情況/ q; ^; E! o7 }# Q( a
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇# p( J, a' B3 d: i/ b
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    6 x- L( A: T) G4 F
    : P+ T% l5 }- g$ E9 U, H; k2 R7 S% ]  f! L  T4 E' m
    1 J0 [% A+ f* i, W
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    7 ?4 A* F9 ^9 Q! T2 v5 g' z
    + Q8 K8 B! r9 {7 @) T$ V這個轉換主要做了以下改動:
    3 ]) r0 n+ j) t0 C- G) D( U
    ; a0 F  Z2 J+ ^* F路由結構:
    # o- j& T/ q& U+ J# G
    3 k& S' s/ B, c使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下" U  Q/ z9 e# Z9 a# c( r2 k' s
    支援原有的 page/mode 參數結構
    2 B& b) n3 f5 y2 u" t( e7 W6 r) x通過路由規則自動匹配到對應的控制器方法
    8 X# ^' e6 {4 \) K" |3 |& D: F7 I  b" e  W0 v; p& [. h

    5 c5 l9 g. l; G5 N/ f: Y- a控制器結構:: O0 a! Q0 z5 C
    ' c1 G  {6 }) v/ I& S3 n  \
    創建了主要的 LoginController 處理所有請求
    8 ]+ d9 y- Z3 r$ ~" L. n保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    / k+ {8 b- a, W7 Z0 S8 K錯誤處理改用CI4的視圖系統; D$ f5 F1 P2 l
    6 `& I5 l9 @; O+ ?5 F) A, F: K
    : u2 J" D0 z: g& b$ S( n7 _
    類的組織:' r8 P* f! x9 Q9 Y: I
    % \% d# q/ A  G5 v% L6 X  s5 O' n
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下# r1 f) {; S% F& G$ H
    保持了原有的類繼承結構
    * a/ B0 a; v; e/ M; w& B1 H改用CI4的控制器基類和特性
    / D2 {5 J2 M  }6 B5 I
    , h- d7 s1 P  d
    ' s2 W. q- F- M) Y" G改進的安全性:. w' Y# r/ S- E4 `

    4 o! R2 l+ }' p! A4 w使用CI4內置的安全特性
    9 ^6 E! }& l4 V: u0 t6 g. A5 W# w更嚴格的輸入過濾  @. I4 O* o1 B
    更好的錯誤處理機制
    * C7 w$ x6 N# N* J/ C& B% U8 j2 G( l* }/ c7 L2 P

    ; ]+ B) @0 X& m, O( Z2 W
    2 @9 L. I6 W1 V: v8 m8 o) a1 t要使用這個新結構,你需要:& w7 n! [% S# a9 q  y. n
    ( V% j; z2 `# J/ V! e
    將這些檔放在對應的CI4目錄結構中3 R, G7 K: O5 F! _7 I
    確保創建相應的視圖文件
    8 c1 I, s; v: N1 ~配置語言服務
    $ x; b" z. ^  Q根據需要調整模組檢查邏輯* v$ a( H/ [3 _
    4 [, h$ Z8 s. I
    需要注意的是,你可能還需要:9 K' V4 ?) F  s9 M* H

    . E; d4 K& Z# |  R: ~3 ~: S) s創建相應的視圖檔(在 app/Views/ 目錄下): z: A( V% C/ C" N
    配置適當的中介軟體來處理會話
    6 H( M. |* v9 P  O實現具體的登錄邏輯- R3 i; h2 `; M( C/ N4 Z0 d5 w
      A0 q% N1 a5 C! b' l0 W' }$ k( {
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?  b! G' M, g0 J; L/ @3 d7 b. D* K

    . j# C' k1 ]) y3 z& {
    1. <?php: i$ ~3 ^8 k1 w0 d) T1 q
    2. // app/Config/Routes.php' {" A9 o4 N: T* W, d
    3. namespace Config;
      5 g8 \: ?" k# O7 D2 Q
    4. 3 F8 K" V9 p% T8 D7 Z
    5. $routes = Services::routes();
      & Y$ q" m0 I) F. `  K. E' r
    6. 9 `4 D- q& m* r2 }
    7. // 添加自訂路由規則3 P  f! A; t$ M- u' J# {3 e
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {" Y8 ]; k0 v6 J5 h: h: D
    9.     $routes->get('/', 'LoginController::index');
      8 \4 h3 }& J6 m& Q) r/ m
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');$ P& q! K3 R; m: G
    11.     // 默認路由處理' P# m& ^7 F4 o" t) W  j- {5 g
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');+ ?  U0 F% S" K/ h0 |/ [$ B
    13. });$ D& n' C! K  {5 w; d3 b

    14. # ^8 |/ t% B& Y' z( J5 F( t
    15. // app/Controllers/Login/LoginController.php2 m. l5 N7 U* P. d
    16. namespace App\Controllers\Login;- p% A& |: o9 h9 D: _7 ]& \

    17. ! n; q) i; P; M% b6 O3 Q) E+ c
    18. use CodeIgniter\Controller;
      & }  ^0 s5 b) f3 d
    19. use App\Controllers\Login\AbstractLoginPage;
      # J! z# P+ i" U. `+ H- x$ h
    20. / D' D3 D' u; J$ l) N4 ?( j
    21. class LoginController extends Controller
      + O! i- S% L) H1 M! {' `
    22. {0 {6 o0 }# V/ t! ^
    23.     protected $pageObj;
      $ S  r, c1 v. ?4 V% f4 F
    24.     protected $LNG; // 語言物件
      9 i7 B$ |% Z  `# O, ]1 P: o
    25.   c' ~. j* g. z7 [3 o; v' c
    26.     public function __construct() + M+ i8 {( E0 Q0 q# _
    27.     {& I4 e/ {4 w" Y& O
    28.         // 載入語言檔和其他必要的依賴) x6 Q0 m5 s+ r% Y+ |
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務# @" \; a3 T2 e+ [6 [3 w
    30.     }0 y9 G' `( a3 ^- b, N8 @
    31. . O: m/ m5 z5 j
    32.     public function index()! f8 g; R" W% W9 X
    33.     {  V% h7 S) C& J5 {5 g
    34.         return $this->handle('index', 'show');
      . l$ C' c7 |3 n0 Z, I: e/ J+ B2 T) S
    35.     }
      # ^' n- I7 @+ v3 D# H
    36. - n% ]/ A: ?( ^5 X2 C, I$ A
    37.     public function handle($page = 'index', $mode = 'show')
      * S$ Z1 w  a' H* Q4 m9 N9 Z  p9 Y8 f9 v
    38.     {  }* y! ?$ C, q
    39.         // 安全過濾頁面名稱6 E& N7 N( U2 A! r0 v! E; z4 V
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      ( V. h* `& A3 w
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';# E; v& Y! U) s
    42.         / V( L/ V% o+ D7 c" w
    43.         // 檢查類檔是否存在: w. W1 H) Z  B6 c; P8 q
    44.         if (!class_exists($pageClass)) {
      # _- E0 A2 K" ]) `5 I3 M
    45.             return $this->showError($this->LNG['page_doesnt_exist']);) D3 Y* k( g. a5 D( I
    46.         }
      * I# V6 O+ `& G  ~; u

    47. : [! @- L) y; }# b
    48.         // 產生實體頁面類
      $ f* [/ p0 J, O. c- u( `; A* M; ^5 E/ c
    49.         $this->pageObj = new $pageClass();7 }* B7 y+ L3 w1 {
    50.         1 F! j8 t. o* O# j0 i. Q; `: W
    51.         // 檢查模組要求; w1 X2 @, K* R6 Q" J3 ^% ?5 [2 Y
    52.         $pageProps = get_class_vars($pageClass);' U5 a% N9 L0 q; ?  q
    53.         if (isset($pageProps['requireModule']) &&
      3 ^; A4 w3 t/ k7 z
    54.             $pageProps['requireModule'] !== 0 &&
      8 d, P$ T) N( Q( V3 R
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {, O0 k0 ~! ?% h4 q: C- v9 w
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ; \, U5 o: }2 G/ U* k8 K, o6 b
    57.         }1 C; W. t3 ~2 @" A
    58. ( u/ b. }9 W& T' u
    59.         // 檢查方法是否可調用2 h) c3 V: ~: O  c9 o) {% a
    60.         if (!is_callable([$this->pageObj, $mode])) {2 u/ r; G# m6 Q/ K6 c8 i/ l( B2 j5 p
    61.             if (!isset($pageProps['defaultController']) ||
      ) L* E9 a0 X- Q% e5 Z, h: @5 ]
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {* ~. I/ Z& G0 b3 f! i
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);" `. ?4 F. T7 K- _6 e
    64.             }3 [% L3 w" n8 A' B2 M5 ~
    65.             $mode = $pageProps['defaultController'];! p. z3 w8 j( j4 Y6 f
    66.         }+ y. X1 ]  D  Y: |6 \7 j9 m
    67. 8 T% J0 W* g; g# B3 U4 e8 J/ B, N
    68.         // 調用相應的方法% H: i1 i/ x) k) R- r6 |! ~
    69.         return $this->pageObj->$mode();7 c7 ~4 J8 [( n- Y
    70.     }
      ) k, i" q+ \6 a; R
    71. & z" u$ X8 O  `- x# X, R
    72.     protected function showError($message)
      , E! [7 Y  M! Q) n( u( ]2 k. S' o+ `$ }
    73.     {
      ( p' y( S! I! V/ K" n; F5 M
    74.         return view('errors/custom_error', ['message' => $message]);
      4 k' C  G$ l7 R2 `* V% ~8 h
    75.     }
      5 ?# a3 u8 R0 a$ U1 H: L9 D0 r
    76. 6 k4 @# F; V$ K# g7 d( q6 P: O  f
    77.     protected function isModuleAvailable($moduleId)
      - N, i7 [! A% d. K3 d) ~
    78.     {; ?$ b+ `+ J* `
    79.         // 實現模組可用性檢查邏輯  _9 ?- E, a8 \1 S
    80.         return true; // 根據實際需求修改
      7 E' D' {4 r0 S$ c
    81.     }8 }4 x% X; k8 C9 E! q4 O
    82. }
      . A( E& U5 |. {2 b; i- O0 G

    83. / g6 E4 y  H0 U' b
    84. // app/Controllers/Login/AbstractLoginPage.php1 B, ~9 p5 z8 L- a6 T
    85. namespace App\Controllers\Login;
      ! N& h  U5 H, n9 Q: K" ~

    86. . x% k9 P# D6 S: f# [3 H
    87. use CodeIgniter\Controller;
      & h( s! F3 z. }* T& W+ Q

    88. & m/ `- h6 l0 T: A
    89. abstract class AbstractLoginPage extends Controller
      0 E) D8 L% D5 P# _% ]5 y
    90. {0 ?. h3 i+ O% E2 U  Z
    91.     // 實現基礎登錄頁面功能, B& G" {! E5 Z2 Q( t7 a
    92. }8 v0 j/ ^5 [( {- f- B
    93. 0 I( g% x8 ^/ J/ s. D' k
    94. // app/Controllers/Login/ShowErrorPage.php
      9 L/ M6 J  |5 e# K* [) a# z1 \9 g0 X
    95. namespace App\Controllers\Login;) q+ W8 V, U& g5 F! L2 C0 D
    96. $ ?! U  X: s! M: \4 t; V
    97. class ShowErrorPage extends AbstractLoginPage
      ( }) z+ e4 [- x
    98. {7 g# F; D# T. R* H  o9 J1 ~
    99.     public static function printError($message)! M/ J1 y/ [9 U- D; W
    100.     {
      % e" L+ }2 o2 C% n' o) ~0 n, u
    101.         $controller = new LoginController();
      9 m! b; w# u4 L+ {1 R5 C/ D
    102.         return $controller->showError($message);5 }; m0 {1 M* I% o: t
    103.     }
      * b( z$ ?" n- T
    104. }
      * k( w6 d2 Y0 u4 @5 z+ b
    105. ' P, P# f9 J4 V
    106. // app/Controllers/Login/ShowIndexPage.php' f3 o5 ]- z; W. a4 `( W5 d
    107. namespace App\Controllers\Login;# D3 E- P; @, s

    108. 0 c; W2 X% z5 |8 _
    109. class ShowIndexPage extends AbstractLoginPage; G0 _" j& p; J' y) I
    110. {
      ; u& R2 X, U0 I6 l, f8 @
    111.     public function show()
      ; F+ i) p/ [+ x1 g
    112.     {
      ( N$ `' n& O# H& q/ p4 ~
    113.         // 實現登錄頁面顯示邏輯+ z) b( I& l3 d5 h4 b# m' v
    114.         return view('login/index');
      ! {8 |2 @- T: `% x' {1 ?4 y
    115.     }
      9 B/ n+ U" N$ h/ W) q& o" G) h
    116. }
      5 h7 W& U. I% J4 d' y8 |
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-7-28 10:01 , Processed in 0.013198 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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