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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15163 / 15163

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    4 X! ^" R$ p& N$ s9 j  G% N. X8 B9 hAI 就是站長的最佳幫手。
    ! v# R1 s8 v& o/ B8 ]" v' y- ~2 F. g- W$ g+ D5 R" b+ _

    6 b; _" D) [* `6 V這裡的「新架構」是指後端的架構會有大變化
    / d( J8 K3 Q9 M6 T但前端的 UI 介面玩家不會感受出來有何不同$ d6 Z0 H/ q' o. z3 ^7 {8 Q; \4 i$ i
    " Y1 ~: z- v1 ?% `3 v, p+ r' A

    3 G' F2 F% z4 `& d7 I為什麼站長要改成新的獨家架構?) Z# o+ L( L8 u6 F1 q3 ?" m, q8 N
    就一樣由AI模型來解釋清楚吧。" A) M. s9 i" F9 Q: M; q
    + d9 }9 I. P4 F4 R3 ]
    1 j- J; A! k* d2 ]( _
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    7 o) r9 [/ A* C$ T  ~純 PHP 的優點:
    . H0 h( H6 s2 e/ {6 j, k5 D. J1.        性能較好 - 沒有框架的額外開銷6 X; ]: j1 X; K$ p
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    $ X2 x3 w* X3 ^7 f. G- D. `3.        更靈活 - 可以完全按照自己的需求來設計架構
    / [, B* B6 @# o% q4.        代碼量小 - 不包含不需要的功能模組. O5 r6 b: l$ z1 t- A
    5.        適合小型項目
    6 y+ S! t( y% v  b$ ]6 R純 PHP 的缺點:
    ; O/ i7 I. t. P! l* e% B1.        需要自己處理很多底層細節( L' n, \8 `1 Y7 m
    2.        代碼複用性差, }8 n. c- Z4 P: n
    3.        缺乏統一的開發規範
    6 _- |: [0 l2 c1 z4.        安全性需要自行考慮和實現
    + ~8 w6 N  ?2 i0 H) |: I5 q5.        開發效率相對較低
    6 D2 d1 t/ r8 s" n1 P4 L8 f6.        維護成本高: {) V# O# B/ k3 U7 U6 _! s
    使用框架的優點:
    5 C6 V' G1 }( c$ m# P1.        開發效率高 - 有現成的元件和工具5 c7 @) s% U( b; Y0 p
    2.        有完善的安全機制. t* b% f+ R* K% i7 a5 e( D1 r
    3.        統一的編碼規範
    ) q6 N  @, l( C- X4.        易於維護
    ' o( r! a" G, r* a; a5.        有活躍的社區支持: n1 \% N9 Q3 l' h5 f4 O6 F
    6.        適合團隊協作
    ; I* H! S1 H5 k& F, P7.        自帶很多常用功能(ORM、緩存等)* D6 b; p1 O5 ]$ O6 b  h
    使用框架的缺點:
    2 h" B* P. y, Y, o1.        性能有一定損耗
    5 Y7 l; d6 E2 P: l% a2.        學習成本較高  U% r& u, J7 I* O8 u
    3.        可能包含很多用不到的功能
    , @% f+ S4 |0 H# s0 u4.        不夠靈活,需要遵循框架的規範0 ~% J. Y2 u9 U% W
    5.        對小項目可能顯得過重; g2 d; \/ b; t( v6 Z
    建議:5 i0 D, r% L& j2 x
    1.        小型項目或學習階段可以使用純 PHP
    8 I- P: y3 I- s4 j, w, Z" E+ O2.        中大型專案建議使用框架
    7 l8 r, V) k. j& C3.        選擇框架要根據專案需求和團隊情況) I3 o3 }9 f3 K* Q7 @3 t+ N+ K
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇' ~( [9 t. P+ ~" ~; G
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。; z. w) d' l" N
    2 E0 Z1 ^7 P- ]. F* d5 x
    8 A7 o, y( s; ~& I

    5 i# t0 Z3 u8 S# ]# L) _我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。" @+ b& l# ^( M: Y
    5 m; z" x6 w* D  b& Y$ L
    這個轉換主要做了以下改動:2 n3 m& g. g5 O1 D
    " `: O5 n( U1 @5 s$ v+ T/ D
    路由結構:
    / i6 E4 o3 Q- r7 [# |* y) Q$ F  W6 F$ ?/ C7 I
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    : p) y- S+ r7 A' P+ y" Q" J9 b支援原有的 page/mode 參數結構2 g* {8 A; }6 ]5 p% Y
    通過路由規則自動匹配到對應的控制器方法3 n! K( x, }+ j, D
    ; U- a( F* [& k* y
    7 ^3 ?5 G2 j. _8 c; u  \
    控制器結構:* e/ A9 B: \0 g/ ]

    ( ^1 z- A- y# Y/ A# h1 D/ u創建了主要的 LoginController 處理所有請求1 n; |! T- s, \' H1 j# C5 k# ^
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範! ^9 f' H6 x( j9 x5 f
    錯誤處理改用CI4的視圖系統2 ]( Y  y) D: T( c5 L

    ) S; ~+ d$ p& Y
    ; p6 V( f' ]7 C& k類的組織:
    / A$ G: O2 u0 f7 g. n+ j' b% S: n: f$ f9 |, r- K' b: m& S
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    & L/ j2 i: x; `5 u; B' c. z: k保持了原有的類繼承結構
    / Y# ?5 J' h9 `/ f$ Z8 j9 U改用CI4的控制器基類和特性
    , E/ |7 i. E( A+ U6 l2 V7 S
    ! m! e1 ]" t3 C
    8 Y% r; e+ j( f# {; y改進的安全性:
    - g0 Y" Y9 R4 ^+ X
    $ |5 Q7 m* q% w  [- U使用CI4內置的安全特性
    5 I+ m" q% n# m0 E更嚴格的輸入過濾1 B& _1 S; h& g
    更好的錯誤處理機制
    5 Z3 f  I3 e! w; \
    $ ~0 Q. P- _# H. h8 A/ M
    $ R2 _9 O2 D9 v
    ( b, g0 n7 I; b5 w$ T4 ^  _  o要使用這個新結構,你需要:' z! s/ ^6 q0 [0 S

    $ T7 ~( V/ o& i8 N4 a將這些檔放在對應的CI4目錄結構中# |6 a  k( ]4 V# R% M
    確保創建相應的視圖文件
    8 A* ~# c3 b+ E* P配置語言服務9 x& e  \1 Y- k+ q
    根據需要調整模組檢查邏輯
    " Y# c- P. u) w" ]1 Z3 B; N7 z
    ! P, y" g) _4 j" l/ m' O需要注意的是,你可能還需要:: Y6 I  H& o: i5 R4 |3 a
    . P( b: a; @9 ]2 ^; t
    創建相應的視圖檔(在 app/Views/ 目錄下)
    + _' K/ h5 u# P( d配置適當的中介軟體來處理會話0 x6 Q' y5 _6 q
    實現具體的登錄邏輯* r1 ^* J& f0 C* Q

    8 l9 X7 a  ~3 Z( `8 g) N1 r需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?1 U4 o; l1 b8 Y% u
    # ]6 p5 C  x/ @; l' j0 F% R7 r
    1. <?php  B; V+ S* ]4 v2 ?/ O& i
    2. // app/Config/Routes.php3 s; f3 g9 B* `
    3. namespace Config;
      : p8 V1 l* j2 s$ v

    4. ( ?# w/ y. u" S3 w
    5. $routes = Services::routes();
      - x* Z7 ?. ]4 ~* y6 M

    6. 9 |* V+ Z6 k) B" l2 f- Y7 D
    7. // 添加自訂路由規則
      1 u; r6 L7 Y0 a  B- o: ^* b
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ( F. ?% J" B! u# X2 N) e1 s/ u( o! H
    9.     $routes->get('/', 'LoginController::index');: w4 j8 ~: s8 I: M: E3 z0 q
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');9 q2 m7 u) X8 K$ b- N
    11.     // 默認路由處理5 e. w9 M: a" S0 k
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      $ @/ L) b  }% `4 U* ?* W
    13. });7 z0 [8 Y4 v8 J+ l, w

    14. , k- n. r: b' n, g* j
    15. // app/Controllers/Login/LoginController.php
      . u* B) p2 \7 w  w
    16. namespace App\Controllers\Login;& C5 U8 Z1 g$ [+ ~+ Y8 b+ k
    17.   }+ h- E9 p# h6 K" ?3 Z' B
    18. use CodeIgniter\Controller;3 w2 A9 O  \& n; ]
    19. use App\Controllers\Login\AbstractLoginPage;
      9 J: d  [% @. f0 x/ [" j& k+ U
    20. # j! g) V0 @5 M  o
    21. class LoginController extends Controller
      # s+ N5 T6 T2 z# S
    22. {* S) Z' b: I$ G: ~/ O% B- ]) {
    23.     protected $pageObj;8 N4 K: G4 j5 T& k4 {( d% D
    24.     protected $LNG; // 語言物件
      * S8 F: X% X$ _  C6 ^% P
    25. # Y4 k) t5 V0 E1 m+ \# q, |8 j
    26.     public function __construct()
      % w  l* b8 H4 g6 }6 v
    27.     {8 ~. C* y* G! S+ Q- a1 w( j
    28.         // 載入語言檔和其他必要的依賴# Y2 q- b( R5 M" A! D. E; \
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務2 j( Q5 A7 ?. V  ~# O
    30.     }
      / R. z  ~  }" j5 Z* L7 r
    31. 7 ^6 c( }6 A" J: L. K- j7 h5 U
    32.     public function index()
      0 Y- Y5 x8 }' k
    33.     {; ]) T% {* w9 L: i! r3 u% ?+ o
    34.         return $this->handle('index', 'show');- B! t* K) @/ X- ~
    35.     }
      $ o: g. J; Y# Y: P- }
    36. 1 [) G; t9 E# r# B
    37.     public function handle($page = 'index', $mode = 'show')2 [5 B! _, K* W; P' ~
    38.     {
      # M( Q; @6 @4 X. A& X( }5 G! a
    39.         // 安全過濾頁面名稱7 U* q6 Y3 F* ]! [4 y) e
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);9 C$ }, u( X/ X/ T+ M: u6 W( n' d1 q
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      1 H( N+ s( H% s0 `+ s4 Q! |
    42.         " P; O1 A- s& F3 F4 z, Z7 l
    43.         // 檢查類檔是否存在( q  G+ x' t# {6 T+ S8 ~
    44.         if (!class_exists($pageClass)) {- s" H# n0 ]" F2 D2 ^1 E+ G7 Y
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      . z6 N+ j3 ]. `6 ^, N
    46.         }
      ) n; }- q. @+ c

    47. 2 y1 p, J5 d  @8 @
    48.         // 產生實體頁面類
      0 b! L- C7 _9 s5 p& A
    49.         $this->pageObj = new $pageClass();
      , `# K9 x) t& v( V5 `: v6 G, i
    50.         
      8 u, q; E- X( K. Z3 E7 s+ a
    51.         // 檢查模組要求
      ; Q5 z3 A9 N' d9 R
    52.         $pageProps = get_class_vars($pageClass);* K! d9 K: [2 K/ U( Z0 r' r
    53.         if (isset($pageProps['requireModule']) &&
      5 H: s# e; L7 g3 c% \3 U. z
    54.             $pageProps['requireModule'] !== 0 &&
      1 w/ ~2 d* b$ u
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      " v& U$ W, z# }& Y" [% n
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      . P: i- F2 G) r  p  i
    57.         }7 \6 f, S3 ?& {- Y
    58. 1 ~% `+ A# o; k$ v0 V1 g
    59.         // 檢查方法是否可調用
      * y& K9 j0 s8 B$ e
    60.         if (!is_callable([$this->pageObj, $mode])) {
      * M- @1 ^6 m/ n0 l; ]7 u6 i) y/ n
    61.             if (!isset($pageProps['defaultController']) || 5 J( u" }" T# U
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      8 j  O5 z5 r. V5 h  N
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);6 Y0 t5 R! `$ J: W$ u$ V
    64.             }
      ! k4 A+ i2 b7 E+ h; m
    65.             $mode = $pageProps['defaultController'];( g2 I# @* n6 i5 W9 m
    66.         }
      ) }2 [% Z5 g6 O# U

    67. ; Y8 K& \4 u% S# J7 B
    68.         // 調用相應的方法' U9 ?( ?1 L  j+ K4 W% Q
    69.         return $this->pageObj->$mode();) X) y1 m5 r5 Z5 y6 U# b5 l
    70.     }
      + N$ D0 y) S2 O+ C/ w0 M+ l
    71. ) W5 M! V0 d  b3 t  I9 F# Y$ N. f. D9 ?/ ~
    72.     protected function showError($message)
      0 v- C4 J: n. c& L
    73.     {
      0 K6 K, A# [7 r
    74.         return view('errors/custom_error', ['message' => $message]);
      6 n$ F5 F" p6 X' l' H- {# y7 g
    75.     }
      ( R. M; |* a6 E1 Z& w9 x4 d4 g5 v

    76. 1 w7 }3 L! a7 u) b1 o+ m& d0 [
    77.     protected function isModuleAvailable($moduleId)
      4 ?$ F3 N1 J! R
    78.     {
      ' [  Y6 _0 H: H% Q; ?/ P' S
    79.         // 實現模組可用性檢查邏輯
      8 J6 v, i* m( H/ l% `' H4 R$ |- B3 g
    80.         return true; // 根據實際需求修改! k" E" o* Y" x2 k
    81.     }$ N4 ?; }( e3 f) q
    82. }
      & K# w$ h8 ~* n& r0 Q& Q# ?- K
    83. $ n+ ^9 R4 [: x' E$ g
    84. // app/Controllers/Login/AbstractLoginPage.php! |5 }0 V% s8 j3 _6 p9 y
    85. namespace App\Controllers\Login;
      * a" p$ m1 q- x+ T4 t# J* O
    86. 3 n4 u$ r0 A/ l# Q
    87. use CodeIgniter\Controller;5 C+ a9 ^( [. k1 x0 [. K2 s; t
    88. 8 ?; b3 ~: b! L9 o$ H3 V, ]
    89. abstract class AbstractLoginPage extends Controller# r8 G. m- w8 y( V2 Y1 ?
    90. {
      - A( P6 Y0 _! q7 W+ C2 O: _1 O
    91.     // 實現基礎登錄頁面功能
      # G% }5 N, I' S" f5 s
    92. }
        u5 a% _+ h$ R9 F* W/ t
    93.   k4 Y# s6 X2 o  s' w* K
    94. // app/Controllers/Login/ShowErrorPage.php
      6 [, M$ h7 W! k8 ~. Q  [8 a% ~
    95. namespace App\Controllers\Login;0 W1 v" U; P3 N' i) ^

    96. ( [# A4 g1 L$ R. h- n
    97. class ShowErrorPage extends AbstractLoginPage; l6 l) P" ^: E' d' n
    98. {& d& A6 j' r$ R% n5 A9 ?: ]
    99.     public static function printError($message); l% [  X: r1 T/ f4 ~3 D9 [0 n- Z
    100.     {
      # x6 ^3 H5 d- _8 c7 N$ ?
    101.         $controller = new LoginController();
      2 q% q; ^: V* T- I
    102.         return $controller->showError($message);5 N$ S& q! u% v' c
    103.     }
      . W  @& S7 Q& r, D8 ?" d8 w
    104. }2 G- w5 g3 M9 A5 t; E
    105. & t1 I8 u% P' k, \. u' N
    106. // app/Controllers/Login/ShowIndexPage.php
      / _$ t' Y; E' `/ f7 `8 @
    107. namespace App\Controllers\Login;) q! x; A' Q% p' ]

    108. 0 M5 |/ h* m8 }2 j, @0 g* P. R
    109. class ShowIndexPage extends AbstractLoginPage7 \9 h. u" O* Y1 s
    110. {
      7 ]( d& [& X+ x. Y  h
    111.     public function show()3 W* L5 N+ a4 x3 _8 g' A& A
    112.     {$ o; R4 Q0 C7 z
    113.         // 實現登錄頁面顯示邏輯- Y  L8 p3 K2 O8 z6 U! G2 I& R0 d% w
    114.         return view('login/index');1 w1 u# [, J; Z2 u; q! U
    115.     }* t$ V9 P2 v# C2 K
    116. }5 h2 j5 |2 E- V$ R: m
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-9-22 14:02 , Processed in 0.015375 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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