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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14152 / 14152

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    ' M& Z7 T- _& B- `5 r3 JAI 就是站長的最佳幫手。3 I1 I7 O$ w2 a5 Y, ~$ y

    + x; |4 u1 J2 Y0 s8 D1 ]) s) {4 N8 Y' K9 A: p1 T7 v
    這裡的「新架構」是指後端的架構會有大變化
    4 B4 J7 }  n" w3 G& I6 T8 |" L& D但前端的 UI 介面玩家不會感受出來有何不同" f( _* Y3 B1 ^" {4 b* e* ~2 T% C

      `- ?+ ^/ ~) q. N4 l# T6 U0 g+ z) t# h' M/ F& v
    為什麼站長要改成新的獨家架構?: H/ ]' H9 z0 I, {* G
    就一樣由AI模型來解釋清楚吧。
    7 {6 H/ O2 {  t$ X# G5 n
    ) r7 {2 \4 W, R, _" K1 ], |* k3 X
    ) l2 g# v8 d. k/ h讓我分析一下使用純 PHP 和使用框架的優缺點:( c" R! S. T; i) i1 G
    純 PHP 的優點:
    , R# J- h7 j7 A0 K% D1.        性能較好 - 沒有框架的額外開銷" {) I. K2 w  |8 ~5 ?9 k$ ?
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識8 Y4 J( M- X& f) A" q1 r, K
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    , L# x- Q! G) n& J# W, N; a0 e4.        代碼量小 - 不包含不需要的功能模組
    . q5 O; V- n- F5.        適合小型項目* Q$ ]# P! b/ o8 _. \4 T: b
    純 PHP 的缺點:7 L' y0 e6 |3 ]: ?& u& e2 G
    1.        需要自己處理很多底層細節2 r) `& |' H+ t$ }7 V6 o4 C
    2.        代碼複用性差, [4 |3 ^5 i8 D' z" j% u6 m' b
    3.        缺乏統一的開發規範
    ( W: V/ d$ p6 Q* D4.        安全性需要自行考慮和實現! H; f1 ?3 [6 i4 @9 P, |
    5.        開發效率相對較低
    7 m( G% H7 n! Y, o6.        維護成本高
    : H; E0 M* A: Y3 `5 R使用框架的優點:
    7 b0 m5 q: P  {* u' W- ^* E$ I1.        開發效率高 - 有現成的元件和工具9 c- k& x7 y6 ]/ J$ x  i1 {
    2.        有完善的安全機制
    / B( r; h1 Z" b( s3.        統一的編碼規範/ q. j5 H4 m# |* \2 d
    4.        易於維護& |4 W8 d, s% B/ O+ C1 o0 P7 o
    5.        有活躍的社區支持
    & t$ K8 `0 A2 v' v3 t* a6.        適合團隊協作
    . F; r+ f2 G6 ^7.        自帶很多常用功能(ORM、緩存等)" G, L+ ]9 w, Z2 ~+ q  f7 c5 g1 ]
    使用框架的缺點:% _( @9 F8 L# l# G
    1.        性能有一定損耗
    - a! U- L; v* `2 w/ r, \6 g. Q2.        學習成本較高
    , ?5 N3 }3 X7 u" [2 C3.        可能包含很多用不到的功能, @, x- p+ F( @! l. U
    4.        不夠靈活,需要遵循框架的規範
    6 L% A! W% Q/ d5.        對小項目可能顯得過重: }7 {7 V# B! B6 @
    建議:/ {! k2 T8 u: s9 r- f" M) L& m
    1.        小型項目或學習階段可以使用純 PHP
    # ?+ O3 Y! M2 _! o3 y* j2.        中大型專案建議使用框架
    $ x6 k# k/ ?; d3.        選擇框架要根據專案需求和團隊情況
    4 B& N- D, c+ ?/ L4 O4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇' n( X5 i# U2 f  A
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。( a- Y  K6 @- d, B( c; {
    9 c. K4 J9 w# q9 o" s+ k$ D+ K
    / w1 X* L3 G& B' y2 D

    8 e* p6 P& a8 n% q+ T我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。* A1 C7 R" Y$ M$ ?" [0 y" b/ x! Q1 }
      X% ~% G# ^0 K2 X1 ~$ Q
    這個轉換主要做了以下改動:
    5 |! o% B3 ~& _0 H- P( S
    1 _3 N: p7 P6 C; E5 t3 e  ~9 T6 J" e路由結構:: k% F2 @% \3 G5 ^/ s  v9 r

    0 C( E0 [3 ]  T0 \4 w3 w5 b+ Y# \使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ) w. S4 y0 ?) z4 _+ e6 B支援原有的 page/mode 參數結構- W6 }  j( A. H7 Y7 n& h
    通過路由規則自動匹配到對應的控制器方法, }8 f, P: y- f7 u
    4 N( G7 ^: j) E8 ]! ~

    / T) s7 t6 V% p: J1 G  e( S7 a控制器結構:4 C& C  y3 B  P% _0 H
    2 s  _  W  |2 D
    創建了主要的 LoginController 處理所有請求
    ' @: t- M& K  I# |5 p) L, c保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    ; C( m! T6 |# R# m7 u錯誤處理改用CI4的視圖系統7 K" F9 H! }- `: u3 Q' {$ c5 W
    4 H4 p! s2 Q/ `" {# g3 g
      S6 F: L: h& D. ~  [1 g8 C
    類的組織:
    9 b/ q( r# r7 H( m- {3 \1 I* |4 A
    # r2 a# L2 W9 Y- ]0 `% m2 K: U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    ' P, w" P5 A" H4 o5 T保持了原有的類繼承結構
    ! G' t9 H- D5 @; o: K( S8 [改用CI4的控制器基類和特性9 l+ a6 B' r5 r8 k2 b

    : m) x( ]/ E. _' G) ~
    " u% f8 J0 `* I& q; M改進的安全性:
    6 C2 [8 a6 @! W$ C9 l# y! A" u7 K/ C3 O
    使用CI4內置的安全特性
    0 i% ~9 U5 b+ W% X更嚴格的輸入過濾/ f  K! {' x# {
    更好的錯誤處理機制6 s2 m; F  X2 k
    8 P/ O% c+ v! S9 Z; [

    $ Y  u5 a* W; N
    & L2 q2 t. j3 n# i; W* J3 s5 ?要使用這個新結構,你需要:
    4 M$ x0 Q! ]6 C  A- s* ?5 k7 n
    6 `: z  `% X# R& `& R# y將這些檔放在對應的CI4目錄結構中0 i' }9 Z) U' d' ]
    確保創建相應的視圖文件8 @/ ?; o6 G- q
    配置語言服務
    5 [6 \4 R$ l  v: H- d根據需要調整模組檢查邏輯. Z6 ]0 {$ F4 K# |
    / W0 `) o7 X* ]# h- j" ~5 O# \5 X4 e
    需要注意的是,你可能還需要:
    0 U* w$ b2 f+ C; w- w$ z0 }" b
    * o: G( g9 H7 D& V0 g$ L' [2 _7 I3 N+ c創建相應的視圖檔(在 app/Views/ 目錄下)
    & l2 g+ N8 ?7 m$ v, Q- ]' e配置適當的中介軟體來處理會話+ S; Q+ u- X+ H5 P
    實現具體的登錄邏輯% p2 c2 c. O+ g8 Z, W1 ?& o! Y
    9 H+ ~  U- ?; s' \1 [. O6 z
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?- y1 F4 d; d; h  j- \8 X6 _7 a1 c
    + b2 x* B& k. t& Q% L$ E/ W+ k
    1. <?php
      9 K( B- J3 e( U4 _# U4 n- N
    2. // app/Config/Routes.php6 e7 q' Z6 `' G
    3. namespace Config;3 Y9 ^8 I$ \) d, ~% ?. K; g+ p7 x8 L
    4. 6 i" N" y2 T* h! a1 o5 L1 k
    5. $routes = Services::routes();
      6 {/ R7 s5 N6 R8 d; Z. I% J

    6. 4 I4 m9 I7 B6 }2 J3 J  I5 M5 M. O% ?+ [
    7. // 添加自訂路由規則( T8 F* Q6 J8 Q- \
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {# f% M5 o9 Y: {& G5 q4 _% f/ H8 Z
    9.     $routes->get('/', 'LoginController::index');7 I0 l5 _- ^* Y4 `8 e% t# j+ h
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');4 p: L, z0 L; q0 V% l* `! n9 ?
    11.     // 默認路由處理( G5 c3 ~8 c0 q
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');  ~! V6 N" K2 S. S( D: f+ ^
    13. });
      4 V- h- ]2 z$ o* M
    14. 0 E$ I9 ]& G+ {3 ^' f( o
    15. // app/Controllers/Login/LoginController.php
      ( l2 P" F7 c9 v; @: I
    16. namespace App\Controllers\Login;( b" q: x) |0 s$ T4 M& h

    17. : e) a/ J9 s. @
    18. use CodeIgniter\Controller;
      5 Q/ H: O6 R2 f" S1 z
    19. use App\Controllers\Login\AbstractLoginPage;/ {7 x" C$ ]% R7 H
    20. : |! t) |1 R. B  [" F, ~6 F' Y
    21. class LoginController extends Controller$ n$ h6 h8 q* m, K! R% P3 c
    22. {
      ! K# Y8 H( ^. v  a5 s
    23.     protected $pageObj;8 Y$ a  ?4 r! O5 S$ \, E
    24.     protected $LNG; // 語言物件
      " a3 a* o% O0 @2 L- e( T

    25. ' H! k7 _" D# f6 U
    26.     public function __construct() . k2 I9 Q* n% v, q, G, b: H
    27.     {2 [' z- C3 V3 X8 Q( h) N9 s- a
    28.         // 載入語言檔和其他必要的依賴) S& I8 V1 Y3 J
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務! H& M. w3 i6 O8 z' p# v" Q
    30.     }
      1 n) T# I6 x( _. x/ j- w% D
    31. ' O8 ~7 `  _# L- ^/ o
    32.     public function index()
        T3 @) Q2 c1 A
    33.     {
      5 Q# v- Q6 T- ]- \' G1 A5 `
    34.         return $this->handle('index', 'show');
      2 n# t% S! y: Q
    35.     }
      - }6 F0 X. M( [) ]
    36. 5 c) p+ o- ?0 q1 R( d& M
    37.     public function handle($page = 'index', $mode = 'show')7 f8 n! Z9 r7 I# g- I6 x5 V
    38.     {6 E; f  p+ J6 S& }* [7 k% `
    39.         // 安全過濾頁面名稱+ f) B, ^  Z( i5 o4 C4 F' O
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      6 `. J0 @8 X# }% D2 V$ o
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      1 `$ B; z& A* D: S- H% I
    42.         % s: {) L+ t+ Q/ j
    43.         // 檢查類檔是否存在
      6 Z  h5 R( i, _- b0 ~3 m3 j3 B
    44.         if (!class_exists($pageClass)) {
      5 u7 c3 k! A0 J" Y8 o3 H. G" A
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      : ]2 M& v* \2 N. q, L5 P: O
    46.         }& `9 `5 w" ]* I- D0 w8 E! V
    47. " Y: R" s$ v: h7 h! @( u
    48.         // 產生實體頁面類( I, p  E; r* |' F# m  _6 n7 Q, n
    49.         $this->pageObj = new $pageClass();
      9 U% p2 z" r( j, ?1 S! C% P- u
    50.         
      ( G( u- Q) _- ]: J: A2 E6 j* W
    51.         // 檢查模組要求
      2 @% T$ D8 o6 |2 Z* @
    52.         $pageProps = get_class_vars($pageClass);" \; Z4 n* q6 o# f2 M7 z/ {
    53.         if (isset($pageProps['requireModule']) &&
      1 m! I8 V9 ^. n
    54.             $pageProps['requireModule'] !== 0 && 5 {% F- s$ N: k" ?
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {  X2 G0 {$ G# n' e8 }. G$ O/ ?* Q
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      : ^, A! m/ W; A, L
    57.         }
      - s$ l6 E5 j- ?" Z4 c
    58. . K0 n- D  `( _4 f; M
    59.         // 檢查方法是否可調用
      + O) C- L% I, y: T% I7 e
    60.         if (!is_callable([$this->pageObj, $mode])) {) W/ q1 O9 H- d7 `
    61.             if (!isset($pageProps['defaultController']) ||
        d7 b6 N) D. V- v: ^; E+ E
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      9 s+ W, s# x% D( J; G5 _
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);0 @% Q/ i, _% z3 j# K
    64.             }
      ; [8 x. J8 o& }. f7 \9 ^
    65.             $mode = $pageProps['defaultController'];- H7 b) u/ X8 K* U  P) n7 a+ A2 I
    66.         }0 j& x( T) {1 v
    67. ! Y- W2 _3 L3 l* R7 ~
    68.         // 調用相應的方法
      3 z9 w$ F( M) e5 J( S# [
    69.         return $this->pageObj->$mode();
        A* @3 D! H4 I% @7 T
    70.     }
      & M: K: U2 a9 |. s6 _  q  ]
    71. + H' q* O) t8 o+ K$ F" D9 i
    72.     protected function showError($message)
      8 q6 f& T5 o: v, r/ T. N" l1 ?
    73.     {9 O& l  m. `( e- T+ f* ^+ L
    74.         return view('errors/custom_error', ['message' => $message]);
      1 V  K7 W7 R5 n) _
    75.     }
      2 g# B* D: o! e( q, Z9 @" D
    76. 9 p( O# Z2 {7 g% k% I& `
    77.     protected function isModuleAvailable($moduleId)
      3 r9 G8 D- ], f# Y$ s9 {
    78.     {
      0 i" [6 L  U' Z3 z3 s* d7 e6 I! M
    79.         // 實現模組可用性檢查邏輯
      5 ^! P4 h, @) F* P& f7 C- d4 m
    80.         return true; // 根據實際需求修改
      * q/ v5 a" s" t3 T: ^) @. J
    81.     }
      1 k$ D: b0 D2 ^, s, a# Y' Y. _
    82. }5 _3 I5 A5 n. I8 g5 h

    83. ( K; ^3 d6 }+ w% p" U5 `. l
    84. // app/Controllers/Login/AbstractLoginPage.php2 |) |1 S) h" M7 w. ~
    85. namespace App\Controllers\Login;7 v8 T" |1 r  |8 c! D5 ]" _
    86. / A8 T# J  o- y6 d7 P
    87. use CodeIgniter\Controller;
      ( F( h0 l" v+ y  h
    88. , ?+ T4 m/ p2 s0 A9 g2 ^) g
    89. abstract class AbstractLoginPage extends Controller' K8 q/ q8 H7 w" B$ K5 J1 p
    90. {
        m! e7 x+ ]7 p1 R# \" s. {
    91.     // 實現基礎登錄頁面功能
      6 M' O# s8 {* X: @3 l
    92. }( U1 _* e/ u6 [4 ?  _
    93. 9 @8 B$ x" v3 ^1 t: K; I  s
    94. // app/Controllers/Login/ShowErrorPage.php
      5 C+ \; l# b' ~% [5 T3 r2 d( |$ m
    95. namespace App\Controllers\Login;+ K/ Z4 c) g, P* O8 n6 u' n" g

    96. ' l, Q* N: L& _! p  n" C) I
    97. class ShowErrorPage extends AbstractLoginPage
      1 F: Z* R3 O0 K- o( L
    98. {1 E& {2 ^1 V- A" ?% y9 g. ^
    99.     public static function printError($message)
      ; d! P) Q7 s6 l+ E0 W" R
    100.     {
      + I# a8 t: \; s; c( ^& H" }% w$ N& B
    101.         $controller = new LoginController();, u3 a3 Z; s: e. c( L1 L
    102.         return $controller->showError($message);3 P2 q* B# H: |. I9 u$ p8 R
    103.     }! ?* P, @9 q. e4 T) E4 ~" S4 y9 ^
    104. }# ^" u$ e7 l. E0 r& K

    105. ; `3 M. M" A6 |0 |% X
    106. // app/Controllers/Login/ShowIndexPage.php
      0 O: G: ?2 H" |/ n' Z  ~
    107. namespace App\Controllers\Login;
      # }' ]" K0 t; b& `! Z
    108. & X. [5 ]5 L6 t9 h7 N9 w- ?' `' |
    109. class ShowIndexPage extends AbstractLoginPage7 f: ~6 f( z9 }% B: [; j3 }0 q
    110. {
        w$ ~4 K% y4 y* ?! C  }4 ~, F
    111.     public function show()
      . M% i  }1 P- C9 g( o. Y
    112.     {/ M9 P' G: {! l) m. r
    113.         // 實現登錄頁面顯示邏輯& B' J. O% N  y2 x
    114.         return view('login/index');
      4 o/ Q6 t6 L9 b( L4 r
    115.     }4 E" m* T* Q  k) f
    116. }
      0 X% M, D' j4 T6 H2 ]  B0 y* }4 k
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-9-5 10:16 , Processed in 0.016546 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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