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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15125 / 15125

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    9 h* S$ B% U3 [! ^* r0 \1 s( `AI 就是站長的最佳幫手。3 G2 b* e. x2 y. B0 q
    ) {0 s% M) G. ?; c- F  n

    9 f" Y, T0 A# p: q; C% c這裡的「新架構」是指後端的架構會有大變化$ r1 i0 r) m* R- i
    但前端的 UI 介面玩家不會感受出來有何不同
    8 U, X2 t+ j+ y* q* M  M: u! ~
    / B2 |* C! m* B* O
    0 ?3 q. c& `0 J- K為什麼站長要改成新的獨家架構?; N+ X8 P1 P' }, O5 R  V, C/ Y3 N
    就一樣由AI模型來解釋清楚吧。5 @6 K$ |& D% z% s, o; L+ h! J

    7 e& d9 D9 |) R( x1 N* z& Q' i# T' H+ m* E# ^
    讓我分析一下使用純 PHP 和使用框架的優缺點:1 h' l& Q! S7 D: N
    純 PHP 的優點:& D  W8 ]+ H# G7 o- @* ]9 r# ?
    1.        性能較好 - 沒有框架的額外開銷
    + g8 U4 ~% h& z; x" J* l- j7 _2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    & e6 V' U) ]0 Q! d- d/ J8 a3.        更靈活 - 可以完全按照自己的需求來設計架構: n2 O* e. J3 _" H, W1 Y
    4.        代碼量小 - 不包含不需要的功能模組
    # S& k) h1 f& r5.        適合小型項目: B9 S; W# n; w: ~. G' a, T" [
    純 PHP 的缺點:
    - U* N# M* J0 M& T7 S0 O* V1.        需要自己處理很多底層細節9 D+ }  U- d" Z) b  c
    2.        代碼複用性差
    * K; u4 K& ?0 q3 r& _) ~+ {3.        缺乏統一的開發規範
    ( D# N6 k1 t+ @, u4.        安全性需要自行考慮和實現
    2 l. S# Q7 F3 o/ l  g5.        開發效率相對較低
    " c" q# B' [  n3 {+ k; E6.        維護成本高
    / K& ]8 _* k* a$ a" R* m5 ^& X使用框架的優點:
    ' P8 S6 G+ |* E" O( \* @1.        開發效率高 - 有現成的元件和工具- T9 K) n4 b( L2 Q
    2.        有完善的安全機制
    + |7 k2 D6 F* ]% c$ f3.        統一的編碼規範8 Z. i2 S* o" t( |# g
    4.        易於維護% {: w; l6 ]' ]) C. [7 o1 ^$ @
    5.        有活躍的社區支持8 A* O# m" m6 J) G8 h8 T' o
    6.        適合團隊協作6 E2 [4 j5 H; G+ @
    7.        自帶很多常用功能(ORM、緩存等)% |2 c6 @* v( ?9 o0 ]
    使用框架的缺點:
    5 b, S* m& C" m' e1 w1.        性能有一定損耗
    4 V8 L8 w: P% @4 w. [- I2.        學習成本較高0 F; A* M8 e' d" ?, @7 Y
    3.        可能包含很多用不到的功能
    / S4 h# N5 l1 ?/ i) r4.        不夠靈活,需要遵循框架的規範
    # o2 ?# y- L* Y6 n! K  u) I4 S( D5.        對小項目可能顯得過重0 D$ l- G# o; H( j9 E
    建議:' _5 ]: @7 n$ L% Q
    1.        小型項目或學習階段可以使用純 PHP
    ' c' T* }/ E  I; C5 R( }/ g! c2.        中大型專案建議使用框架
    . T( \6 w7 @3 D# l5 w  Z3.        選擇框架要根據專案需求和團隊情況
    / R$ W: ^9 X1 q9 Q9 Q1 H5 v! \) ?4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    0 a8 e1 N9 `( g. @7 ]您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    * W2 C* B1 K* Q; J* e8 L1 g& W  w- u1 W, n3 C

    2 h# r7 X2 g  w: U3 j; }9 c7 Z% V& h" ~
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。4 ]0 q, `5 O' q
    & \; T+ ~9 C3 x2 e: x( g
    這個轉換主要做了以下改動:
    3 X2 A4 O6 M5 S: h" ]
    ! Q( h: h* M: n路由結構:
    / E" r9 d5 G! f) F
    ; K- a# L) \" O$ R" O# L( d使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下9 i# x7 O  K  ?( T% @4 W* q
    支援原有的 page/mode 參數結構
    : d* J8 n9 d0 @通過路由規則自動匹配到對應的控制器方法7 l1 r7 \: Y- h* b5 [1 B
    / h3 A) q* Y4 r; Z* b# M8 ~( N5 F
    % s. w$ q: a: [" t' I# P. y3 Z: B9 m5 F
    控制器結構:* q8 J5 ]6 D- T/ {

    " `% r8 ]- b2 E  K1 \% ~創建了主要的 LoginController 處理所有請求% K' m; E, D, s! H4 t: J& f* U, o. K
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    ! ~) g3 W) B8 p: l! P9 i& V錯誤處理改用CI4的視圖系統
    $ Z4 Q/ T; w9 W: c: S1 h0 F
    ! e9 |  B& ^7 @1 q, U) r, Q" q  ]3 T, |5 K: Y! _( j1 J
    類的組織:$ ]1 W7 A: M+ e1 a/ y; X
    : @* O  A' W" @6 x# t+ x4 s9 @
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    0 t6 H: @5 C' _保持了原有的類繼承結構2 I; @+ r3 _. q
    改用CI4的控制器基類和特性. K% v# o0 C# t- G+ M
    8 M" C8 Y' v$ v, U7 G# N
    # j9 F! @, @9 v# U5 f
    改進的安全性:9 {% W* H) K) ^9 H8 T& r8 P
    ( p- E" N( c7 ^: N
    使用CI4內置的安全特性
    ; x3 ]* Z. C+ H/ n更嚴格的輸入過濾; Z! j7 V1 t5 K1 O
    更好的錯誤處理機制
    % L* d1 V1 P" a4 ^' c  w% i- I
    ! r4 p3 N4 `  s; M3 U( P. a3 s5 J; |
    6 K- o2 i2 `* E" D
    - F1 Z: A; I8 L' z/ C8 ]+ q要使用這個新結構,你需要:
    & S. d8 ?; l6 K; W( w: h9 `& c1 P1 z$ V
    將這些檔放在對應的CI4目錄結構中0 N+ w  A/ h& K3 P  z3 T3 C
    確保創建相應的視圖文件
    ) |& O+ ^6 Z6 n" \配置語言服務& @( y- G1 K, L$ O/ i% H
    根據需要調整模組檢查邏輯
    7 K$ I% `) q6 D9 r- ^- ]
    ! C( Q9 e% W3 P% r- A" _, Z& c需要注意的是,你可能還需要:
    ! g: x. Q  y% O& ]/ ]) b7 o3 V; Q- \1 z8 g2 A" e
    創建相應的視圖檔(在 app/Views/ 目錄下)
    5 N* \! s, k) z4 m# A6 H  Y配置適當的中介軟體來處理會話5 c" h4 F$ N; q  O
    實現具體的登錄邏輯
    ; \, h3 p4 ^/ h* w$ n/ s  v9 c
    ! C3 V' s* F% [* G( G- T1 v) d" z2 V需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    . u: [8 h. D/ K  G, ~3 F0 F5 S8 g6 V. \/ e" U
    1. <?php6 `) f; N2 v  d3 x5 Z8 J! n+ }
    2. // app/Config/Routes.php
      ; R& W! N# X6 W* W+ ?5 C
    3. namespace Config;- M0 |! z/ r9 J3 Q* i6 H( P

    4.   {- {' [5 O0 C& g" k
    5. $routes = Services::routes();# L8 ?5 E7 t& w  b# c8 L7 c
    6. ) }& h4 K  F% q+ S& A* x1 p
    7. // 添加自訂路由規則
      # R7 e0 A* U! Z6 }' w* Q. d
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {- T) G. _/ t7 U8 n
    9.     $routes->get('/', 'LoginController::index');
      6 f* `. r  i( k9 L
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      + w3 Z! B3 [1 U* F& Q. ]' o
    11.     // 默認路由處理2 a* n) d+ O8 [) X
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');# o( s* ?/ ]  o) x
    13. });4 g) Q' e" U# ?2 Z, M% ]8 a% Q) U
    14. * N3 {0 j5 d3 k! c! z$ g! Q& w
    15. // app/Controllers/Login/LoginController.php
        \4 }3 n" j, n5 h$ y5 J( k
    16. namespace App\Controllers\Login;* Q$ n6 @+ w& V8 q6 l. B9 N

    17. 9 \2 B  i# m/ N" h; z1 x! o# R5 k
    18. use CodeIgniter\Controller;8 \! i( S) n- o+ ?
    19. use App\Controllers\Login\AbstractLoginPage;
      : _( h$ @0 v6 j. Q7 o2 w7 m7 f
    20. - Y$ N& ?0 I! {" G$ E4 M# S
    21. class LoginController extends Controller2 ~. D9 S; b7 O+ S, ]
    22. {
      $ G. C. \/ H$ m: _9 j+ V% w
    23.     protected $pageObj;+ Y  g7 U0 |  d7 k' Y0 {, k+ {
    24.     protected $LNG; // 語言物件
      2 c$ ]  [; A$ l0 V6 [& d) |
    25. 6 f( |( q6 J# O9 T# m
    26.     public function __construct()
      $ @7 Z0 E) Q6 l- j: W8 J* N; Y
    27.     {. x( a2 X8 V# i. D
    28.         // 載入語言檔和其他必要的依賴6 }+ _0 Z9 J$ V, R' a
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務: \8 V5 J/ W+ l/ f
    30.     }4 d2 u1 s- w' P1 J6 ?2 O/ ?9 X2 d

    31. 9 }, I. u- j1 Q
    32.     public function index()6 r) ?3 E: E+ U2 v* M' z$ _" e
    33.     {
      % G! D; h" ?& A; X8 t
    34.         return $this->handle('index', 'show');
      ( V7 E4 m+ T+ |# q
    35.     }: E0 F+ Z' m/ L0 D, Y

    36. . O1 o9 r* h" [' m, _
    37.     public function handle($page = 'index', $mode = 'show')
      1 c8 i4 C* ~7 ]
    38.     {
      & w8 K) a! `. O- w& ?& T
    39.         // 安全過濾頁面名稱
      % T0 D8 J, H" s8 G  u2 }) s/ |" {
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      ! M& U/ N- G! d  i. [( e
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';6 k% l4 m% b$ q* ^8 i) D; l
    42.         
        G) |6 m4 v" E, e2 n
    43.         // 檢查類檔是否存在
      , L7 I  a* ^2 p7 v! X* i) j) E
    44.         if (!class_exists($pageClass)) {3 t/ F1 B: E1 q% F, L
    45.             return $this->showError($this->LNG['page_doesnt_exist']);7 f. Q/ Z  ~9 m, H
    46.         }* S* Q! f) X' B8 [
    47. # u8 O. h8 `! L- j  K: F
    48.         // 產生實體頁面類+ U' L1 C9 ]" J0 p" o
    49.         $this->pageObj = new $pageClass();
        y+ R# K5 v* z4 q  Q  l. A
    50.         & ?" k# g: M3 a8 `" Q6 [7 w, ^0 t3 I
    51.         // 檢查模組要求& e6 J2 d" H0 e% L0 H5 g8 ?
    52.         $pageProps = get_class_vars($pageClass);
      $ Q: q/ p/ [* [2 @: ~
    53.         if (isset($pageProps['requireModule']) && ( B6 P' R) f; L& E9 _' ?
    54.             $pageProps['requireModule'] !== 0 && : X) l) Q  R3 ]6 O
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      ) l& z0 q6 Y' q- W
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      , H1 ]9 ^( w% Y, ~. |3 e3 l" M
    57.         }
      9 g) P0 M/ a) q( C' \+ q

    58. ( x# b. _  Y1 z1 M
    59.         // 檢查方法是否可調用
      . K" m; j7 y: N3 R' m* B2 v( u
    60.         if (!is_callable([$this->pageObj, $mode])) {
      6 X  i, O( ?3 g# M
    61.             if (!isset($pageProps['defaultController']) || / U9 @" C8 B0 Q' p% H4 k
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {" O9 a% ^# ?) l/ n- Z
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      9 l) l/ K* `/ q& g$ r8 C
    64.             }7 Z) Z# X0 h: n" Y% m
    65.             $mode = $pageProps['defaultController'];
      ' P. x7 A9 K* h& v% G7 T& _. L
    66.         }
      5 W8 @4 z+ E3 U" H
    67. - [) m4 w8 U( X! o9 m
    68.         // 調用相應的方法' G! T' p. h' j! p" d7 t
    69.         return $this->pageObj->$mode();
      & s+ U/ s$ W6 t# H: M
    70.     }
      + y+ B& b1 g9 R9 T
    71. 5 g, b- f* T8 W* f- \+ Q
    72.     protected function showError($message)
      % ~4 v+ {6 P: F5 d+ l0 ^# C9 }
    73.     {% h' Y# o8 S) C& r$ U1 w
    74.         return view('errors/custom_error', ['message' => $message]);- k- y$ S" Q0 f0 V, J+ B6 M: m
    75.     }
      * l- T) u1 ]/ o6 l

    76. * s, ?  n& k; F. U& I8 E
    77.     protected function isModuleAvailable($moduleId)& [" m/ l$ a' i+ ~4 ?5 n# k
    78.     {  u4 O  a) l$ z
    79.         // 實現模組可用性檢查邏輯
        D) w7 E  l; W  R8 w, P
    80.         return true; // 根據實際需求修改
      / ]+ r- ]7 S! d$ Q; C
    81.     }
      * \1 T: F) t9 g6 n6 g: x
    82. }
      8 f6 }0 s" a: d
    83. 7 Q* x1 @7 G# h, y" P7 [. D3 G
    84. // app/Controllers/Login/AbstractLoginPage.php: t$ H: {4 c6 T) B' Y3 b
    85. namespace App\Controllers\Login;) {7 a7 z7 j) ]4 [6 B

    86. ) w, P4 w' E  z% Y  f2 {
    87. use CodeIgniter\Controller;
      , D: o; k$ z9 e% y6 S6 z5 j* ^2 E

    88. " w2 O& N+ o" X2 ^5 O
    89. abstract class AbstractLoginPage extends Controller
      4 |  C4 x9 G- I9 D+ U
    90. {
      ; P  f8 T4 A* g4 h7 ~1 `7 J
    91.     // 實現基礎登錄頁面功能
      2 R' B5 _: p2 t! F) d% v
    92. }
        Z( b: C7 p( B% n$ v' v- Z& i

    93. + n& n& f+ P4 p1 r- C, ?
    94. // app/Controllers/Login/ShowErrorPage.php
      ' Q. \5 P+ `7 s. J4 ~
    95. namespace App\Controllers\Login;
      & b$ I* O1 o* ?/ {
    96. + f' R/ y& l8 ?" m8 }- ~
    97. class ShowErrorPage extends AbstractLoginPage. k- S" D; [3 |8 b
    98. {
      9 n2 Q& a: I/ S" c( ~
    99.     public static function printError($message)% a2 a6 u. Y) o/ V  s2 |
    100.     {
        U; S  l# F; m: r% ^: g
    101.         $controller = new LoginController();( B1 f% S5 i0 H% {" v4 q) V: l
    102.         return $controller->showError($message);" J; J1 v& O4 ^5 m; U
    103.     }
      9 e7 T- j9 r% }! Q( ?# ~; W" K- d
    104. }" c6 E5 \, P# w$ c+ T: d- f) o. C

    105. 1 Q0 I4 @$ R3 ?: n0 t! a
    106. // app/Controllers/Login/ShowIndexPage.php3 ~2 o0 ^+ q+ ~8 q# l9 e( T
    107. namespace App\Controllers\Login;
      % Q* D% F& e0 d, E% d

    108. ; A3 i+ m8 |* M# V' \$ ^1 u
    109. class ShowIndexPage extends AbstractLoginPage
      2 ?# h* R( E0 @
    110. {
      ) H$ P+ ?! ~/ b+ F0 s6 q4 t6 H+ c
    111.     public function show(); K* \. E( ]/ Z( F
    112.     {$ ^- w" S1 h( C+ O$ s' v9 i" W
    113.         // 實現登錄頁面顯示邏輯* R* _6 K$ ^' c! y& T
    114.         return view('login/index');+ g- A9 h+ M6 x2 B9 k5 ^9 A. J
    115.     }/ f, w6 |, ?+ n) j. e
    116. }/ l/ ]: ]8 Z6 Q1 {* f4 g" \- N' s
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-9-8 12:34 , Processed in 0.018157 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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