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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13994 / 13994

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    昨天 01:18
  • 簽到天數: 5641 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    $ X* C8 P& ]2 c- W6 d' }AI 就是站長的最佳幫手。
    ! s- T  G% t2 C9 n) C6 C0 I# }; S' D. H2 ^1 m( g

    8 F$ V% R1 ], \! c# V3 [% G這裡的「新架構」是指後端的架構會有大變化
    4 z$ [, l' v7 {5 D& Z: `$ @但前端的 UI 介面玩家不會感受出來有何不同' T2 [" k. H/ T9 ]
    8 |- w' {8 v* ]; p  \* u, R
    ' `1 {: i' c, D/ Q2 b1 r2 t
    為什麼站長要改成新的獨家架構?
    8 }$ o3 g9 g" H& H& W就一樣由AI模型來解釋清楚吧。% Z- B* I# m  F9 b" K4 Z0 C
    3 c1 n! q% `1 L' ]! X
    # L$ A, s  B5 z# p* O/ Q* _
    讓我分析一下使用純 PHP 和使用框架的優缺點:( z4 J. p  ^. ^' n; K8 c2 r
    純 PHP 的優點:
    ! t8 s6 Z3 J8 I# x0 x. W1.        性能較好 - 沒有框架的額外開銷6 e! B, G7 Z5 c. D5 g# W3 o4 T4 d
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識( s7 U: ]: Y  J1 g1 M
    3.        更靈活 - 可以完全按照自己的需求來設計架構, t- Y1 h4 i& N' M- w
    4.        代碼量小 - 不包含不需要的功能模組
    ' Z: L$ N) R) }/ H1 c; A9 Z& Q5.        適合小型項目1 J# p! p# S+ S' k
    純 PHP 的缺點:
    / ]: N/ b' Z, ~9 Y1.        需要自己處理很多底層細節# Z* g) O1 G, r/ c9 b0 X
    2.        代碼複用性差" A( N1 V4 B- ~# o5 g7 L' B
    3.        缺乏統一的開發規範) b: b) A$ J- j4 |- e2 n( `" z
    4.        安全性需要自行考慮和實現8 N) |, c8 L9 V9 R
    5.        開發效率相對較低
    ' b  C2 v8 ?$ p: p+ I& x; j6.        維護成本高0 f6 _( _: k! u2 t) g: Y
    使用框架的優點:
    . S& g7 @5 [0 b! {2 w4 }1.        開發效率高 - 有現成的元件和工具
    * _4 R8 J  Y: k8 R, ?) E' Q2.        有完善的安全機制
    5 J, ^1 E. u4 z. F3.        統一的編碼規範1 L7 b4 I1 \" b2 k& T1 \" {
    4.        易於維護" G$ y( i) M- Q5 S/ B+ t! n
    5.        有活躍的社區支持
    ) f8 t3 A! j( c5 y' a% V" g6.        適合團隊協作
    - W1 n+ Q  b+ K- j* A! P$ L7.        自帶很多常用功能(ORM、緩存等), @2 X: _5 J7 `" p6 @: a
    使用框架的缺點:- ~1 j& P& f. T
    1.        性能有一定損耗
    3 `3 \# f( S: M$ {2.        學習成本較高( }/ t4 @# h: j% I7 Z0 O; x$ Q) L6 H
    3.        可能包含很多用不到的功能; t" [- W- f. U: r& D
    4.        不夠靈活,需要遵循框架的規範1 j' c* f& o, u
    5.        對小項目可能顯得過重7 W7 P- [9 ?& @
    建議:8 B5 F+ ?0 Z' w; f
    1.        小型項目或學習階段可以使用純 PHP7 C* H) Z; \4 d( W$ W' D9 u! C
    2.        中大型專案建議使用框架
    0 M) P1 x# Q& R% }% s6 ]& h/ {3.        選擇框架要根據專案需求和團隊情況! b" e1 b/ H1 y/ ?% Q1 P2 f
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇/ A/ r7 ?  A9 ~6 R& P. _4 |
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    # C, k" `( V& g; u* D( ?( T8 U& ]( t

    % F1 M3 q, d" J& h. Q6 v
    2 k# N+ |; u+ X5 q7 F我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。8 [: c9 O) ?0 v- y$ e! H- k& W

    ) y" e+ P3 l' {: b% n這個轉換主要做了以下改動:* r0 E/ T; S% F+ ?# U7 S

    3 T5 L' [$ n) ]) Y路由結構:1 N( o% W6 _# G' @+ H& J) |7 A
    8 [/ \% X: R6 h$ n* X8 z. h
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    0 t* a; v3 E8 v7 R. p支援原有的 page/mode 參數結構
    4 r" l- u5 d6 ~' R# e( u5 c7 r; s通過路由規則自動匹配到對應的控制器方法
    * v  r$ L( B) C9 n$ B
    * W2 V& R2 m1 K: ]) _* b: h8 x+ b, c$ |/ x
    控制器結構:
    9 x: {2 N8 x; x- y+ j9 U
    ' J- T/ p" P2 W: n; m) l創建了主要的 LoginController 處理所有請求/ ~" O; R1 n) {* Z
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    * s7 K6 ^# `1 D3 E錯誤處理改用CI4的視圖系統, i. a0 a& g" Z. j5 s7 \

    2 Z7 z2 M. I1 `0 h' W$ D- b: s, z+ O: P: z; [
    類的組織:3 X; j! y3 r; M8 G
    0 q9 ?4 F  m" {  e. F8 t
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下! v, S9 N7 ~" o; F/ t/ D/ e$ F( [
    保持了原有的類繼承結構6 X) u' L' g$ |( P6 @
    改用CI4的控制器基類和特性
    # y* ^% [( z3 s
    # u" ^+ P: j4 c( R" C0 G
    6 I) }. @, T+ j/ R' w+ \改進的安全性:
    * E+ o  ~$ H; U( u: Z7 c! J4 |
    / ^/ P5 z% V, x! C' @# G使用CI4內置的安全特性
    ( _- _; K% k9 f0 r8 m( H更嚴格的輸入過濾! p0 h( n  @0 D
    更好的錯誤處理機制+ G! s, _1 K4 k6 O0 v
    : O: z" c! [; }- q* l# s

    : B* j) I$ m2 j. F4 u* m- p+ F2 O. W' \' |  v; Q
    要使用這個新結構,你需要:. o# ]) _$ C1 O- A
    : k* }) h( t  T# W
    將這些檔放在對應的CI4目錄結構中
    ! g: _. |+ J8 i! v5 C: d3 o  u確保創建相應的視圖文件
    2 E" }6 k- ~- C; @1 ^( `7 k配置語言服務
    ! u. Q. U0 Z) ], k+ `3 X5 o根據需要調整模組檢查邏輯
    # V1 x# K. l) b- o2 s5 H, t  \
    2 ]2 W& a# a2 i! {: K! L9 o需要注意的是,你可能還需要:
    ; @8 Q' k7 H3 h) l3 l7 j- h5 ^
    + {' u7 n+ x- K2 J/ H創建相應的視圖檔(在 app/Views/ 目錄下)
    5 O) T4 C0 ]% \& Q9 {配置適當的中介軟體來處理會話
    3 m$ X+ ?9 c4 V# ~實現具體的登錄邏輯
    2 j) C9 J% ~" m7 Z' r+ Q
    # D) S8 J3 o' I+ r  e/ L需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?- |0 {. @& L& B; R8 U/ G
    3 o' F( d+ X. U) B) M' z
    1. <?php4 N- X& Q8 e2 E5 Q
    2. // app/Config/Routes.php
      2 @( z# X7 F9 M" c
    3. namespace Config;, ^2 X7 l1 E, D5 B
    4. ( f5 H6 C5 ^3 }2 ]3 j6 d, q
    5. $routes = Services::routes();
      1 w4 E$ h; g1 B) \* w  g
    6. ' p: w& c5 B, h' n5 M  f' j  L
    7. // 添加自訂路由規則& j! R% C6 k7 ~6 {, b" i( g' \
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {' v; @! H/ O4 a8 p
    9.     $routes->get('/', 'LoginController::index');, A: K* S* H. f+ \
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');$ L  v9 a% e' N1 |8 I( W5 r
    11.     // 默認路由處理6 ]4 z6 I4 t# Q! B
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');: t; Q7 k. Y6 U9 s! t6 v
    13. });) \$ J. _; A8 C  p' S, \0 \3 O
    14. 8 t3 x( O4 z1 E' Q: k) W& j
    15. // app/Controllers/Login/LoginController.php
      & d) k7 J. h* @
    16. namespace App\Controllers\Login;
      8 }' a# U1 Z6 b# C7 i
    17. 0 w1 K$ |- a) G  S4 V
    18. use CodeIgniter\Controller;2 t* T# |( n% J2 |0 w* e/ ^; I
    19. use App\Controllers\Login\AbstractLoginPage;
      / q$ w1 e$ k: j* |

    20. $ e+ K! ]2 R: \6 W
    21. class LoginController extends Controller
      6 u: D( t% D0 I2 t* ?6 X1 ]
    22. {
      0 Z. M- Z$ N6 t  d% K" \
    23.     protected $pageObj;3 b7 I1 K% W, m( |
    24.     protected $LNG; // 語言物件: J7 U' l$ j0 p, g, E5 T
    25. * d* f  g% N. x; }/ y) _! r. [
    26.     public function __construct() ! \) e2 Z) |: s& F, r* Q
    27.     {  c: W( ^  h" H. B( {
    28.         // 載入語言檔和其他必要的依賴- ^) T1 ?- s/ E. f% _
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務" D. q0 \9 F7 @: s1 K3 f
    30.     }
      * r5 {6 S7 Y) {/ K6 K$ a7 J# U# y
    31. ) A: t$ i- a& H8 p) l
    32.     public function index()* f) h2 ^; M$ y
    33.     {! Q% ?9 B3 x6 E1 J+ j2 H) A, }
    34.         return $this->handle('index', 'show');
      2 M# N/ s  T8 R8 R- A: j/ L
    35.     }  ~6 h4 J8 |+ r
    36. " C) |# f& l% C' B" J4 z" h
    37.     public function handle($page = 'index', $mode = 'show')
      6 f% o" w. a+ i4 X
    38.     {
      5 e6 ]4 ~. V, @! }& ?; z2 f6 X
    39.         // 安全過濾頁面名稱
      8 ]; y: g! I- r4 f1 D2 [* B
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);) r( f% e4 O. T% O# o
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      7 X) f1 B- p$ a( \8 e" q  m% H. G
    42.         
      ; D# Z8 N( T6 H& ?. x3 n
    43.         // 檢查類檔是否存在
      3 U9 W6 ?& g4 ~- [0 M' D
    44.         if (!class_exists($pageClass)) {
      4 F$ K% s) I- e4 H. I
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      & O% y" E7 X" w* R+ F% B( W
    46.         }! `: z" B5 O! r# ?$ T

    47. & c4 m! \' X5 _- n8 T
    48.         // 產生實體頁面類
      # l+ J+ f) R% n$ \) u0 S) }
    49.         $this->pageObj = new $pageClass();# ]+ S/ e! f: @' n
    50.         
      % n- p, [( h2 S, v" w4 m
    51.         // 檢查模組要求
      3 f% S! ^! w7 F$ r
    52.         $pageProps = get_class_vars($pageClass);
      / u) g- C5 V: U: G$ X- U- |. C5 J
    53.         if (isset($pageProps['requireModule']) && + A! P6 A: c2 l7 {( [* e
    54.             $pageProps['requireModule'] !== 0 && $ K; j  B) y2 \/ b3 R) T0 T7 [
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      8 ~' |+ x; [  C/ J7 G$ L4 }# x
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      0 c" j9 N* L7 t* F3 q" h3 R
    57.         }
      8 q, V8 L% T  H1 E: a: m

    58. & J  |" r. p) e  Q8 ^% x% F. f' f! K8 C
    59.         // 檢查方法是否可調用9 h4 V0 J8 D- I1 s. s
    60.         if (!is_callable([$this->pageObj, $mode])) {# k" o! Y% ]# e7 x) Z* `
    61.             if (!isset($pageProps['defaultController']) ||
      + _5 T. [9 Y; ^( {6 A
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
        E+ d* M% z; A' q7 x" M
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      8 p  N4 ]) x4 j  f* }# X  Y4 G# y
    64.             }3 v! W( Q( I4 e2 O8 Z
    65.             $mode = $pageProps['defaultController'];
      + T3 d, f% F. M
    66.         }
      3 b; t) z6 P+ @4 T$ V8 }
    67. + I3 i* }% W' w
    68.         // 調用相應的方法# U: H$ L5 s8 c$ V! u$ Y' i' ^
    69.         return $this->pageObj->$mode();
      5 Y, z- g* T! D* l7 |
    70.     }
      " S+ P$ W+ z0 Z
    71. $ d4 Z6 _( e1 z" W
    72.     protected function showError($message), n) D, ^1 k5 X1 ~
    73.     {" k4 [, J/ L$ G1 i3 @8 C! x
    74.         return view('errors/custom_error', ['message' => $message]);% b6 D2 c  E9 Q
    75.     }
      5 l, g9 ?0 R# B

    76. % u# y. c4 X$ P- ~' p# P7 N5 |
    77.     protected function isModuleAvailable($moduleId)+ b0 J9 N- z$ k' w# c
    78.     {
      ' f- q: I4 e  F8 C: t( X
    79.         // 實現模組可用性檢查邏輯. ^1 O$ p2 f/ L" \: W3 C: a
    80.         return true; // 根據實際需求修改( G) c* ]4 l/ B3 L' B% O- A+ o) N; p
    81.     }, D  c* N# z% e5 W4 g+ b
    82. }0 {8 m' w+ h* P
    83. 7 U' x; j  D9 p
    84. // app/Controllers/Login/AbstractLoginPage.php
      + l9 E% h3 U4 @6 G0 M
    85. namespace App\Controllers\Login;
      4 J( A: F4 z! J# D* Y6 K8 J
    86. & L6 t# A  u7 E$ }' _& l
    87. use CodeIgniter\Controller;
      6 h5 L2 q6 R. V! C
    88. / `+ k; j+ W/ \" c; j5 e
    89. abstract class AbstractLoginPage extends Controller% O4 O, O9 a" `; a
    90. {
      9 H9 c, z3 y: b2 R. O4 j
    91.     // 實現基礎登錄頁面功能
      ) ^1 s6 q8 ~" n1 D& j  M
    92. }8 y$ P, f  V, ]0 f+ z

    93. ! p' a' T1 V- p2 V; ?+ f' A
    94. // app/Controllers/Login/ShowErrorPage.php
      # M, q9 f, V" u& k+ _7 y5 b- [
    95. namespace App\Controllers\Login;* w6 ^( u5 S- v+ o, ]6 ^

    96. % }$ D# ]4 }0 k
    97. class ShowErrorPage extends AbstractLoginPage
      ' h- r9 {& @& e# Y
    98. {( H) R7 I5 S, Z( Q" p' M9 g( q5 {
    99.     public static function printError($message)# k  x$ J  T9 w' H
    100.     {6 Z* N. K9 W* [  B8 U8 U" W7 U
    101.         $controller = new LoginController();
      1 N* O" s. {# T; u2 M+ I
    102.         return $controller->showError($message);) v* d6 z  S; v' N+ k  X% P/ l
    103.     }
      1 }, j" ~4 S8 c8 P) @) g0 f
    104. }
      9 ?3 E; k8 H3 g) c: [8 I6 @) s" E3 k

    105. 1 a; d; H1 p% ]) |4 Z2 \$ N
    106. // app/Controllers/Login/ShowIndexPage.php# M) A* a$ I4 `9 s6 t4 \
    107. namespace App\Controllers\Login;
        [8 s2 f; [5 e' s: m
    108. # w* t( Z, T( e: r- U( Q. n' r$ f# {
    109. class ShowIndexPage extends AbstractLoginPage
      $ |% J4 @  a5 h6 [- c5 V
    110. {
      $ W% b5 Y3 k1 d" G& n
    111.     public function show(): T+ f3 h# X: n8 O0 w7 r5 y& T4 K% R8 s
    112.     {; ~: D+ L# f8 v  [% E
    113.         // 實現登錄頁面顯示邏輯; R- y' J1 ?1 v" }( _# w# N7 C
    114.         return view('login/index');
      ( r7 w, u0 J  a4 q2 p7 u
    115.     }9 ^8 v/ O- n. |3 v& q! \; T
    116. }
      " b6 Q! K5 r2 a9 X* r
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-7-7 04:38 , Processed in 0.015015 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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