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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14027 / 14027

生命值:5%

升級   100%

  • TA的每日心情

    7 小時前
  • 簽到天數: 5653 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致* m* r6 d. f! l; A; o4 `
    AI 就是站長的最佳幫手。# T; \  h9 q3 P7 |2 n  C" Z

    ' B1 m" Y! {" u& W4 }+ ?) |2 J8 L1 J5 Y6 M& [
    這裡的「新架構」是指後端的架構會有大變化
    - ]) F9 S7 k+ q& N& E3 z  }但前端的 UI 介面玩家不會感受出來有何不同" R/ ~7 f& f0 D4 F0 k: I

    * F" L" z( q, O3 O/ {5 G; q% R
    0 [. ^: r) D0 ~3 B( s為什麼站長要改成新的獨家架構?! r1 I1 t5 t$ @6 _. B  T
    就一樣由AI模型來解釋清楚吧。
    . \' z8 l; m0 g5 I9 }
    ; a# u1 Y, ~  B
    ; O# T) U, H& b& L' w- X) _讓我分析一下使用純 PHP 和使用框架的優缺點:- m- g$ ~: Z# x
    純 PHP 的優點:
    4 K0 E7 J, s$ k7 J' {1.        性能較好 - 沒有框架的額外開銷
    ( l* D9 b* x- ^2 E( _2.        學習曲線低 - 只需要掌握 PHP 基礎知識% I+ y* M- `* x  e, b
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    " t1 ]# f( W; S" g! n' k) M3 ^4.        代碼量小 - 不包含不需要的功能模組  `  `" r9 E) t& @; \9 e
    5.        適合小型項目
    , A# V8 u* M8 d+ z+ ^1 P純 PHP 的缺點:
    + k5 O$ z2 R" p2 _* d" P1.        需要自己處理很多底層細節) q- a* Q6 N: i6 L% _
    2.        代碼複用性差1 C/ m* V3 E. J* H4 {2 f
    3.        缺乏統一的開發規範3 Z# j. Y, Q1 S2 V$ Y9 T
    4.        安全性需要自行考慮和實現: m3 W- ?( C2 s2 }$ w6 b5 X
    5.        開發效率相對較低2 i3 f& [) @) ~! x  n
    6.        維護成本高
    : d( \3 g& C9 x使用框架的優點:
    $ h0 |  N& Y) ?9 u* R/ \0 q" o7 H! L0 _1.        開發效率高 - 有現成的元件和工具$ u* V! ~$ U7 H  a
    2.        有完善的安全機制
    4 U& U+ J' l$ U3 H3.        統一的編碼規範
    . I; Y# O" P- R2 q! d/ B1 N' m  S4.        易於維護
    ' s2 y3 d' H% X  z+ K6 _5.        有活躍的社區支持
    0 l, z6 M8 p5 n/ }* D6.        適合團隊協作
    + W4 h9 G# D' [7.        自帶很多常用功能(ORM、緩存等)- r, `) O* [" k5 E# x
    使用框架的缺點:1 T! Q1 i' b6 S0 R0 F
    1.        性能有一定損耗
    4 v* w% d" x, _. Q8 G2.        學習成本較高3 p! Q# T7 f2 l" g# \; b1 _
    3.        可能包含很多用不到的功能
    $ c, r  |0 f! I& U. V* S1 E2 G4.        不夠靈活,需要遵循框架的規範& @5 |! v/ x2 F$ m- P  M
    5.        對小項目可能顯得過重2 @$ c( k5 s6 u" B1 B& W
    建議:, J+ J: }: J0 M8 u
    1.        小型項目或學習階段可以使用純 PHP
    1 N% [5 r. C7 A2 p8 c2.        中大型專案建議使用框架
    - T7 g  W6 a# d) z1 j9 x$ a5 o- Q! m3.        選擇框架要根據專案需求和團隊情況( ~2 F! Q* k- M; p* |0 s
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇0 ^. j, k2 Z& J; j$ b
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。; X" Y( U) W0 O

    8 K4 d* D% P  s0 _- ]% j+ F! F% l
    ( Y' s! y. Y" n
    1 S' ]4 q( |+ x6 s" \! i我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    " K* `7 {/ K  s2 l+ B5 K% ~1 O4 E+ P
    . m& S9 `: T- h* g) h+ t/ H這個轉換主要做了以下改動:' O; N2 u3 e  C1 g

    5 a* C9 Q/ U4 t* d+ S7 z1 H2 \路由結構:
    ; b; k$ T5 i% Y+ [# f' x6 }0 [7 |$ d: ?1 Y
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    5 U( @3 ~* J+ Y5 t# X7 U" X$ P7 C/ r支援原有的 page/mode 參數結構
    7 T1 ~# j' X3 |: L0 t通過路由規則自動匹配到對應的控制器方法
    " r, F1 r2 a- e! E+ n1 g' S& `
    # W) D" U) C- L& Y8 i  d! x: ?, p  |8 k" M' ^$ [8 `# t) L
    控制器結構:# l, Q1 ]; i# ^4 I. w

    + p. k9 l1 A" w( d) Z創建了主要的 LoginController 處理所有請求
    ; I2 _% o9 x' U6 A7 P保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    7 Q( E0 W7 T+ S% `! S8 x/ ~5 |錯誤處理改用CI4的視圖系統
      Y% q; r  z1 Z& t5 b9 r9 b  |; L7 s" f2 b
    9 b  c: F4 q; J4 v* A/ E
    類的組織:
    : f3 z/ S1 ~& w; z
    9 G. j1 {: {8 c$ N  O- h& }所有登錄相關的類都放在 App\Controllers\Login 命名空間下% ?; h5 G, O% b' u3 Y1 Q0 N
    保持了原有的類繼承結構
    ! k: ^$ p( h" {9 T/ f改用CI4的控制器基類和特性  y) o4 n' }. |$ o

    0 m. v% N8 a# t2 S  d8 R1 F: H
    改進的安全性:
    8 w/ B3 e& \& {
    7 y! N5 @" F" z5 i7 i使用CI4內置的安全特性
    - c+ |" {9 z5 @. |4 `7 Y更嚴格的輸入過濾
    8 {+ {, J# y2 F" T- E7 T3 {$ m+ J5 G: I2 V更好的錯誤處理機制6 S6 _1 u5 L: B: T( O  g$ K

    " j$ B: C) f; y+ \, J* b' n
    . T  ~2 I% j& g7 q- K& S
    9 F3 R, l' i! P! ^要使用這個新結構,你需要:( e9 s4 H- x" H0 u% P8 \$ m8 J: S
    6 Q$ s3 N% o, @4 Z/ ]4 A
    將這些檔放在對應的CI4目錄結構中8 F/ ?2 y: f7 F) J; ?7 R) y% M6 v& R1 n
    確保創建相應的視圖文件( ~2 I/ t) D4 ]4 \
    配置語言服務) R" g2 d8 K- x8 R
    根據需要調整模組檢查邏輯, L3 ]+ y; {/ A
    ) s( |* H" H1 _% h
    需要注意的是,你可能還需要:
    * N: A+ g7 m9 p& y3 @
    : n: C  P2 p8 ?9 p* _創建相應的視圖檔(在 app/Views/ 目錄下)
    / ^3 s7 ~9 M; b1 F配置適當的中介軟體來處理會話
    ' I% Q7 N1 ^/ c; b& F7 {實現具體的登錄邏輯
    ) j1 ^  {6 D3 U  E4 s- x: z! y! n! s" \8 f0 [, z# X/ P0 y( @: m
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?5 n0 _* {8 ^6 r! E( A. |+ Y3 f

    % i! r5 n1 h. c# N3 G
    1. <?php( E" X. ^& V  E
    2. // app/Config/Routes.php
      9 s" m1 G: ~0 _" R3 A
    3. namespace Config;
      7 J6 {- h, X# k& h3 i7 P
    4. ' r! M5 o+ |. O( A( Y
    5. $routes = Services::routes();
      # f1 n! [" s6 C% f3 J

    6. * P, n; h5 x8 t. c. w
    7. // 添加自訂路由規則8 a1 j7 {! o6 [# J5 V- c* U6 `: ]
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {" Q7 s& s0 M; S
    9.     $routes->get('/', 'LoginController::index');
        u1 {1 x. D0 a: T8 Q
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ( D& Y% z# }! z3 a! v, Z
    11.     // 默認路由處理
      : Q! I- n7 l  Q3 y- _. Y, ?
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');8 J! I; s- K2 _. ]: p9 ^( q
    13. });1 {5 W" N% I; h- O

    14. & M5 H$ q5 m" l, o- h! ]% u
    15. // app/Controllers/Login/LoginController.php( }9 r0 O3 u6 `
    16. namespace App\Controllers\Login;
      4 r$ B9 e" M8 N, m# R. [

    17. 7 l5 x5 U4 c5 d' [
    18. use CodeIgniter\Controller;
      . d& }3 b! E, B3 x& O! H" a
    19. use App\Controllers\Login\AbstractLoginPage;  c, X7 {) [7 o! `3 s. @

    20. / I3 ^- s1 K# c/ C$ \
    21. class LoginController extends Controller
      ( ?2 S4 P. @- g% j" W6 V! J" b
    22. {
      6 A4 B8 F8 {2 E; f% _( `/ D
    23.     protected $pageObj;
      & u0 ^0 H) z6 V, n5 H
    24.     protected $LNG; // 語言物件
      # x! |5 U( t6 a. k3 X
    25. & L. @8 M5 d4 Z8 ~, d- h
    26.     public function __construct()
      $ A9 j' e% Y' ~5 h! Q! I9 f
    27.     {& I( C* {" U$ |# m
    28.         // 載入語言檔和其他必要的依賴" M3 K: b3 x) P9 O. {4 }4 v
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務( {/ V+ G1 `5 F* l+ Z5 l0 B* g' |
    30.     }
      * \+ D  D3 i. I. i! U2 ?! p8 I) Z9 T
    31. # ]! p# R& r' h) C
    32.     public function index()
      + C1 z, e* i* [3 A9 k. C/ P
    33.     {& V6 _3 @* _4 ]2 l! [' b- E
    34.         return $this->handle('index', 'show');
      2 F; [& j$ `$ }1 X: v4 _! t: P2 y
    35.     }
      / [* [: U$ f& u, l0 ]

    36.   j" _4 J2 s! X& f& B- Z$ y; B4 G. o0 p
    37.     public function handle($page = 'index', $mode = 'show')0 S7 m, [1 R  l
    38.     {: o4 J) S% X" ~4 K
    39.         // 安全過濾頁面名稱
      - r# e5 J# [2 ^- c5 g$ x, ?
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);0 ~9 n4 ^8 G- \( }# E1 D" }
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      4 V! I5 R4 u, n/ d5 C; u- K, p. n$ V! y: k
    42.         
      + ^: l+ z) W. M
    43.         // 檢查類檔是否存在
      / e* C& n' ]& ^3 l
    44.         if (!class_exists($pageClass)) {
      3 }1 X; g$ {4 Q
    45.             return $this->showError($this->LNG['page_doesnt_exist']);. i2 h5 j( d2 ~. H+ t' e* Q
    46.         }
      % x. ~4 s( V4 S$ f0 A

    47. / O- T: W3 k- b9 T/ u6 d$ d6 z' {- z! ~
    48.         // 產生實體頁面類
      3 i  z% X. T/ N/ g' ?1 R
    49.         $this->pageObj = new $pageClass();
      $ |3 I7 q& I5 q, Z: ~" N7 A4 J
    50.         , c( T4 P5 `8 H9 Y8 V, N+ X
    51.         // 檢查模組要求" ]# o3 c5 K, Y% J+ `3 b% m
    52.         $pageProps = get_class_vars($pageClass);
      : W, q4 H2 h* u# V. j: w# D
    53.         if (isset($pageProps['requireModule']) &&
      2 r& O! M, L# V8 r
    54.             $pageProps['requireModule'] !== 0 &&
        b4 m1 D; t( `( \$ e9 U" ^+ k
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {: _( V, [9 `% {9 I- k
    56.             return $this->showError($this->LNG['sys_module_inactive']);0 r( @! V: f* e
    57.         }/ T8 e+ I. G. r  D; u0 i& b5 h2 @
    58. " k5 K: Q# y1 H/ C( g
    59.         // 檢查方法是否可調用
      6 W$ j3 b6 q$ m( i. I+ d
    60.         if (!is_callable([$this->pageObj, $mode])) {
      " r4 B. ?+ k! u8 Y  V, G+ l9 I9 _0 y
    61.             if (!isset($pageProps['defaultController']) || " ^0 N7 ?3 q. W9 X( l( N$ I0 X9 Y
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {  b" I, H6 z' z) g0 ~/ O
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      % W% D2 P% b7 W" c/ k; Y' `
    64.             }4 Y  E* Y% S5 O- b' ^
    65.             $mode = $pageProps['defaultController'];) u% P) u5 o2 k
    66.         }
      4 s0 c/ @2 l4 m% e" y8 w

    67. ) @; Y& S; y# \9 c: ~
    68.         // 調用相應的方法# H* u, p2 p* W& z9 l: e
    69.         return $this->pageObj->$mode();9 u7 X& U9 G& f- K( S7 W, ~
    70.     }
      " W; A$ r, W1 w/ ^+ R! l

    71. 0 s8 K( Z9 E3 e" B% q5 ?
    72.     protected function showError($message)
        M5 d0 |2 E, q1 {4 p& D* C' Y
    73.     {
      9 {$ x) w+ W% F8 e, A
    74.         return view('errors/custom_error', ['message' => $message]);
      , `' N  M/ n! ^6 ]/ n
    75.     }! j5 ~% z! |0 j4 X4 B

    76. # }# p2 I( `  R. H, J2 @
    77.     protected function isModuleAvailable($moduleId)) x/ p* y( }# ?* J8 m, p9 _* I
    78.     {8 z! D" g9 D8 p! k0 `3 m: V0 s2 C
    79.         // 實現模組可用性檢查邏輯
      - ^) Z4 [/ l( \* C( L1 l- U" g( d
    80.         return true; // 根據實際需求修改
      1 e* T. U' A. @2 X+ Y
    81.     }
        M4 \9 O9 }( q" W* L2 y  G. O$ a+ ~) \
    82. }
      2 Q$ X8 U- i, p+ ~
    83. % q6 Y+ e: @3 L) N. R4 k
    84. // app/Controllers/Login/AbstractLoginPage.php
        D. ^: I- X2 w2 q% g* |
    85. namespace App\Controllers\Login;
      * J9 D( K3 r# o; Y! g

    86. - n: b8 K! Z, z4 m
    87. use CodeIgniter\Controller;
      ( R6 Y# Z$ h$ v
    88. # S( G: m5 @, q1 _3 b8 p- a
    89. abstract class AbstractLoginPage extends Controller
      7 W. W5 b2 D5 e: n( o
    90. {
      $ a6 K/ K0 h* S! i% s0 q- H
    91.     // 實現基礎登錄頁面功能
      1 ]0 x; P! C6 W( Z
    92. }" T% `5 ~2 @% Y

    93. * g* ~- c& p' i5 E- O( k
    94. // app/Controllers/Login/ShowErrorPage.php. Z  V" M! F; ]; j! @$ C/ L+ D4 H
    95. namespace App\Controllers\Login;6 M; \& ^) o5 n3 Z7 @
    96. 3 a/ e3 E" \2 S; s
    97. class ShowErrorPage extends AbstractLoginPage
      " E% d8 c9 @# Q' |3 d7 U! o9 {' W
    98. {
      / x" t: G0 a7 x( N# V4 i
    99.     public static function printError($message)1 z& M3 b7 ~9 T" r% o7 a' O. T( X1 {
    100.     {
      2 d$ F2 \( t8 o* b6 v6 t
    101.         $controller = new LoginController();- l+ c+ c. }- i0 S8 g" F4 a
    102.         return $controller->showError($message);* `7 e+ v1 `4 g. v
    103.     }
      . k5 o- T( ?# l% O3 P; g! @0 A
    104. }( i+ f6 T  d# k6 q6 B: b

    105. 7 N' }# R( v$ N+ e* E- |
    106. // app/Controllers/Login/ShowIndexPage.php5 J5 n  _1 E- \: X4 a. N
    107. namespace App\Controllers\Login;+ m* N) G" S2 ^" V; U) ~8 V

    108. 3 ^& S; D1 `! C$ @6 ]3 j( o+ {
    109. class ShowIndexPage extends AbstractLoginPage
      3 n. r- ]% m1 x- ~0 }2 Q
    110. {& n8 t6 r4 G6 C: N! d" |2 \' Y
    111.     public function show()+ F3 f0 @# E+ U8 W
    112.     {: e+ O8 h. t) p, l- R
    113.         // 實現登錄頁面顯示邏輯
      $ L4 q/ K- w2 K. f6 U" V* R' ^
    114.         return view('login/index');
      " A& M) h8 _' D* U* C9 M; C) s
    115.     }* L1 |  J* d' M
    116. }! V1 X0 X7 u: v
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-7-19 07:48 , Processed in 0.014520 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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