找回密碼
 立即註冊
點閱: 56|回覆: 0

[閒聊] AI 改版新架構記錄 [複製連結]

等級:25 - 爐火純青

經驗值:0 / 244

魔法值:13476 / 13476

生命值:4%

升級   100%

  • TA的每日心情
    難過
    昨天 01:00
  • 簽到天數: 5456 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    & n. i6 c' E/ \7 ~0 m+ |AI 就是站長的最佳幫手。
    4 x+ p' T2 t8 S. h; q1 H
    & }8 W: `) p8 S* V1 r
    ( P, i) K* Y; s% D# G. f這裡的「新架構」是指後端的架構會有大變化+ Y5 B/ H/ {. M- ?: @3 U
    但前端的 UI 介面玩家不會感受出來有何不同
    $ x2 ^1 g2 N# J* _" h1 M6 l' ]' x  ~: Y9 r

    . X2 l+ X- p( b+ o! U為什麼站長要改成新的獨家架構?# l7 b( ]2 H0 a$ L$ W% W
    就一樣由AI模型來解釋清楚吧。) \. \, @% e8 {' C! S
    $ P  n4 Y! g! @+ |) ^0 [  E
      @3 x8 n& @! y1 u& l
    讓我分析一下使用純 PHP 和使用框架的優缺點:/ b! F6 C, j( i/ N- x; j
    純 PHP 的優點:& M) U/ u; f# W: f. q! g$ o- n. y5 i/ a
    1.        性能較好 - 沒有框架的額外開銷
    7 o- C4 G2 i* U2.        學習曲線低 - 只需要掌握 PHP 基礎知識0 n$ p! S  y( y* ^8 j
    3.        更靈活 - 可以完全按照自己的需求來設計架構% r. u8 V1 `2 \2 G7 U; W
    4.        代碼量小 - 不包含不需要的功能模組, P5 m- t' D' ]$ c' }& l: p* B
    5.        適合小型項目8 i- U6 E5 y) d4 W. a, `
    純 PHP 的缺點:1 W5 v, N* m% D: E
    1.        需要自己處理很多底層細節
    . n- [" `- a, G3 c2.        代碼複用性差
    " c" N  L; }5 V3.        缺乏統一的開發規範- I' H' `/ s( v4 V, d: D' k
    4.        安全性需要自行考慮和實現
    ; C2 v( P( P# Z: P  H& B6 h5.        開發效率相對較低
    7 F9 }% }% d6 L! s  g5 {6.        維護成本高( k  @! Y6 L, a/ W. U; K4 @
    使用框架的優點:
    / K6 u0 S) g, q! D! o$ K( {% b# i0 |, ?1.        開發效率高 - 有現成的元件和工具3 S, z. ^/ n8 P( e2 Q
    2.        有完善的安全機制
    $ c$ l  F9 q1 ~3 w' r3.        統一的編碼規範
    ) Z; `7 E8 m; A$ ~" N4.        易於維護
    1 B- ~8 _+ |$ F5.        有活躍的社區支持
      I0 ~' M. v8 L# k8 S9 ?6.        適合團隊協作2 m7 m2 w( n: _. T
    7.        自帶很多常用功能(ORM、緩存等)5 t% f" {5 `0 e) e$ T& T6 c: ~$ [5 ~
    使用框架的缺點:1 L) Q, W* q! {8 g; q0 N$ o0 I) P# v
    1.        性能有一定損耗, {% Z/ Q) S5 x( I) V, n' A  a
    2.        學習成本較高
    2 G& W6 ]& Y/ n6 z1 x8 L- t1 V+ c3.        可能包含很多用不到的功能
    # x% L2 H+ U0 _$ n: C" o) t4.        不夠靈活,需要遵循框架的規範, O$ w1 m% X% p5 j! m# b
    5.        對小項目可能顯得過重
    5 w) s; z5 e1 T& a  Q5 o' Y$ @建議:
    1 A) {  H% E3 ^: F# Y, s$ A1.        小型項目或學習階段可以使用純 PHP$ u8 f  v# m9 B4 o! A5 R
    2.        中大型專案建議使用框架# J( y- n1 y0 R8 u4 L4 q% i
    3.        選擇框架要根據專案需求和團隊情況$ c/ g' j- A$ I6 A
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    8 ]% j) ^& j$ W0 U您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
      L/ G1 }$ k9 @
    $ S% E% z! f( t% J7 |
    ' ^9 U: z$ t* j) R' K3 @, M; v7 }* l0 _9 R3 W4 I( C6 }6 S7 X) c2 L- @
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    , a; g' _& a3 [) F, b1 I' Q9 m$ _
    這個轉換主要做了以下改動:
    7 w5 \& w8 S4 D1 F0 R
    7 E, C0 e$ l/ L: E2 I  s3 }3 _路由結構:9 K$ k2 i8 U, f+ ^* c& m) h

    % ~& q  B3 n) y# @- x使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下$ S# P5 E1 }$ X
    支援原有的 page/mode 參數結構
    ! B9 D, u2 S7 p) L通過路由規則自動匹配到對應的控制器方法- v' ~( E4 s0 f9 x% ?+ P5 _) s; K

    3 i3 `, G- w  H; h9 U
    3 a9 ?4 [0 E3 j5 V7 z2 g控制器結構:
    + C8 i2 u+ V9 V2 _
    # o& u, ]0 f( d$ @: p, T創建了主要的 LoginController 處理所有請求  R$ a- Q( t# L; @+ ?& c
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    ; y+ ?) ]. E% Z7 ?; a# Q; Q% W錯誤處理改用CI4的視圖系統
    5 _% y0 x* u; P3 V9 _3 M( w! @( |" T+ S  S
    ; f2 r, N6 h/ p1 q7 i3 p6 X
    類的組織:7 G2 Y; q- O8 i2 \  F0 d. y

    9 p0 V7 d8 C7 O& A. f% P# e' V所有登錄相關的類都放在 App\Controllers\Login 命名空間下6 p3 B( ]9 w" f+ Z
    保持了原有的類繼承結構
    1 ^6 u1 T, s9 y5 P8 O" r% _3 |改用CI4的控制器基類和特性" w' `: v# a9 C; v2 a  T
    $ O5 N" H2 n" {3 ^

    $ V. |4 H* X; {( n7 a0 i7 M& J改進的安全性:
    8 W; q, _& H# O& ^) `  Z" W3 w" K6 z* v* J- ~2 _1 ?
    使用CI4內置的安全特性
    1 m( K1 D1 v! Q  M% h* G* @3 P& Z$ Z更嚴格的輸入過濾8 A1 u1 }* q- T  v$ z- a: i& c% v. I
    更好的錯誤處理機制4 D/ ~/ F& _; C- J) I, C8 l- j

    : U! B" F& t7 F2 Z$ b, f
    : y( M6 }- M3 A2 o) U) g
    ( ^7 X2 T  {+ d$ E" K! P1 o& G) c  r要使用這個新結構,你需要:3 [+ _( c7 p3 P- q$ ~. ^

    9 z% @& s; r0 F! }; M: D+ ?將這些檔放在對應的CI4目錄結構中
    . `. z* i( F; J# T* `; w確保創建相應的視圖文件
    " x2 b" W7 H+ v配置語言服務: W2 S9 t) p+ |9 r3 O7 J/ }
    根據需要調整模組檢查邏輯) K; ~# s5 T: v! ~  t$ `

    1 D& n+ Q9 j3 N2 }8 m* X& r需要注意的是,你可能還需要:
    3 z( Y' {( Q& X1 A9 P0 E& i
    , K$ [( M  W4 c0 e% N9 J9 g/ H創建相應的視圖檔(在 app/Views/ 目錄下)/ y9 K/ G5 F# \- I! ]! ^6 k: e
    配置適當的中介軟體來處理會話
    - i6 r: ?" ?8 _  |% b7 f實現具體的登錄邏輯
    3 K/ c, K  F  u; A; ^/ i, ~- c/ `1 k
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    7 y+ o# \  N& N" E6 w  `$ q6 X
    * q. ^  G( U" l8 h* U) @
    1. <?php
      * l6 R/ G9 L2 D5 G
    2. // app/Config/Routes.php+ d! D2 u, l- B( D9 S3 X2 R* I
    3. namespace Config;
      $ y* Y! ~0 r$ Z  x  _8 {8 s. ^/ }

    4. 9 {5 L; F, L( n
    5. $routes = Services::routes();
      / N' y3 K3 |* ^! q$ W# l

    6. 0 J- \! X7 M+ T& Z/ F5 b; i
    7. // 添加自訂路由規則; q# ^+ w" y( r1 x
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      & O* V+ V$ t* E5 T8 I2 B( u' W
    9.     $routes->get('/', 'LoginController::index');
      + J, H" U) r) v: o2 i2 ^
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      : ?2 z6 I4 M0 @* F+ y% l+ h5 b  G! B
    11.     // 默認路由處理
      ( \3 }2 V  F1 P  B6 j3 @0 P
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');0 Y+ T: C0 C( T2 |1 |9 u* W5 Y
    13. });) F2 _; M9 K! {/ w

    14. 6 ^% ]( C9 r# M1 f+ Z, Y* T/ I, r
    15. // app/Controllers/Login/LoginController.php/ X6 T1 u0 c& ~, ~/ Z6 c* _; h
    16. namespace App\Controllers\Login;' A5 q$ I: N0 V* L- _, I8 T
    17. & Z5 }4 o8 G6 G$ Z" |
    18. use CodeIgniter\Controller;
      : g( t8 }  u" t) z6 H$ {% L$ s5 R1 z
    19. use App\Controllers\Login\AbstractLoginPage;
      6 b8 a( u1 l' I4 N
    20. 8 F+ C* R" H: D0 B# j6 e" j
    21. class LoginController extends Controller
      % ~7 j5 ?" }/ g, l" j/ k
    22. {
      5 J: ~+ ]+ e& N3 N, E5 a
    23.     protected $pageObj;
      2 Y" m( Q2 V6 R9 P" ]
    24.     protected $LNG; // 語言物件( S! k: {' A% R2 D- \7 H$ @

    25. 1 D; C+ `& A4 U8 ^9 E; {; W
    26.     public function __construct() / Y- B/ j2 W/ c! T5 _
    27.     {
      ; I# S4 h* C& T/ J) r9 k- y
    28.         // 載入語言檔和其他必要的依賴
      , X$ L7 i, b, k
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務) m' d8 C1 ?( c" @: s& i
    30.     }
      6 |# U. N% @) m

    31. . ^+ h3 F: X3 U5 S
    32.     public function index(): C- m- ?0 l2 L1 ?0 T' v0 Q7 p# g
    33.     {( s, J- @5 \, }5 t
    34.         return $this->handle('index', 'show');
      8 R) u) [" [5 ~% Q# B' Y
    35.     }, F7 w$ J$ s' l  Y% ^. N  G2 \

    36. - o" d7 e7 I5 e3 m
    37.     public function handle($page = 'index', $mode = 'show')
      / f) L$ ^' i) w! v) w6 h1 ?
    38.     {6 s0 M' }+ w$ |3 x% f
    39.         // 安全過濾頁面名稱2 P7 h8 e3 |. z( r3 X. x9 P
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      - x  E7 T; I8 F+ _) g
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';, o. q% P$ `7 X5 Y
    42.         5 \& f7 }: i0 K7 n0 b
    43.         // 檢查類檔是否存在
      7 `4 `) e3 d# L6 G" Y5 Y3 `, g
    44.         if (!class_exists($pageClass)) {
      + y5 N8 x2 l/ Z
    45.             return $this->showError($this->LNG['page_doesnt_exist']);' {. B9 G+ k0 x0 G! T, [
    46.         }
      1 w6 ~. s1 E) Y& `

    47. 2 l  J* \# Z* x0 z1 ~) Z# p* h. s
    48.         // 產生實體頁面類4 s0 j# D; {& K, D4 W8 }
    49.         $this->pageObj = new $pageClass();% m' H* ?( l/ E3 h  D8 y
    50.         
      # R. V$ g4 X+ O+ o. m
    51.         // 檢查模組要求; S9 l9 [" d8 o8 a  e3 l0 {$ M: W
    52.         $pageProps = get_class_vars($pageClass);
      # [& o% I2 V6 _% W1 |+ s
    53.         if (isset($pageProps['requireModule']) && ( k, E' Q  X# e  @* M# f
    54.             $pageProps['requireModule'] !== 0 && 9 `+ i' d' P1 q3 Y/ D
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      8 }; u' w( ~% Q  v% f# m5 M
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      $ U* B6 P! ^2 y+ h- _$ x) m
    57.         }
      9 t$ S, f  M% w5 }  ^- U# b

    58. $ H$ Z, w; m5 K& \4 K
    59.         // 檢查方法是否可調用) d- w% p+ o# Z
    60.         if (!is_callable([$this->pageObj, $mode])) {
      + z! `3 m! F% a. Q) q7 K4 G, n( P4 W
    61.             if (!isset($pageProps['defaultController']) || % @7 B/ k2 {9 @7 e% ?5 e
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {( e. b) q" f+ V3 }7 h8 e- t4 e
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      5 s" @. c- k& A( U& i. N
    64.             }$ k1 U( d  u4 X3 {+ J& Z
    65.             $mode = $pageProps['defaultController'];( F+ e) p  v7 S) s* \2 E
    66.         }/ u$ Z; B5 F* f9 v

    67. : S" \+ x5 L6 w! M7 L/ _- G5 L
    68.         // 調用相應的方法( I' k) s" R, y5 p7 t
    69.         return $this->pageObj->$mode();
      " o3 v8 }: V4 r$ C% a5 V) h' h5 H
    70.     }
      * H, w: \3 A+ }0 a5 X0 H) x0 v
    71.   a  X$ B0 ]. u+ C9 Y
    72.     protected function showError($message): s# a& W0 ]- n' p/ h+ ^
    73.     {: V8 `7 b0 g3 r7 L1 Z
    74.         return view('errors/custom_error', ['message' => $message]);
      4 c' h( R6 S0 M3 O8 ]$ v
    75.     }
      . z, f4 w# |$ I. g; Y

    76. 6 p1 M: l) J- H# I
    77.     protected function isModuleAvailable($moduleId)
      ( l( G2 _0 w) j& }! f
    78.     {# R" x# Y+ I+ Z  T2 x
    79.         // 實現模組可用性檢查邏輯
      # N; N5 Y  w& i; o
    80.         return true; // 根據實際需求修改) D. i( l3 J6 q) ?
    81.     }
      / K, s4 C9 R9 @/ t) O  Z) S
    82. }1 I. y# t' ]! F% U; p1 [

    83. . c  a7 e( R, k4 s9 y
    84. // app/Controllers/Login/AbstractLoginPage.php
      # U" Z$ i7 d) b( v: V
    85. namespace App\Controllers\Login;( F9 r- \  x, o3 v2 \$ P5 d) ]9 D

    86. ; \( \/ Q1 L% H4 R- `. I, f6 H
    87. use CodeIgniter\Controller;6 F; V- l) A7 n  h% @

    88. ' f* S. j: Z& {1 N7 o
    89. abstract class AbstractLoginPage extends Controller
      4 `5 j& ]0 x' s; L5 J) A6 p
    90. {
      6 c% M2 ~6 j1 C& n
    91.     // 實現基礎登錄頁面功能
      ; D8 L6 m# r* `8 Y
    92. }5 b' b+ P$ f3 ~
    93. 1 D' b6 Z- X, G
    94. // app/Controllers/Login/ShowErrorPage.php
      ) I7 \9 |7 D$ f& m. t' ?8 f4 x, @6 F
    95. namespace App\Controllers\Login;  ?; Z) }! o4 ]$ w+ G
    96. / W4 N+ B! s; b
    97. class ShowErrorPage extends AbstractLoginPage
      $ }8 p% C9 s" V: w+ u" b
    98. {6 }7 X" K# Q9 X2 d; F) z
    99.     public static function printError($message)* ^5 `- f" V- @; F1 H, b2 @
    100.     {
      & g1 Q+ @6 |- ], @- y
    101.         $controller = new LoginController();" z* i3 W! `& H
    102.         return $controller->showError($message);
      , S! z4 V% w% q8 O6 n# u# b
    103.     }
      $ }! W- L+ o/ {6 x" U
    104. }$ a* i. z0 N8 s6 Q! S5 p8 H, _
    105. , d# c, Q: G5 D- I, `1 k8 ~+ \! `
    106. // app/Controllers/Login/ShowIndexPage.php4 V. @4 T' Y* ~  |, s, e$ o
    107. namespace App\Controllers\Login;8 E: ]$ }1 i3 ^# d

    108. - M" M: v$ r& t
    109. class ShowIndexPage extends AbstractLoginPage1 Y* Y  L" |2 c& n, K
    110. {
      . e+ {. I2 R( Q7 f: s
    111.     public function show()
      & j  s3 |* v5 c2 r6 ]
    112.     {
      % j2 b1 ?3 \) v
    113.         // 實現登錄頁面顯示邏輯
      9 ~2 C2 O- k9 o1 S: [6 G, V
    114.         return view('login/index');
      9 S# P, {& [% W6 F3 s" R7 O' [
    115.     }
      ) ?9 \1 r5 u" e( h
    116. }
      & q1 {8 r0 O: f8 t/ K/ r" B, V
    複製程式碼

    文章的最近訪客

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

    本版積分規則

    Archiver|手機版|MyXNova (原 myxnova.com)

    GMT+8, 2024-12-22 00:44 , Processed in 0.015253 second(s), 9 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2014 Comsenz Inc. 界面設計: 我的XNova論壇

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