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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13939 / 13939

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    6 小時前
  • 簽到天數: 5627 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致6 v+ v5 t6 Z% |  H8 w
    AI 就是站長的最佳幫手。
    2 m4 t9 \) B0 Q6 J3 ~# @0 V' X: x& |

    2 M% U. U% i/ C  o1 ~2 E這裡的「新架構」是指後端的架構會有大變化- Z. S8 P' n" ^' R
    但前端的 UI 介面玩家不會感受出來有何不同* E9 S! |( I: U  ?7 r" z4 B
    8 X& A" W& A( C3 O  [

    9 p- m0 a" L$ P! i1 J; T5 I為什麼站長要改成新的獨家架構?
    . D% C6 W7 q( G+ K就一樣由AI模型來解釋清楚吧。1 a) K: ~2 c+ p. z' L3 T
    4 n0 N5 @/ Q6 M: h6 O

    : z& p- {* h! w; o; ^/ s讓我分析一下使用純 PHP 和使用框架的優缺點:5 d) l3 K7 i! X9 Q1 U& h1 a4 S4 u1 }
    純 PHP 的優點:$ K8 Z3 U7 r( B, d" Z# l
    1.        性能較好 - 沒有框架的額外開銷( M9 v2 w' e: q4 B9 l5 k; g2 p
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識1 R: F- T0 f1 C: _
    3.        更靈活 - 可以完全按照自己的需求來設計架構( Q9 Q2 S4 n* `# }9 k- H
    4.        代碼量小 - 不包含不需要的功能模組8 B+ y/ a/ ^6 j7 D! }. K' v3 g4 ?
    5.        適合小型項目
    ) X+ U9 w6 Y4 ^* |/ n# _純 PHP 的缺點:
    ) U% h2 t8 f- g; {1.        需要自己處理很多底層細節) P/ v% |* J6 H, y; j
    2.        代碼複用性差
    - F+ U$ G1 d" R" ^, m, G  W3.        缺乏統一的開發規範9 H4 v; W; M7 [% G5 N8 X: `
    4.        安全性需要自行考慮和實現
    " G1 w# r4 W) N; O5.        開發效率相對較低  ?6 E! C  b- n5 H+ F
    6.        維護成本高/ l$ k7 O3 S! U4 }
    使用框架的優點:
    ( e0 e9 N3 D+ |- c1.        開發效率高 - 有現成的元件和工具
    9 I7 w! x2 n; L, B2.        有完善的安全機制
    ) C5 q$ \' E; ~7 i; n% s3.        統一的編碼規範
    # g" n& e4 l) D9 T; e6 [4.        易於維護5 a: T; Y/ j1 D* o& g: K
    5.        有活躍的社區支持8 k7 s# k7 Z( V* S
    6.        適合團隊協作! U6 D7 K; r, J2 U7 N
    7.        自帶很多常用功能(ORM、緩存等)
    8 P: x& e  u- E" ]+ [; h使用框架的缺點:5 P" ^. ]3 c& \% S0 z$ V
    1.        性能有一定損耗
    4 X9 R* `% Z$ ~  Y; w( \2.        學習成本較高
    5 N9 e; y# r' X' c  t3.        可能包含很多用不到的功能
    & d5 b9 y) `& w1 K7 C2 k4.        不夠靈活,需要遵循框架的規範
    + a# f8 B! ], E5.        對小項目可能顯得過重& `5 N' E5 w5 O3 o' m3 O7 m
    建議:7 O' L0 @: N) J: q( ?
    1.        小型項目或學習階段可以使用純 PHP( H: D( f; `! {6 m; Q- D0 h! J$ p
    2.        中大型專案建議使用框架* _% I" j" V7 h0 q
    3.        選擇框架要根據專案需求和團隊情況
    ( [$ [- [9 t% k% O2 O4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    - K* F! G1 _$ N1 |, y3 M& Y+ d: W您打算開發什麼類型的專案?這樣我可以給出更具體的建議。4 k0 Z8 e- o9 W# C# U2 Y  ~+ T4 n
    % S- k/ }/ {, ^( @- J* i
    7 n' B# N* C9 A
    ! _6 P& H4 Q. M& _& q
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    ' a$ E% X5 t$ S  a0 S
    % o: b; U9 y; Z# k: n6 K' E7 c# S這個轉換主要做了以下改動:( w! C) u! Y( K

    ) o/ m7 E2 U. \6 `: d) s路由結構:
    2 F) B0 m' M, g9 A* E4 @3 w& S8 }2 W6 X! \  X/ J6 D  I  H
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下0 L: r& _" i8 c' ^2 g" @" V
    支援原有的 page/mode 參數結構+ V: d% _; O- X
    通過路由規則自動匹配到對應的控制器方法4 F  z! B. I# {" F: O1 Q

    3 W, |. y: f( M" R* c# K0 a. K( D0 z- `! ~
    控制器結構:9 ]3 D7 ^4 `- o. [  e3 T% [

    9 h3 n8 a- W8 r創建了主要的 LoginController 處理所有請求( c' ~0 a; p$ s" h
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範( v0 A: S' {, z0 H# O# G( f
    錯誤處理改用CI4的視圖系統
    : L' Q3 h: p4 `0 A) ~
    * [+ d- _' B% U4 ~7 q! V
    * t: X2 w0 G3 m  t類的組織:) v6 @! l- }* C3 G

    ; e% a  }# l( r; u* P! R所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    0 v. R1 v* o; X3 S1 k保持了原有的類繼承結構
    ; w( L5 }- p( s! X- }改用CI4的控制器基類和特性3 b- c+ A: o! q" E9 X( e
    ! d' V; A# F6 F: J
    - N  \9 R* p6 \2 [% `6 a
    改進的安全性:
    & @- K' z) y% J! ]- a" w' R5 a' _- k; C8 y1 T+ m& E
    使用CI4內置的安全特性4 _+ H- }' i* x- y
    更嚴格的輸入過濾! \; }& m; ?9 u8 T$ S3 Q" Z: s
    更好的錯誤處理機制& n; ~9 H# e3 \. L1 Q4 E+ V# O: g
    ! {3 t! }9 }$ I

    / U- c3 I4 z$ Y9 J. u
    1 q/ O" Q9 F% ~* g# J1 C要使用這個新結構,你需要:
    9 p; T4 F3 O4 h3 L5 m1 O9 x  s7 [6 E  X) i1 }( R# z( d
    將這些檔放在對應的CI4目錄結構中
    * E. n) k4 i) z; y# Q2 u! ~確保創建相應的視圖文件7 D8 t& C8 `/ a0 I+ }
    配置語言服務6 ?$ [. Q. x5 f& d% K% D5 r* z
    根據需要調整模組檢查邏輯
    2 b: n# j' n) r) {" m" ^+ D, p- }  J  Y: X- T
    需要注意的是,你可能還需要:
    : y, L: `. l( G$ L$ e; u; U6 P% H9 m9 i/ W
    創建相應的視圖檔(在 app/Views/ 目錄下)
    # s; g- ]9 W4 V5 H4 _" q配置適當的中介軟體來處理會話9 C% A- W3 U/ ?: q: W$ l3 b3 M
    實現具體的登錄邏輯5 n+ L7 c7 G, v9 h$ U

    / |5 H7 q; H, ~9 C$ I& u! o需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?# K& ^7 p8 l4 R. f3 _0 u
    5 h! q) T, D: J, R- x  _+ a& y0 Z# l! @
    1. <?php% B0 g. F) k# e* r, ~/ N
    2. // app/Config/Routes.php( f' ?9 }- F( i2 N, a: ~
    3. namespace Config;
      0 z8 J- h: J5 |: m3 K" d1 c' x

    4. : [; N5 N$ j3 f- a9 v
    5. $routes = Services::routes();
      ; {9 Y2 J) ~5 {6 O& g

    6. % b# E% a( A" q9 D: H# Y) ?- }/ J7 F
    7. // 添加自訂路由規則9 M: m/ S4 z6 Q; t1 q' v
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      9 H0 i; a4 q8 L) M% ?1 o0 N  Q
    9.     $routes->get('/', 'LoginController::index');/ x+ O3 t, C2 q. O* @3 V# N' W5 t7 n
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      2 t2 R" l+ ]1 ~% l: q# N1 \- t
    11.     // 默認路由處理3 |1 G3 p3 i! I7 u! U* Y5 y
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');0 ~1 M" z0 q# Z/ O
    13. });
      / y% T7 O* r, g$ E: b

    14. . I) f/ U9 b: H" S) L' K
    15. // app/Controllers/Login/LoginController.php
      , n5 C; X9 ]; I, m$ |
    16. namespace App\Controllers\Login;
      + g/ }" s) L1 Z. G6 X6 n
    17. 0 a2 ]$ m9 t- J6 p2 P% T
    18. use CodeIgniter\Controller;
      0 v* i, O6 d3 ]; N
    19. use App\Controllers\Login\AbstractLoginPage;7 [8 @  Z# y$ S6 w8 I0 q7 }: r

    20.   W* [; [5 @% i8 W+ A5 F+ r
    21. class LoginController extends Controller# a- u, N# v/ L4 F' `
    22. {
      : ~# x$ F6 V" a0 x2 E
    23.     protected $pageObj;
      - q" I4 |7 y' _8 k) _4 w
    24.     protected $LNG; // 語言物件7 x1 {/ k0 d1 Z; j( C4 `

    25. % \7 Q. Q% }6 N2 w# N  A8 \
    26.     public function __construct() ! v5 y9 b& b9 `7 }% p
    27.     {
      + x- `. g5 t- m6 _9 L8 [
    28.         // 載入語言檔和其他必要的依賴
      : i+ g  W9 W2 A; V1 Q
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務+ y5 D6 E# f) A
    30.     }
      . X. R. \2 Q! `! o9 \

    31. # b( d: G3 S5 X7 {+ |
    32.     public function index()
      " ]8 f; P' R. I
    33.     {
      9 N8 |' r- u+ G( m$ a$ m8 H
    34.         return $this->handle('index', 'show');
      2 H  v# Z7 B# M; R& q: D* _& `
    35.     }1 y2 f" N3 s7 g

    36. ; s7 D& K6 m' E% f6 m0 ?5 l2 U- m$ a
    37.     public function handle($page = 'index', $mode = 'show')! P2 ~; o" G2 O9 t3 }8 b  D
    38.     {
      - V. n5 G+ c  `6 y
    39.         // 安全過濾頁面名稱
      , V' L4 g/ y; `* }# f
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);5 X% ^( F# w- B" N- H' b: \/ S& b) H3 f
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';+ a/ k) ~# X1 h0 M! y; a% }' L
    42.         6 q# i9 o( P4 W5 R4 L
    43.         // 檢查類檔是否存在
      0 d0 w. {6 Y+ c" `8 f* V5 s2 q
    44.         if (!class_exists($pageClass)) {
      & F. g$ I- I, l4 k+ K
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      8 H4 ?' s" U$ \  Q
    46.         }
      ) U# P6 C, W) h+ g5 ^' n
    47.   l6 u4 G4 i: y
    48.         // 產生實體頁面類
      ! H  F0 l% A% C$ \( C- L6 W6 x- s
    49.         $this->pageObj = new $pageClass();
      ) b1 Y) `3 _: u7 H
    50.         
      4 p! L% z2 Y* [. L
    51.         // 檢查模組要求, i# C8 e# u+ [1 G
    52.         $pageProps = get_class_vars($pageClass);2 m5 ~( w! n+ R; G9 L
    53.         if (isset($pageProps['requireModule']) && + T1 e/ O- u- c# S* _
    54.             $pageProps['requireModule'] !== 0 && + `+ |, A+ F+ W2 _6 U
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {) Q1 Q  [; _& M& g$ G* F' @2 G
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      # n! m6 j& q0 g/ _' v! u: W! J! Y) i
    57.         }
      2 T2 R& T; `7 {8 l, P6 U; C% b8 `

    58. ! g% w# ^/ S6 m. [
    59.         // 檢查方法是否可調用
      % m# L7 C; ~2 A) a5 q
    60.         if (!is_callable([$this->pageObj, $mode])) {
      2 d. d  {- k2 g# w% ]( V- O, `# d
    61.             if (!isset($pageProps['defaultController']) ||
      $ N% e) W* _+ W- h& ^4 O
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 m: w/ p4 z+ O6 ^2 Y! a' M
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      $ \; {1 l4 _* m7 e/ Y1 ~, n4 X
    64.             }1 n8 U3 Y. W+ x* M  P
    65.             $mode = $pageProps['defaultController'];7 x& q5 L) i0 U  G" w* t, M
    66.         }  F- P  o) |/ d' Y8 |# J6 S. E/ y
    67. ' U- Q% V* U6 V; J* @
    68.         // 調用相應的方法6 D' D0 O7 |9 h0 h- `& \1 \( W- b/ u
    69.         return $this->pageObj->$mode();0 A' R1 ]6 y4 n1 B& S
    70.     }
      / P6 \) p: y" J: ^" {
    71. 3 u! @- e" M; G
    72.     protected function showError($message)
      * x" X! ?  h! J! A! @% o
    73.     {: ?1 [/ S8 {: A9 d9 S9 b& s/ {5 P
    74.         return view('errors/custom_error', ['message' => $message]);. w# }+ k; o* v( k+ \
    75.     }. R% v* H5 N' M4 f' {7 I
    76. . Q3 ]' Z# a1 M# t6 v4 O& G
    77.     protected function isModuleAvailable($moduleId); _  k" o, t4 u7 v' C9 O
    78.     {
      & @/ e) R! k2 l3 B/ a% M/ l$ N
    79.         // 實現模組可用性檢查邏輯, E  j0 h! T( @( A" @( `: K
    80.         return true; // 根據實際需求修改
      & X% N& M+ H) D- u% I; j/ j+ V
    81.     }. z- _, `9 d/ G: l
    82. }
      ' M- U9 T3 |' u2 {! H0 h
    83. : x7 k. X1 ]2 ?! w
    84. // app/Controllers/Login/AbstractLoginPage.php: N' P" f( ?. b0 j- n- Y
    85. namespace App\Controllers\Login;* V  N4 }: E( o. ~' v
    86. 4 S( d3 z& o+ e$ j) ^
    87. use CodeIgniter\Controller;! K9 O2 ?2 O% v: ]  B- m9 b# F- t6 M

    88. + c2 X8 ^7 |, a" J$ u, _
    89. abstract class AbstractLoginPage extends Controller
      4 y5 }% [9 w% F" @/ e! K
    90. {
      9 V$ n* C% C0 w
    91.     // 實現基礎登錄頁面功能$ r( ?4 x6 \3 q- k$ G
    92. }
      . b3 e  d/ V. r7 G/ G
    93. & \7 z/ Y4 h/ j4 P: d1 k1 M
    94. // app/Controllers/Login/ShowErrorPage.php
      9 k( a& |& K7 u$ `+ D, @% {
    95. namespace App\Controllers\Login;: U) ^2 ?/ ]6 p+ m

    96. : J  S2 K9 D- A/ O$ c
    97. class ShowErrorPage extends AbstractLoginPage7 u, Y4 u6 M8 N: u
    98. {  H8 }% F/ _% m4 T* x. |1 D
    99.     public static function printError($message)8 S7 w# M& W( V" H; ]* E& K4 f
    100.     {
      5 J+ X0 X& u2 f2 x5 z' n
    101.         $controller = new LoginController();8 |. O( U% A+ V/ t* m$ D. j1 o
    102.         return $controller->showError($message);
      * F. _1 }$ f4 N
    103.     }. Z( ~, A& u* i1 j
    104. }, H0 Z! D% e% {: ^: ]9 n6 B

    105. ( s. p$ O' a# c7 x
    106. // app/Controllers/Login/ShowIndexPage.php
      ! ^! {9 c. A/ C* p3 F: {" O4 I
    107. namespace App\Controllers\Login;
      1 N2 z2 p8 e2 f" W8 y( W- C

    108. / k' V. |0 ?$ t
    109. class ShowIndexPage extends AbstractLoginPage
      9 L  ]+ I0 S2 v* y
    110. {
      , s& ]/ Z# v5 T) w. d; b
    111.     public function show()/ z) S; Q$ b/ u
    112.     {
      ) i; ]- S0 |8 E* x- `3 F) r' L
    113.         // 實現登錄頁面顯示邏輯
      ( n2 g! Y( a  a, p# N' Q
    114.         return view('login/index');6 S- j- z: k: n4 \0 t$ q
    115.     }) d$ o1 N) `" q  E% c) x
    116. }, x6 J7 X) J1 f
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-6-15 21:43 , Processed in 0.015716 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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