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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13561 / 13561

生命值:5%

升級   100%

  • TA的每日心情
    無聊
    14 小時前
  • 簽到天數: 5488 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致# D/ @* m: s1 H) I
    AI 就是站長的最佳幫手。. k% \- s0 E5 O9 ^% Q5 U
    * O3 v2 a6 l- V
      v, m7 N$ `' \. i9 A1 @0 Z
    這裡的「新架構」是指後端的架構會有大變化
    4 c8 h& B$ ^' Z9 D但前端的 UI 介面玩家不會感受出來有何不同
    # [& t: k# Z& J( h) c/ B- Z8 u' y: i# L, m

    ' y8 V! v: g6 D; B為什麼站長要改成新的獨家架構?
    " |, J  e1 t) h1 J* P* e1 G9 c' N就一樣由AI模型來解釋清楚吧。9 c$ C' w4 G( [+ ?; y! z' M3 x  M

    ' G+ J6 g+ r& x, x9 |  k  b8 g
    % R3 |4 W2 h4 o0 P3 C# S讓我分析一下使用純 PHP 和使用框架的優缺點:
    0 Q+ C1 b0 {, X9 Y' `% u純 PHP 的優點:
      t7 v$ n' @  e' h- ^' u' @1.        性能較好 - 沒有框架的額外開銷
    9 U& }! U& z+ F: t0 C- ]# M2.        學習曲線低 - 只需要掌握 PHP 基礎知識, z3 {7 I, M: C+ m
    3.        更靈活 - 可以完全按照自己的需求來設計架構) l1 A; l( c7 U9 p
    4.        代碼量小 - 不包含不需要的功能模組. u3 [* L  v) o  H# d) \
    5.        適合小型項目
    7 \  {. ~3 c, X7 C0 g" K8 h; m純 PHP 的缺點:
    , e2 u, s* ]0 d: T( m8 ~% n' N1.        需要自己處理很多底層細節
    0 W0 D" x5 ^# s! F8 Z2.        代碼複用性差* I: r( i' }; A, P
    3.        缺乏統一的開發規範
    2 J  L% l; B! X% S! L4.        安全性需要自行考慮和實現/ L( l& w" ?& `7 |& {+ q3 Y1 z
    5.        開發效率相對較低5 S& R9 B, [. x
    6.        維護成本高  u+ p; t7 o% O- [+ b' q
    使用框架的優點:
    % U& w' b4 u, F1 O& g& h1.        開發效率高 - 有現成的元件和工具
    # |/ {& e2 A1 e  ?, d2.        有完善的安全機制& y/ E  m$ C$ N9 g. Y  w+ q. L: z
    3.        統一的編碼規範
    4 V; Y" P  ]# N; D. o- G4.        易於維護
    ! }3 H$ v- ?* K( @) {/ m4 b5.        有活躍的社區支持
    8 O$ l$ w9 `0 \/ q9 [& a6.        適合團隊協作2 h8 ?8 f$ e: p* A& s& M% v
    7.        自帶很多常用功能(ORM、緩存等)9 B  v1 u% Y& ?! Z! A1 \% m
    使用框架的缺點:, g6 @' d! Z% J) ]$ `6 K
    1.        性能有一定損耗
    " d+ ?, Q4 w. ]! F2.        學習成本較高
    / ^! N; k% D! _! |3.        可能包含很多用不到的功能
    * f. g$ Z* @! t! }5 G  Y1 Z# T: Z- I4.        不夠靈活,需要遵循框架的規範+ Y2 N8 {6 t. d& P
    5.        對小項目可能顯得過重4 ]% G1 U& a9 h; }  X  E8 H
    建議:
    : T9 R0 _! |8 [1.        小型項目或學習階段可以使用純 PHP
    , t* @2 M. D9 n" q. X2.        中大型專案建議使用框架
    4 ]# O: @8 S1 Y; C4 Y7 m3.        選擇框架要根據專案需求和團隊情況
    3 J. z3 Y+ Y* |6 d' }; b4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇3 m3 C/ B- ?, V0 o9 R2 M& k- a
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    % P' S- A! r: ]8 l" @
    " @' e, @  W3 d1 l  D0 |
    : y0 z8 A. G6 U& a+ y+ L
    ! w$ `+ O  l& @我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。4 I7 \6 L% y( s) t7 z6 D

    6 O) C7 {! k$ [. y5 [+ A這個轉換主要做了以下改動:
    ( _/ m; F  V1 E( [: g  }7 }% g: o7 U
    路由結構:
    3 e* W" t* d9 S) Y% \; t7 |: F! |/ O" ^
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下2 k: ?% W3 M  O( [. @( G5 ^& F# ]
    支援原有的 page/mode 參數結構
    % e( B* ~+ B! x* k  w通過路由規則自動匹配到對應的控制器方法8 q9 M* K6 k6 o5 s/ @# W9 a' E

    # \5 [( O- H$ t
    1 T1 O: {1 t$ n2 P控制器結構:* r& r! e$ O$ o$ F3 L$ N, Y: {

    $ `, ~: h$ I( d3 G創建了主要的 LoginController 處理所有請求
    3 W, g- Y7 R- T$ y& x+ ~! m4 w) ?保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    + Y/ P; s" K2 A- `: o錯誤處理改用CI4的視圖系統
      F. @* ~/ M0 w# {% `% m8 I) K+ C) e; P7 g

    ! @; L# ~/ z4 k7 m# R類的組織:
    $ p' o+ n* e5 k/ Q; T9 m
    2 u- t: q3 Z& _/ G3 l8 p所有登錄相關的類都放在 App\Controllers\Login 命名空間下2 B. I2 ?6 |4 L
    保持了原有的類繼承結構1 |- }! }$ p6 o
    改用CI4的控制器基類和特性& _9 o( \  P6 Q! G3 k: t7 ]% f  Q
    ! p9 K& _' D# V0 |( K0 b5 x* z1 R

    8 ^' p. k& ~0 r5 t改進的安全性:
    $ C. C1 l) q2 z3 l4 H2 M: r0 Y
    & \4 T( n* d0 Y3 f; H- M使用CI4內置的安全特性
    ! d% Y- h" ?2 ]( f; \. k* A9 e4 {更嚴格的輸入過濾0 v3 f; q1 z+ b
    更好的錯誤處理機制2 u2 ~% r- v& [7 \
    ) A( b% j3 a) _: S4 f) G

    3 s9 D% N! m8 C6 N9 R  e: c; E
    3 m) u7 Z* S' \% A, m2 ^+ {要使用這個新結構,你需要:- T& s$ U( Q0 q- e1 R. o" i3 M# Z5 o! G0 P

    ; v- R9 E( `% \4 |將這些檔放在對應的CI4目錄結構中) O( E; [+ a9 M' Z
    確保創建相應的視圖文件
    - b6 r# N( @& C; N2 n& T, }配置語言服務
    % v+ [' G+ H, Z0 b7 l根據需要調整模組檢查邏輯+ [" [7 u) W& g! Y0 ]2 C
    , R' D3 y% q5 }9 ?
    需要注意的是,你可能還需要:
    / ~+ S6 }: p5 s: h
    : f6 }; E* m. n& O/ [4 }創建相應的視圖檔(在 app/Views/ 目錄下)
    8 Q, n8 _, D9 w3 Y2 B配置適當的中介軟體來處理會話! {) y+ ]- g) \  ]! K6 P' M
    實現具體的登錄邏輯
    6 A$ w/ m1 i' ~# N, t0 f" L5 {+ j6 X3 d7 u
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    9 Z1 c+ A" T' x/ D) N- c6 R: y  z7 T1 ]1 p2 r" Q( o- R
    1. <?php8 y* a9 D; a& C1 @/ r+ W3 `
    2. // app/Config/Routes.php
      / R" z0 a( }9 p( P0 D  _+ r1 A
    3. namespace Config;4 G5 s: U' Q5 r6 K1 y: P
    4. & k4 C: p$ J3 ?4 A" I' x
    5. $routes = Services::routes();
      + |8 @# q0 A* ^0 J; O# t

    6. ! s8 \2 L5 g7 M, W# K  p. l9 A
    7. // 添加自訂路由規則% d( G0 D2 M+ g* [; a  @
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {4 g. b6 F; Q9 P% T8 S( T  Q) ^
    9.     $routes->get('/', 'LoginController::index');
      % D8 \0 l- D! {6 @$ ^  O
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');+ b, Y2 p8 ?( D  e4 N
    11.     // 默認路由處理
      ) a6 F, u, m+ K
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      ! ~! {+ H4 Q% p9 G$ i
    13. });/ N; i. q9 M) u- X' T4 @5 ^" _) n

    14. , X! t8 @: g$ ?6 [" W
    15. // app/Controllers/Login/LoginController.php
      ! c. s9 _- E/ A# G  o- O
    16. namespace App\Controllers\Login;5 s) E  A3 N: s* C, ?( @5 }( C( A

    17. 3 q6 _; D. l4 ]# L
    18. use CodeIgniter\Controller;
      9 l9 \$ a3 L0 C+ `6 t4 m% ]# |5 c
    19. use App\Controllers\Login\AbstractLoginPage;, f) K# s6 R: e! c7 a

    20. 4 [* V5 r# \+ g: X- N( K/ q4 O# N
    21. class LoginController extends Controller( p8 ?- @0 B7 M/ a3 e, a
    22. {! c. k; Y& w3 u! B
    23.     protected $pageObj;0 ~' Z$ F9 f8 u' r7 I
    24.     protected $LNG; // 語言物件
      " h- n  I$ L; T! u

    25. 0 D3 F. S/ h0 r+ s
    26.     public function __construct()
        ~% [; ?: Q6 S9 w0 B6 f; {
    27.     {
      7 K' k) H" a' A, Z! W
    28.         // 載入語言檔和其他必要的依賴& I2 d( e# @$ L% f3 I/ g. M# p
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ! u0 ?2 ^+ K$ z" o! p/ V: x. D$ y  ?
    30.     }, e( U4 Z( U# }5 C/ I
    31. 7 V. b0 s5 p5 S2 t! |+ h
    32.     public function index()
      6 |+ I: Z  A+ ~) g! d: G4 H9 g) b
    33.     {4 e, s9 s  v7 w+ s4 J! r
    34.         return $this->handle('index', 'show');
      , r% O' [2 W* t* @7 r; {) V
    35.     }
      - [) [/ C. R0 R

    36. 4 C" _3 d& P; |' N8 I, }
    37.     public function handle($page = 'index', $mode = 'show')
      : M; x# M8 z( E4 K
    38.     {$ \' w- ~( f+ E: u/ T$ y# A
    39.         // 安全過濾頁面名稱
      / x5 |4 F( o1 g& K
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      . K( x$ D% `! P7 b; w3 p( R
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      0 l& z8 r/ {0 M5 M  w: _5 T/ F* ^2 l
    42.         3 g( T% C5 q# U5 n4 y" w
    43.         // 檢查類檔是否存在4 L0 A. q1 W/ w- v$ ]5 E! B6 c7 x
    44.         if (!class_exists($pageClass)) {" V& {+ X, z- d2 Y5 G2 U
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      ' h$ Z1 N+ ]8 P" l" z
    46.         }
      " ~" y8 f2 M5 U' I9 t9 h5 t

    47. # [7 ^" ^, P( m5 A
    48.         // 產生實體頁面類
      ( h: o' y' T1 [# C
    49.         $this->pageObj = new $pageClass();
      % s; y: _4 @6 P) ^  ?' _2 u- P. e
    50.         
      % A% z- t+ Y/ P& x' q) ~7 e& s
    51.         // 檢查模組要求) S9 g, V( R1 U( n& N
    52.         $pageProps = get_class_vars($pageClass);1 k8 r3 ^0 p- y
    53.         if (isset($pageProps['requireModule']) &&
      4 A9 f, k; A* l7 w9 U
    54.             $pageProps['requireModule'] !== 0 && 0 w& J+ C) _: o; f0 B3 Q9 A
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {7 @7 o- l- a2 S
    56.             return $this->showError($this->LNG['sys_module_inactive']);% c! u$ E% E/ ~; B# d2 T8 N! _
    57.         }
      , M6 w4 Z2 R4 A, [, z# c) r+ g

    58. " x! ]0 W; C9 k* h! S. \0 }% A7 O
    59.         // 檢查方法是否可調用
      / i" v  [* ^3 j$ C4 d) s& F0 t
    60.         if (!is_callable([$this->pageObj, $mode])) {' j$ [* h) t( V7 j
    61.             if (!isset($pageProps['defaultController']) ||
      9 W# X+ o9 S& J; c
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {% J9 @+ W' ]+ p$ j) ^
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);( x: l8 J! Y& _8 K4 d8 Y. {# S$ k' H! M7 H
    64.             }( e( \4 p7 C/ q0 E) K) h9 X
    65.             $mode = $pageProps['defaultController'];
      0 ^6 F) e2 g/ |$ w5 n% F0 K
    66.         }4 O0 B8 w4 U9 I* I7 v+ v; Q$ [4 `; d
    67. / k) L/ Z  S: m" \* V+ Q
    68.         // 調用相應的方法
      % o. d, T) t' v' |) a% }6 i' S, ~
    69.         return $this->pageObj->$mode();- X7 g5 ]' W7 l# u
    70.     }& Z/ S. V* j* ?4 e3 i

    71. ; f' z9 }* g" c1 N$ f* @4 V5 ]$ S+ n
    72.     protected function showError($message)' b% D+ }& i$ X8 f$ ^
    73.     {% `$ g. a. h$ ~) k9 f5 S5 c3 o
    74.         return view('errors/custom_error', ['message' => $message]);
      + g' `$ x2 T" z3 e/ Q$ H
    75.     }
      9 W: p* f3 x1 I; S6 Q) F% K: |2 Z  o
    76. ' G, R3 U- e. z1 Z" s: {
    77.     protected function isModuleAvailable($moduleId)
      . p; f: m8 M4 j9 w% l( n& {, G5 x- Y
    78.     {% w- `6 M1 w' w
    79.         // 實現模組可用性檢查邏輯% ]% f- c1 l9 [. y5 h  D* H7 S) B
    80.         return true; // 根據實際需求修改
      ' L6 }3 D0 ^$ G# r* d' |; D
    81.     }
      : S5 e  R# J% T/ F
    82. }
      ; S: r, n* ]5 k+ U# F* Y
    83. 4 l' J6 p' Z: U+ a5 Q
    84. // app/Controllers/Login/AbstractLoginPage.php+ u: d6 Y$ p' a% v) c$ n
    85. namespace App\Controllers\Login;/ g7 W  d/ N$ T6 K" f; t  Z

    86. ! {4 X9 a, ]1 [7 O* M/ r( O1 L
    87. use CodeIgniter\Controller;
      3 n! H1 O+ p( s* o
    88. 0 R) l- Q+ I) k+ h6 e8 P( R
    89. abstract class AbstractLoginPage extends Controller6 L" t; l1 A/ g0 h& p- B- P
    90. {. v( `. T+ I4 a$ Z4 \* Z
    91.     // 實現基礎登錄頁面功能. W5 ]! \3 b' F% v4 W" H" [2 u
    92. }
        h; C/ i( }6 |/ _. y1 M/ F& B

    93. . a# `! s" ?, ~  G9 k* N
    94. // app/Controllers/Login/ShowErrorPage.php
      ) f& o( {7 w* N; N' C# r
    95. namespace App\Controllers\Login;6 s6 |. i3 A9 ^1 J
    96. & k" I) h' S% d  Q$ h$ \
    97. class ShowErrorPage extends AbstractLoginPage
      6 F% ]: W0 J* I3 Q& d
    98. {& P0 I- R  W  p1 [6 \9 Z
    99.     public static function printError($message), I1 t2 R' e, R2 G! J5 s! h
    100.     {
      8 n8 r6 [7 h% \# ]9 c4 M
    101.         $controller = new LoginController();
      , u5 Q8 F* G6 C4 n) T  h
    102.         return $controller->showError($message);8 v  L$ X4 g" b
    103.     }5 V/ e3 I/ H7 |+ h2 T4 g
    104. }
      , j9 ~% G7 X; Q, J. i8 R

    105. & X' [/ G# D! E+ |8 U& T
    106. // app/Controllers/Login/ShowIndexPage.php
      6 c; M9 C  x( n4 K6 O2 G7 y3 w
    107. namespace App\Controllers\Login;# W# _3 O& w4 e' f# X4 t3 y

    108. 9 m( K) ^. N, I4 J8 h
    109. class ShowIndexPage extends AbstractLoginPage
      9 A# |6 m, A( H9 {
    110. {% `, V6 N& a# Z  e
    111.     public function show()
      0 z9 ?$ N; [8 f% s* b: f! i
    112.     {3 I+ T; Q7 K+ M: H# m# x+ Y( [
    113.         // 實現登錄頁面顯示邏輯
      : e( y2 B2 I3 L$ H$ }" X9 A
    114.         return view('login/index');3 F  T& Z# W. O5 O3 d
    115.     }9 S' a3 W: a' @" V/ r( n& E
    116. }  W" G+ G; ~1 C6 V* g
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-1-22 15:05 , Processed in 0.013624 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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