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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14862 / 14862

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    * v* W# k, Q2 S# O  {4 QAI 就是站長的最佳幫手。
    " i' U) C- P, G+ P* J$ q9 N& _& {! T+ N7 Q& ?
    & ?! g* Z% `9 Z4 F' d
    這裡的「新架構」是指後端的架構會有大變化& I3 P# F& g( z  x) r$ j) v
    但前端的 UI 介面玩家不會感受出來有何不同
    " m7 z) ]$ q, M8 B% E! r7 x8 E
    ! U/ P$ @5 M$ d- z/ x0 ]  H% D" J" l( g: ]
    為什麼站長要改成新的獨家架構?
    , T$ S  D( v2 L1 {7 _就一樣由AI模型來解釋清楚吧。
    ( ]$ ]9 i7 s+ x  H6 w
    8 }3 F4 S: K$ |- Q" s  i$ L
    % J2 R. n- ?  O9 w* y# a/ G+ W讓我分析一下使用純 PHP 和使用框架的優缺點:9 V4 D+ a, X, g2 S* b
    純 PHP 的優點:
    9 S" F1 U  C6 ~; a1.        性能較好 - 沒有框架的額外開銷
    ! x3 s. C. C1 g* O2.        學習曲線低 - 只需要掌握 PHP 基礎知識! N- F) w9 X5 H$ P4 S
    3.        更靈活 - 可以完全按照自己的需求來設計架構+ Q& V* u6 }9 U8 P0 ], u/ O  C
    4.        代碼量小 - 不包含不需要的功能模組
    ( |% y& @8 ^) G+ a( {7 M' p5.        適合小型項目
    , n) l  [9 l/ C: A7 E純 PHP 的缺點:" Z% `' N0 s% G4 e5 F/ B
    1.        需要自己處理很多底層細節* f. F$ }' i  y1 K( B  N/ X
    2.        代碼複用性差
    " ?: X8 A% y( E, `" t4 Z+ m2 d& T3.        缺乏統一的開發規範, q- V! ?0 |" h' [/ G
    4.        安全性需要自行考慮和實現
    ! ^2 D- K- {: D, G6 z5.        開發效率相對較低
    7 x/ s7 l9 ^# L- n- y* T6.        維護成本高/ y4 q. r& u2 P5 Y' t5 k
    使用框架的優點:, E5 w. ^1 U+ k) B# S3 e9 D* ~
    1.        開發效率高 - 有現成的元件和工具
    0 r/ a. ~: k* z! ]  Q2.        有完善的安全機制
    / }3 d" I4 F' ]3.        統一的編碼規範3 \7 K. a' |6 q
    4.        易於維護
    : B5 e0 {- q- ?! b: y7 z7 B5.        有活躍的社區支持/ d; |4 t+ p+ o) s7 s7 r7 M9 Z
    6.        適合團隊協作
    - R! g( Y! e2 y' I% ?7.        自帶很多常用功能(ORM、緩存等)
    1 D! z, H5 F& F1 ^- F$ Z; V( i使用框架的缺點:9 r' @0 h0 y& a* u$ J0 I8 A, o; B! w
    1.        性能有一定損耗
    ) C1 L+ Q% e6 s$ I! g" H* O2.        學習成本較高
    # U, K6 V  O0 }5 l3.        可能包含很多用不到的功能
    ( \0 a% a0 S& s4 A4.        不夠靈活,需要遵循框架的規範0 h3 g4 d% J8 H, P" r! m7 O0 A; s
    5.        對小項目可能顯得過重/ V1 g5 H4 p6 Q. R! u7 O7 X
    建議:
    " I) T- I6 D1 G* m2 O( h1.        小型項目或學習階段可以使用純 PHP
    % X* X% X+ j% p- h6 W, k+ {2.        中大型專案建議使用框架
    & A0 T. M& ?- i3.        選擇框架要根據專案需求和團隊情況4 v' B) i! R( g* Y- \2 l" v6 Z
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    $ e3 I( ?2 E4 F( x6 q# J# g3 O) t% z您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 E, K7 t  @8 ~: s# j
    3 \* s. q" M0 w' Z2 R1 q2 J- j/ X4 G

    1 p1 X# P; {. V+ s, C+ Q" d1 v9 ~; U
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。' W' h8 @4 T2 X4 B  K$ y; R9 e0 O" S
    * s7 @' H. G  w5 S+ C, I7 _- b
    這個轉換主要做了以下改動:  e& ^) u4 @9 E0 a  X

    9 m: j2 O$ m! S  g. `路由結構:
    $ u: j) @* I- N6 o- J- y  }  f! l: L$ B) O9 F6 _* ~
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    6 w- t/ d, [0 A* g2 [# M支援原有的 page/mode 參數結構" j4 Z; D* t5 J  Z
    通過路由規則自動匹配到對應的控制器方法
    1 |  f2 Q3 O0 @. x* F4 }$ [  O4 I8 Q3 @6 Y. @

    , J' D! N) h- i" C9 f; @2 o' M6 p控制器結構:
    % |; P, Z' b1 J/ @/ b0 M& o  k7 I+ J% @
    創建了主要的 LoginController 處理所有請求: p- s1 e1 I( V9 e7 z5 j
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    0 d0 j# ~% [6 K3 \* Y7 ?; x. u5 g錯誤處理改用CI4的視圖系統/ ?1 Q2 {  S: {9 T! o
    4 @$ ~/ [' c+ W4 c# h( J$ {0 |

    1 E9 c* u: Q5 {! @3 }' f類的組織:% d5 m! t) v9 n

    9 f) M! k& c/ b8 z# J! U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    - y% I- ~+ G6 }2 w1 E3 R$ A4 Q5 g保持了原有的類繼承結構! R9 T$ E7 ?. Z* F$ w; ~" M
    改用CI4的控制器基類和特性
      e  F" A1 d: K+ t7 ^8 l' @  p7 f% V$ @

    8 s7 i- H8 U( G6 k* u) F改進的安全性:
    . e1 b5 L" F& T, B; Z7 U" |
    7 S! B* ^+ E( l( ^. d使用CI4內置的安全特性6 y) }" h; X& }0 I; E
    更嚴格的輸入過濾! j  }' e( _- O
    更好的錯誤處理機制$ p1 X8 G7 E; u' {2 P

    + W! z0 Q: k) ?- _9 M. j9 C3 w* t8 X

    " F% L0 @8 m! N5 d6 L要使用這個新結構,你需要:
    : D- V0 m: L8 D3 c0 ~* M9 v" \" f  j% C5 I% {' O
    將這些檔放在對應的CI4目錄結構中8 s5 N; o4 E' C! A6 w
    確保創建相應的視圖文件
    * z- ~9 z. u" A6 N配置語言服務
    4 R3 B9 M. }. b# S+ f  b根據需要調整模組檢查邏輯
    9 h6 b! `$ I8 q1 }2 n0 X# S- V9 ]; n/ X' ?; p
    需要注意的是,你可能還需要:
    8 \, D. n! K, v
    ' j3 `* t# h5 c  K% ?' {1 z2 \2 l8 O- ?創建相應的視圖檔(在 app/Views/ 目錄下)
    5 |) N  L" y- k1 }' s: X  |+ W! H配置適當的中介軟體來處理會話
    0 ~- [! i1 `' Y! K% V1 m" ?實現具體的登錄邏輯
    : B4 M) m) J7 C# t/ D% M. q, O% z* j4 P$ b* p5 T
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?1 G0 @& I9 a) ]. d/ E7 l- K! |- ~

    4 @+ {7 D3 i8 J( Z% U
    1. <?php
      $ {: B# i: U& H
    2. // app/Config/Routes.php
      9 q7 R5 y: U& z) X$ Q0 R. W0 N
    3. namespace Config;% O9 |+ q& \' ]; P- ]" C
    4. $ D  _) }4 k1 u7 d, x, o" g  h
    5. $routes = Services::routes();" [+ ~( _4 ~7 d$ ^6 x4 f
    6. 0 q& g' u+ x: s& o4 t; P
    7. // 添加自訂路由規則! K# r8 L) U; H# j6 p( G" D
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {% a0 ~) ~/ C  q- y5 d: u, s  L7 ~
    9.     $routes->get('/', 'LoginController::index');
      / r9 N9 x# t1 j8 ^% r
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');4 f) A$ X1 j2 z8 k& T# u
    11.     // 默認路由處理5 T% P' n' G* T* m8 g
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');' ~+ }% }6 ~, }7 N& L6 q
    13. });
      # l9 _9 E" t  @; [8 R3 M/ L2 k

    14. . l; C% b# Y) K. @
    15. // app/Controllers/Login/LoginController.php
      9 s5 ~" h% u( K# k5 H& z# h
    16. namespace App\Controllers\Login;2 _( h' Y. L* K6 _0 K

    17. $ j' E; D- p' ^9 m- X
    18. use CodeIgniter\Controller;
      / m: |4 z; b; d! F7 D
    19. use App\Controllers\Login\AbstractLoginPage;
      8 Y) s% L1 Y# m

    20. $ a9 {4 \9 O- @  Z; I
    21. class LoginController extends Controller
      5 p6 F* A+ T( D# D, J7 X; j# @
    22. {
      2 m6 o6 H2 x$ E. A" |% I
    23.     protected $pageObj;
      0 Q! }- {! P* e5 h2 w: F/ z- r- E
    24.     protected $LNG; // 語言物件
      9 f/ E6 b# B2 ~9 n& u9 |4 c: S

    25. + u1 A9 O  o- l6 z, n: k/ O
    26.     public function __construct()
      / K- ]% \, P* u0 D
    27.     {
      & ~$ R1 W" |% f7 Q8 }4 C
    28.         // 載入語言檔和其他必要的依賴
      3 Y& e7 I/ l3 v) r
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      + w% R: r$ T2 I8 P4 j& T$ X# Y
    30.     }
      1 _4 P2 Z; D9 v; B
    31. " [5 Y8 F2 z' k7 m. q: i
    32.     public function index()
      ; b- O( e3 V7 B( {
    33.     {
      5 w9 v& K$ }/ [, u6 i# |  |
    34.         return $this->handle('index', 'show');7 q: ~( B5 w3 y7 i% p4 j
    35.     }
        |9 l6 }8 H$ k# h9 t5 E1 S8 J
    36. / @1 i: @; J: x' M' L8 d- a  r
    37.     public function handle($page = 'index', $mode = 'show')% }3 I( _: x  E* N* f7 E
    38.     {
      # P5 f$ U0 r: x" c; q  L. D: ]* W3 m
    39.         // 安全過濾頁面名稱5 U( ?/ j# q; e9 D5 N: x! n/ k; I
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);# N7 t9 y- j/ b8 K. z
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ( ]! }3 L6 o2 [' l& P5 I
    42.         
      6 v4 _  ~5 Q$ k) Z) S
    43.         // 檢查類檔是否存在" H8 e+ k3 ~# j0 V/ W
    44.         if (!class_exists($pageClass)) {$ A& j, u# A6 h
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      / q) a+ l. B& L' o  ?
    46.         }* b- \, Q& B1 N4 C1 b
    47. ( I. w( C2 l# w$ C6 D
    48.         // 產生實體頁面類1 N  E5 d" N+ V, a" O$ ?' z" d8 Y
    49.         $this->pageObj = new $pageClass();+ X$ _9 d1 ~  k+ y% y
    50.         
      ! w6 m3 Z3 v7 B6 b
    51.         // 檢查模組要求
      + O4 U  S! a! N8 S4 c
    52.         $pageProps = get_class_vars($pageClass);( G  h- h; R: q/ |
    53.         if (isset($pageProps['requireModule']) && " l6 W' s9 @/ Q( J$ ]/ a( k: ~
    54.             $pageProps['requireModule'] !== 0 && 3 h! `2 A( g& l
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      ) I3 ]/ `% x) y! X) z5 x
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      6 @# }% C- |9 @+ h' j: E8 s
    57.         }# s; Q2 o' G5 j" C# t( @

    58. 0 j6 A! j. n# K3 H. t3 k* S) i
    59.         // 檢查方法是否可調用
      " r" H. `# K0 |* c9 ]& \; X
    60.         if (!is_callable([$this->pageObj, $mode])) {
      # R1 I6 @4 d$ Z
    61.             if (!isset($pageProps['defaultController']) ||
      6 X* P4 r9 U9 J1 H( N3 z
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      + c8 E8 l9 L6 D
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      " N( z5 }7 Q/ G* T! S
    64.             }
      0 \/ Z; T# S0 ~. Z5 N3 T1 j4 `
    65.             $mode = $pageProps['defaultController'];
      . g, v- {* ]/ ^* C
    66.         }, M; @) r- H6 q

    67. " t$ l; t, Z* U4 Y6 x
    68.         // 調用相應的方法
      $ `. b& {1 N8 f% J7 ^& S  f) M# y, a# S
    69.         return $this->pageObj->$mode();
      , i' e0 i0 Z, R" m
    70.     }
      ( ^: R! ]: X- r8 X/ C* n  Y
    71. 7 D, i% g- @5 P$ C! G5 i* P
    72.     protected function showError($message)( @5 i! p) T' R& |6 k
    73.     {
      7 K. x/ Z/ E8 B# k, ?: E% P2 Y
    74.         return view('errors/custom_error', ['message' => $message]);
      - g. P( h0 f, W) }5 S/ }
    75.     }) l% i8 Y" ~  L! s- w3 E9 H1 V
    76. * e" C1 q7 @9 l; f8 E0 C6 G
    77.     protected function isModuleAvailable($moduleId)
      / ~3 ^2 n- F. y# @
    78.     {
      ) r. L2 X& |' Y
    79.         // 實現模組可用性檢查邏輯( E/ R$ s! I! c+ [; d
    80.         return true; // 根據實際需求修改8 m8 z' W+ E, J+ ~+ j" }# c. M0 L0 z
    81.     }
      : v! P- G' R' Z/ k
    82. }
      ; B5 J4 `, C) d! `, @
    83. & V) Y" h- V8 T  e
    84. // app/Controllers/Login/AbstractLoginPage.php. \* _& l+ l/ a/ g# {7 W
    85. namespace App\Controllers\Login;
      2 o1 R) [3 _, q* @/ z
    86. 6 z5 M+ f  [: [3 p1 N0 X, [% t
    87. use CodeIgniter\Controller;
      8 q) U' W  e2 }4 [

    88. 1 q/ ?# w; a$ I7 m
    89. abstract class AbstractLoginPage extends Controller
      4 v3 o; `4 ?! E0 P/ W4 f7 Z
    90. {
        P) a; E. y4 R) y
    91.     // 實現基礎登錄頁面功能
      / v1 D; K: K! R" b' B  _; X1 }6 o
    92. }
      * r/ I% c8 D9 y9 U% r
    93. 0 E# I+ p( X) v. u) c3 g
    94. // app/Controllers/Login/ShowErrorPage.php
      ' Z4 {) i; H% _) ~3 W5 A0 f
    95. namespace App\Controllers\Login;
      , D+ G2 J% ~3 H" c) ?, w+ {
    96. & ?; ~/ d8 ?4 v8 H# P$ T
    97. class ShowErrorPage extends AbstractLoginPage
      " S' N* Y0 R6 `! {2 ?8 ~2 [
    98. {
      - ~  d# W0 O# n  a( W
    99.     public static function printError($message)
      2 W: D+ b  l: `; E4 I& l
    100.     {
      2 i5 E6 ^# k, l
    101.         $controller = new LoginController();
      5 S, x$ O1 I4 f+ Z6 l
    102.         return $controller->showError($message);  O3 o! y" [- }0 `, }4 F% p
    103.     }
      , q% F: l% o( k5 s) \
    104. }+ ]% j: ~8 R; G; A) v. j
    105. * _" R5 @2 G* ~& t% R/ m
    106. // app/Controllers/Login/ShowIndexPage.php0 G) V0 J$ Q$ A6 s' U$ V
    107. namespace App\Controllers\Login;
      ; V  u3 I. F6 v' I" @) h. L* B
    108. # E- l0 N* L4 Q6 u8 @
    109. class ShowIndexPage extends AbstractLoginPage. w1 W7 {! H/ d! k4 x) ~
    110. {& h$ _6 e/ U& `+ o( V" V
    111.     public function show(); Y, P* M/ P, M; t+ h" I) P$ Q
    112.     {
      1 k& r2 ]% f& J* ]
    113.         // 實現登錄頁面顯示邏輯
      8 b1 h' o8 b# ?' _4 X
    114.         return view('login/index');
      ; a" t- f6 S- [" K' B5 T4 H
    115.     }
      + l" a5 F  ?* ]6 T7 D
    116. }
      / z) h& O6 {  T8 I- g
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-6-2 06:03 , Processed in 0.015504 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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