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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14187 / 14187

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致1 D4 |; Y. S* B$ Z
    AI 就是站長的最佳幫手。
    : x3 o' U( ]4 w3 \' m9 ?0 D) e7 H! h0 C( X; V
    + {0 s/ u* l9 t
    這裡的「新架構」是指後端的架構會有大變化
    1 C# [* ~  T- c! ?& g但前端的 UI 介面玩家不會感受出來有何不同
    2 Y# g9 A. N" a7 Q/ R; G+ I
    % I& S6 F! w+ M8 G3 y! T- G4 x6 G5 M& b3 H4 }* U- G
    為什麼站長要改成新的獨家架構?
    9 x2 P; e6 l' t# `就一樣由AI模型來解釋清楚吧。
    ; i% [) q4 [( [% c+ b7 X
    - z% x; j- ~& B0 w
    4 ~7 c* V8 _$ B3 f. R! {. }- X讓我分析一下使用純 PHP 和使用框架的優缺點:
    . X* F. f8 D. U" Y: w純 PHP 的優點:
    ) |& A" F! U, _1 i! i1.        性能較好 - 沒有框架的額外開銷0 p! e+ a0 J9 g7 q9 C# l' O
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識% {* n0 O7 {5 t
    3.        更靈活 - 可以完全按照自己的需求來設計架構1 J- R) i% }) s7 s
    4.        代碼量小 - 不包含不需要的功能模組
    4 z, e8 M7 G- S4 L5.        適合小型項目$ A9 S2 z$ ~' l
    純 PHP 的缺點:8 x8 g% P8 K- X* B5 `: k" u# W, \: x7 F
    1.        需要自己處理很多底層細節
    6 h/ M" r# J% h* W' m6 R" P2.        代碼複用性差  n, E' e8 d; r' H& @
    3.        缺乏統一的開發規範
    - d' K8 j8 J6 [( Q. h: ^0 a, y4.        安全性需要自行考慮和實現' r7 W+ ?! b8 `1 ?: N0 \7 G3 ^
    5.        開發效率相對較低6 t  D* G+ r/ |  d! c- u
    6.        維護成本高' P2 O3 y4 n8 Q9 s
    使用框架的優點:
    1 P) ~% ~. t+ r5 Y4 B0 Y- _1.        開發效率高 - 有現成的元件和工具
    4 o1 ?' B/ f+ g% P6 R$ u) G  {2.        有完善的安全機制9 Z5 X- s  @$ G% j- a- I
    3.        統一的編碼規範; g8 L% @3 N/ S9 J% f9 {
    4.        易於維護. ], g6 g5 m# v3 W
    5.        有活躍的社區支持
    3 w; C4 Y3 j$ T5 R; M& g: O4 o6.        適合團隊協作/ ?/ _- ~$ ~/ f
    7.        自帶很多常用功能(ORM、緩存等)  Z$ C5 U0 j4 \
    使用框架的缺點:8 {. U  W% e5 e4 J6 i
    1.        性能有一定損耗
    % H# ^% i+ M! N/ {7 }& O& s2.        學習成本較高
    ' V0 |/ \0 v: F( H; H% m3.        可能包含很多用不到的功能$ p$ k: l! `8 K3 t6 C7 v! S
    4.        不夠靈活,需要遵循框架的規範) _, U9 r' V" e( A# L, J4 _
    5.        對小項目可能顯得過重7 m2 o: m/ m; b7 [6 B* n; i
    建議:
      h9 W: \6 S; @% @! B" M- i0 W1.        小型項目或學習階段可以使用純 PHP
    % n: q% w& H/ W5 ^4 s$ D- |5 T2.        中大型專案建議使用框架
    ) |6 J4 r8 D5 e+ w- i4 B+ r/ \# B3.        選擇框架要根據專案需求和團隊情況/ C/ q5 ^/ Y. ~  H0 @2 o/ T# Q
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    2 m/ L# e% U5 K( j. n您打算開發什麼類型的專案?這樣我可以給出更具體的建議。! q3 l) D  A; C- ?$ |! U* O* Z' D

    7 w  x& y( g* C  {1 L+ w
    + V0 n/ s0 h, B5 M8 G1 L8 M& }
    0 Z0 J  e$ T5 `* ^我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    / q( T4 Q1 l" Q! w
    6 p; x0 X) r( P" U  l8 k- X這個轉換主要做了以下改動:+ d# H' e) T" ]6 L2 D5 n8 K. t
    ( J, O0 S- ]  K* o" p) J5 Y
    路由結構:
    4 b  J+ d1 Z, h: C: L$ v5 Y0 @
    ' T# E. ^: T8 x5 I$ h' e使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    - [% h. o8 I% x$ S支援原有的 page/mode 參數結構
    * [! l/ U% p8 M# r通過路由規則自動匹配到對應的控制器方法
    6 f9 S+ O3 P& G: i( k0 [# }  J- Y) A$ S9 p9 @! s$ h* q7 |
    $ e4 c* P" `# L# _
    控制器結構:1 V# n, M( \7 E- B) t+ a
    2 w4 G) Q+ n, t. Q: Q8 J2 R2 O
    創建了主要的 LoginController 處理所有請求
    : @! v2 r( b1 x' F1 `3 n保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    # b/ s' t( f6 c' o: t. Q錯誤處理改用CI4的視圖系統* J" K% X& F& J3 A% B# ^9 a: J' ]

    5 F# Y; n# k8 q
    ( `; f  \4 R8 f" W類的組織:
    8 W3 d8 a3 v. I5 \. T. b
    5 @& a6 \8 V. x- P所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    6 c. U* w% G- V" M$ v  `1 Y5 q+ C保持了原有的類繼承結構7 N) h) Z( ]9 |$ A
    改用CI4的控制器基類和特性, c: C$ M; @/ W3 n) X9 g& \& `

    " g" R% d/ v) q; w
    2 I2 O; M! Q! l0 W/ Z改進的安全性:
    4 B/ \7 K( ?/ W; H- V9 n" m" n% I5 |5 C  n7 u/ J, w2 r" e
    使用CI4內置的安全特性1 ]3 s% \7 L5 S. ^4 B# l
    更嚴格的輸入過濾
    ; S* s! w0 w( N) _" c$ d& \$ h更好的錯誤處理機制. ^: p5 J5 w% E" B& Q, L
    3 E0 u0 z: _! o

    / J: V* g2 `' j2 y3 C1 I
    0 o/ F3 \/ z% N0 H要使用這個新結構,你需要:( r6 P- o, o1 _' W
    & H# X2 f, W" E1 w4 J
    將這些檔放在對應的CI4目錄結構中8 |, n% X( Z2 F
    確保創建相應的視圖文件
    ) N# R: y- ~$ h5 _" `4 T6 w5 L* d" b配置語言服務
    6 y- f2 {4 ^5 J. j根據需要調整模組檢查邏輯& R8 N5 U1 a2 ^6 O! n, w/ r

    : g( @" j# g4 ^( F$ \- }6 h5 A需要注意的是,你可能還需要:
    ) y# F. `1 H; y/ H: Q8 g/ N
    3 `& I7 v2 V1 I4 ^6 M/ K創建相應的視圖檔(在 app/Views/ 目錄下)) ]3 l& n1 D6 I. B2 K
    配置適當的中介軟體來處理會話: I3 J" ?, u( _  ?* M% `
    實現具體的登錄邏輯( |7 E3 c1 t, R

    ) d9 y) R- a8 c, b+ Q' `" M需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?' \" `( g, Q5 u, u: B

    ; ^# y6 A$ O) w0 \1 f
    1. <?php) I" X! R3 ^/ ^, o
    2. // app/Config/Routes.php
      : J, Q+ \# d* g3 m
    3. namespace Config;
      * r* H" E5 z2 q, T
    4. 6 J6 Q7 s' b$ _# @8 S6 G
    5. $routes = Services::routes();
      8 z4 h& z# ^6 _6 d5 j% W3 e  M1 k

    6. " I3 U3 f# R+ e3 e+ r* k
    7. // 添加自訂路由規則
      / \1 h- A9 |- o2 X6 K1 i
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {8 T1 D( _1 u4 h1 z1 f
    9.     $routes->get('/', 'LoginController::index');
      % B8 g! p$ Y7 [7 P2 }- u  g
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');1 m0 \! l* O, Z* U
    11.     // 默認路由處理
      # X4 ~. H9 M: x
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');. a% ]6 a& h- x6 A8 G/ k! ?
    13. });
      ; r; N( y9 }2 d$ O

    14. ; ~* L- k+ C6 R8 x2 L
    15. // app/Controllers/Login/LoginController.php7 r) x+ H5 Z6 A$ i5 C% c2 n
    16. namespace App\Controllers\Login;
      , l6 j6 G# p9 y3 Z; U- q! I
    17. - {4 p% b: u* M; w: I( E
    18. use CodeIgniter\Controller;) M* a/ M0 [0 q' V+ w7 h# G/ [" R4 ~; |: i
    19. use App\Controllers\Login\AbstractLoginPage;, q& o. Z: T( }- J  k( g) e
    20. 8 ^2 F: {% b& w& c9 s
    21. class LoginController extends Controller. A% G; \1 m' i7 C9 a/ d
    22. {
      / B" l, `' Y  O  s
    23.     protected $pageObj;
      5 H" n4 q; P4 d" V- A
    24.     protected $LNG; // 語言物件
      - _' w. b, C5 b8 \( k  {' I( I1 C

    25. 0 q* x$ I. L5 ^, C4 e& C8 x
    26.     public function __construct()
      5 j* N3 ~; S# S1 K! Z/ s  y
    27.     {
      % M) ~: u+ [9 P- C0 ?! o, Q
    28.         // 載入語言檔和其他必要的依賴5 R; y8 y% O, n# q1 v
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務) _' n- {. F; u% g: k9 S3 o1 N' j
    30.     }
      8 l5 l$ f( D: \; K
    31.   l+ \+ O+ z1 C5 S6 Z$ {
    32.     public function index()# x1 o8 w; _1 \, N
    33.     {
      - _. d: H# X) m' U4 w+ a
    34.         return $this->handle('index', 'show');  a% b+ |$ L6 ?" P
    35.     }1 a6 _/ m. `$ }! V8 Q' E

    36. # @; |2 _( B( P2 T* L$ t7 w9 S( f
    37.     public function handle($page = 'index', $mode = 'show')
      ! c2 U4 R2 Q9 u9 e; _6 x- M, o
    38.     {) t  a9 p$ P" M+ P
    39.         // 安全過濾頁面名稱
      ( }6 k6 Z5 ~1 _3 P- D
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);8 U  \+ [1 g( |; Q' l
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ; y$ N$ Y; ]7 i' C9 X% u
    42.         
      ( U6 B; M7 |; B, A' b
    43.         // 檢查類檔是否存在6 y: l* {/ W, r7 }1 C9 ~2 ?8 ^
    44.         if (!class_exists($pageClass)) {) A0 g* M5 O! A$ `. n0 Z+ ^
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      # f/ n8 e" R! Y
    46.         }
      8 I2 ^# f' M# N4 Y4 T8 z8 y
    47. 7 D9 F# P- v  Y2 i2 k/ L
    48.         // 產生實體頁面類
      0 S) q. u4 _+ p  q
    49.         $this->pageObj = new $pageClass();
      + [( E4 h8 S: d. v; e6 l$ K. g
    50.         
      # b! S+ ]: `2 V
    51.         // 檢查模組要求
      - L' P7 j( s* k1 S/ E' h
    52.         $pageProps = get_class_vars($pageClass);
      8 K& J: @" f0 K1 [8 @
    53.         if (isset($pageProps['requireModule']) &&   n" W! Y+ k/ C5 O$ T1 @2 B
    54.             $pageProps['requireModule'] !== 0 &&
      9 }' a8 @6 ?0 _# [
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {/ ]0 r* |0 r7 z/ O6 l5 r
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      9 n5 s0 B# B4 |/ T( }
    57.         }+ [& Y$ I+ f* B) `  u; Q) l1 H; B
    58. 3 m/ G6 B5 N$ l# o+ u! s6 T
    59.         // 檢查方法是否可調用
      ( V$ C" V% _" \7 ^
    60.         if (!is_callable([$this->pageObj, $mode])) {; a5 v' H4 D) m# `  x9 d8 d. f+ J
    61.             if (!isset($pageProps['defaultController']) ||
      - g" F: U4 f3 ~
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      5 X3 y6 B3 U, Z5 i4 x
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      . c* f' |7 V$ [% K' w6 `6 j6 h
    64.             }
      " Z. ~! Y# D  h6 N2 T6 A8 E
    65.             $mode = $pageProps['defaultController'];0 b3 y5 f. B1 d* l8 ^/ i! b
    66.         }
      4 ^2 a1 u8 ~9 v* Q. b% |  T

    67. * R0 z) A2 v6 F$ V" ~- o
    68.         // 調用相應的方法+ p& D. X3 S2 F! J
    69.         return $this->pageObj->$mode();$ F' ~) d" ~% k5 q. X. a
    70.     }
      1 c. k. e1 T0 P: b

    71. 2 {( F7 o% c: J( y# i6 s
    72.     protected function showError($message)
        a# _1 Y& u4 ?+ H2 m
    73.     {- d( J9 K% {6 [3 ?
    74.         return view('errors/custom_error', ['message' => $message]);* T* c9 }; y& S, d" m
    75.     }
      - N* H; J) t0 A' c1 o
    76. ! T# T3 s) b& B+ t- M
    77.     protected function isModuleAvailable($moduleId): n7 |  Z) m3 \# U  w8 F% G6 ?5 R/ s; `
    78.     {, O% H9 X( `6 \
    79.         // 實現模組可用性檢查邏輯
      3 w' R! `: Z7 T3 ^' M' E
    80.         return true; // 根據實際需求修改
      3 G0 S4 q9 }  A4 v( ^
    81.     }0 ^2 Z  b2 X- X' L  O, U
    82. }9 Z# A# X9 A6 }7 {
    83. 6 i4 ^& s! m1 @" L
    84. // app/Controllers/Login/AbstractLoginPage.php) q5 N- g* {- h9 ^: }6 [
    85. namespace App\Controllers\Login;
      . T# E8 [  @, h

    86. 0 o# ^3 P- b; S: |7 O( @
    87. use CodeIgniter\Controller;
      / u$ r- G2 X# a
    88. ; `9 _; T/ h7 J" L' W4 R4 Y
    89. abstract class AbstractLoginPage extends Controller
      ! X& h7 R& G: w2 R. X0 T- a
    90. {+ o, b& B( B* {/ t  {1 C3 \6 V
    91.     // 實現基礎登錄頁面功能8 A8 D) G3 p# o5 E$ T. J
    92. }; e3 l" E4 N( ]( e
    93. & C/ U& X, u; `( V0 _  a
    94. // app/Controllers/Login/ShowErrorPage.php1 i9 M* s! q: O( P. w  E
    95. namespace App\Controllers\Login;0 r2 Q! t/ t- U: e3 v
    96. 6 o. o& v8 s/ v$ Y9 q& X: x, k
    97. class ShowErrorPage extends AbstractLoginPage+ m6 o. c! N/ z: B
    98. {! }8 X1 Z# R. Y& m5 f* v! o; y! b( e
    99.     public static function printError($message)! U7 J2 e) V$ |4 s! p$ f
    100.     {
      & x2 J* a" A3 ?" Z3 i7 v
    101.         $controller = new LoginController();
      1 A' g6 \1 Z0 q9 V6 D
    102.         return $controller->showError($message);
      ) V' s3 m) Z9 g4 ?$ N* K% {
    103.     }
      4 t0 S$ Z) j- Q) ^" s
    104. }3 v* `/ S; V7 h8 q
    105. 9 a* I! G9 L. Q' s2 x
    106. // app/Controllers/Login/ShowIndexPage.php
      ! |( Z# R7 R8 T  k9 o
    107. namespace App\Controllers\Login;
        q7 c4 L9 p& v! ]1 J
    108. 4 t! R8 l3 L) h, A
    109. class ShowIndexPage extends AbstractLoginPage! T, D# u6 |. a8 Q5 U3 g
    110. {
      - g5 K4 t; E& Z: R. e. K# U" {  I
    111.     public function show()
      0 Y6 G, ~2 Q9 E% r" E. n
    112.     {9 x% F) }* t* i) P) J# g
    113.         // 實現登錄頁面顯示邏輯
      " O* [/ ?+ {* V% d
    114.         return view('login/index');" ~0 J4 I2 ?% B3 O: V: F
    115.     }' o8 V( [" d9 N5 b6 O
    116. }
      , j3 s. G! ~; k- K! q7 b5 C) \
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-9-18 13:45 , Processed in 0.014042 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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