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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13998 / 13998

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    昨天 13:56
  • 簽到天數: 5642 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    # C/ J+ \0 Y$ i9 w* ?; s, \AI 就是站長的最佳幫手。, d8 r' U: I5 W8 l2 J! F3 O' l) ]4 H2 K
    + W& E6 i" s' f) @! q

    5 B% [9 A" @1 z% L2 d- R. o這裡的「新架構」是指後端的架構會有大變化! O" f. D' g& w' J& e9 N: V' C
    但前端的 UI 介面玩家不會感受出來有何不同
    7 M4 `) x, z: Z4 b5 A
    % r# I9 e* m5 K! f& D
    % \9 C. m  ?4 x% `6 p為什麼站長要改成新的獨家架構?
    # H  d1 a- [( R. `- {' C& I就一樣由AI模型來解釋清楚吧。) ^4 X5 b8 i+ B/ F7 c4 U$ ^; l
    " x+ _" a9 g5 o# s2 @
    7 {" q) W8 ]4 K. |
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    / L5 y- Z6 w2 o; W8 K: `  C純 PHP 的優點:- h4 l) g$ f1 T) N$ |3 g: b
    1.        性能較好 - 沒有框架的額外開銷4 _' \. H( G8 S* Q8 j. n
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    % p0 y" v, R# L/ a1 Q& T3.        更靈活 - 可以完全按照自己的需求來設計架構
    & j/ k* I) S, Q4.        代碼量小 - 不包含不需要的功能模組
    0 W6 ]9 F, [" m$ j: q3 ^5.        適合小型項目0 d; h  r- J, ?! l: g# x7 t, i
    純 PHP 的缺點:
    0 G/ i5 b! _( C: N  Y- V1.        需要自己處理很多底層細節' f5 b* s/ \* |. C4 @- C2 \
    2.        代碼複用性差& Y7 {, R! f* S( T3 B
    3.        缺乏統一的開發規範
    + R( k; l# Q' Z. q: O4.        安全性需要自行考慮和實現
    $ v6 K4 x  t8 b5 e6 |% L2 P; O5.        開發效率相對較低( o4 X2 c* r, X0 u9 \: _
    6.        維護成本高
    & n* @7 x' I+ M  |' Z( c使用框架的優點:
    ; h+ j) E2 i" D$ v+ L; S1 R& C1.        開發效率高 - 有現成的元件和工具
    - d: a! r1 X+ j- F& Q2.        有完善的安全機制
    & Y% K* A. s- x4 {4 S0 b1 \3.        統一的編碼規範
    7 x7 M  Q7 H* j+ y& L6 J* {! M3 I4.        易於維護
    ) l7 B  L% A7 F7 l5.        有活躍的社區支持$ P4 i0 C, }4 A3 L0 a
    6.        適合團隊協作
    # N6 V+ p& c+ B# m1 L' ?7.        自帶很多常用功能(ORM、緩存等)( Q3 e- d( [+ O* S& F) l. X
    使用框架的缺點:
    * k+ B5 @' R2 g5 o# R1 d, f. g* _1.        性能有一定損耗
    3 H& `4 m' c) g: a& M# _. g4 u0 \8 K! ~2.        學習成本較高
    0 K& Z: X% `& G2 z3.        可能包含很多用不到的功能8 v2 f/ R# w/ B( p. ]
    4.        不夠靈活,需要遵循框架的規範5 W4 {( ]# D6 @2 p5 r/ A% K7 ^( Q
    5.        對小項目可能顯得過重
    * ]& N  z5 t/ n- M$ |0 Z) X( N建議:. ?. u$ k* u" N0 B! e
    1.        小型項目或學習階段可以使用純 PHP
    : Q6 W/ b6 o) ~& q: r: ?# }8 L- ^2.        中大型專案建議使用框架
    , V3 M: l3 G" x) ^" v! e3.        選擇框架要根據專案需求和團隊情況
    $ \* w1 A3 L$ K% x2 o( _" j, I( K" R9 m4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    " F. z( q, Z" Y1 k) j7 b您打算開發什麼類型的專案?這樣我可以給出更具體的建議。1 a( e; ?( `. M

    % K' v) o7 u2 t- E' p' a# X* F9 w# \9 u# q  n% y

    % @5 l6 Z) I, d1 K- \' O' h$ \我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    $ N. W) B+ }" g# t/ w4 p: \; {  A# _) T4 D  Z
    這個轉換主要做了以下改動:; W% {" f- W/ }

    / e1 ]6 U& z  X: r" n路由結構:
    " H: R8 K3 T+ b+ X
    ) x& O) \) a2 r$ S9 S使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    5 k5 m% T; A( b* e/ L% U支援原有的 page/mode 參數結構
    2 b; ^! R) F4 i7 i. ?0 o通過路由規則自動匹配到對應的控制器方法
    3 F9 O  e# n$ ]  R
    , |) K1 J0 ~1 Z4 A- h& c& _2 D& J) i3 U4 j2 d1 T- _
    控制器結構:
      n" t* Y1 g8 ~9 f' l  G7 C. T5 ~3 L, x, i6 n9 \
    創建了主要的 LoginController 處理所有請求% C( \; ]+ V; G+ E' S
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    4 \4 X( q/ v  O: V2 s" \' p, K錯誤處理改用CI4的視圖系統
    / d/ ^  ~/ D/ {1 s9 e0 H# Q  j: o0 D6 M0 t" ]4 G

    5 M5 c' Z( y( G3 ~4 k* B; w( y類的組織:
    3 _- b: |* Z, l: p4 Y# Q; u. u- Y5 T6 o# d/ x3 e! T* e
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    ! c2 q/ M) L1 y0 I保持了原有的類繼承結構
    & p7 h9 d# L- @) w4 e. T改用CI4的控制器基類和特性5 l, V, G0 b: A6 {( {

    $ G$ ~4 h' e" X# O4 Q
    ' m! r, F. W$ W* f) S改進的安全性:* M4 U/ S& a: Z3 f
    $ M2 q+ `; Y+ b$ P0 W0 m
    使用CI4內置的安全特性! q1 N5 Q- F% F* v
    更嚴格的輸入過濾" |' j- _7 [# n( ~% m: |" A8 G) t
    更好的錯誤處理機制
    ; Z1 C: V6 W3 O4 y% C$ r3 B0 i0 E
    * q8 i/ m) u/ W7 m
    $ h% f8 l% W: A9 [2 _$ ^  p( U( ]/ I* I0 T  r& O
    要使用這個新結構,你需要:2 u  V& w% g% U6 i4 l, \5 |+ ?
      g0 ^, V  p4 ^& O) i- @
    將這些檔放在對應的CI4目錄結構中* ~$ v, K2 E$ U: y2 m3 k- H% W* B' T
    確保創建相應的視圖文件
    1 w, R4 S) w" Q! ^# F' h配置語言服務
    , @$ |, g1 Y0 H+ M* i" p1 l6 n' C根據需要調整模組檢查邏輯4 _  J- J& l. P& g- E7 Z

    $ z: }! M2 Y( T. ^1 a; X3 ]需要注意的是,你可能還需要:
    ) ]# P" s3 d' U% F
    : A/ }9 y8 z8 i' }5 v9 e& E創建相應的視圖檔(在 app/Views/ 目錄下)  x1 `' x) K% a) S* d8 M
    配置適當的中介軟體來處理會話
    : i7 B, l9 b. O; n實現具體的登錄邏輯
    ! O/ X+ I7 }1 j6 V
    1 w7 i% t' R1 J5 ]# n( x需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    5 _) |! d1 N* h1 Y/ A! I; e6 N" q4 {8 ^" @8 P" B
    1. <?php# y7 v% ~" D7 _4 {% p8 ]
    2. // app/Config/Routes.php
      1 r' t* [3 J6 H8 U9 ~
    3. namespace Config;: h% q2 s5 ~) h! s6 \7 Y! S; g; v" j

    4. # E8 }0 d! o. J: c6 B1 [7 p, m! @
    5. $routes = Services::routes();& Z2 e" e- `' l0 p/ S% B& b! K

    6. ! q- M; z0 Y& v: |
    7. // 添加自訂路由規則% S7 d; w: B' i! \' D" H4 `
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      " D) X$ V- y1 j+ w
    9.     $routes->get('/', 'LoginController::index');9 q5 c2 g# W; t
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');. u' q2 x$ i3 Y* @7 {" R0 e
    11.     // 默認路由處理# V4 {+ R4 _! {' R
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');4 B! [+ s( ]9 O; z0 u
    13. });
      ( ]' C- _; ]  v( S: P+ n

    14. 6 ^% l# ^- l6 Q% b
    15. // app/Controllers/Login/LoginController.php
      ' ^' V) a- _8 p6 \, @0 j
    16. namespace App\Controllers\Login;5 N4 t, M* _2 J

    17. - S7 \8 L. A8 i( L) L. L
    18. use CodeIgniter\Controller;& U+ s# j! Z  Y2 o" b
    19. use App\Controllers\Login\AbstractLoginPage;1 E9 P8 y* A2 U5 U) \" s

    20. 3 ?0 m: S$ u3 i4 e+ y+ T
    21. class LoginController extends Controller* c8 f6 ^% T, Z3 u
    22. {
      + i5 n+ v) z) T
    23.     protected $pageObj;
      ! k' c+ y( g) [& m8 l) u" i
    24.     protected $LNG; // 語言物件
      " ]2 Z' a4 ?. v+ ?8 a5 B9 Q

    25.   F$ }$ T  e* d: g* ]1 g# x
    26.     public function __construct()
      & a. s) j. V0 J5 G3 u, A
    27.     {
      : e- Y" w/ y5 {, ]& }) |
    28.         // 載入語言檔和其他必要的依賴
      - {9 k! m% m/ A8 |* n9 |# j" q
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      " {4 }  F8 g9 ~# \* S* [
    30.     }$ `3 X0 Y. g5 b, p) [

    31. " }- E' d* g* w% {# e6 q
    32.     public function index()
      9 {" j# g9 E* P& Z6 T$ N9 W2 a
    33.     {: h/ O1 U$ }! w0 Y9 L$ I
    34.         return $this->handle('index', 'show');
      , b: D6 i( \6 a1 _. z& M; d; S& M" t
    35.     }+ X. k! s$ a' Z3 ^( v8 P" L
    36. 0 r; ~3 ~& l$ o! W' z
    37.     public function handle($page = 'index', $mode = 'show')1 v# y& M7 e! u, L& g
    38.     {6 O, c! i! y1 I! O! P
    39.         // 安全過濾頁面名稱6 L( {7 I" x4 e
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      $ V' c- t& v4 b$ y/ @( x! E
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';0 n/ ?# L6 G9 @. A, Z1 Z
    42.         
      8 S7 l. n- G1 U: L
    43.         // 檢查類檔是否存在, p; H4 y2 V. y# o6 K7 j
    44.         if (!class_exists($pageClass)) {  H5 \7 E' K/ }7 T( V3 `2 W9 x
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      * E+ A7 \4 e, D9 v' j# `7 W
    46.         }- B8 ?, c0 b. F6 w

    47. 1 J, r& r  M8 R) R
    48.         // 產生實體頁面類
      . C6 @4 [& j4 \3 E& H8 M. P" W
    49.         $this->pageObj = new $pageClass();
      6 W$ f" l8 w0 l4 l0 ]! I
    50.         9 x) _3 `" N5 l. h/ e
    51.         // 檢查模組要求, [! {5 C% i% D7 \
    52.         $pageProps = get_class_vars($pageClass);
      # ?8 \4 O" z  S
    53.         if (isset($pageProps['requireModule']) &&
      $ K+ ~1 S, v' q* x9 X0 K
    54.             $pageProps['requireModule'] !== 0 && $ t* l( K, }3 h# C) q; D1 B9 r
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      7 t1 R1 j3 X4 b# p
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      1 z! H$ [+ M- C# k4 T
    57.         }/ b* k* W+ @* S8 E8 o
    58. 7 _+ R$ S3 ~+ h7 n% a& |( l
    59.         // 檢查方法是否可調用; H6 [. |! z8 {7 \* k% ^' w! G
    60.         if (!is_callable([$this->pageObj, $mode])) {
      - b' a, z/ @1 F+ V
    61.             if (!isset($pageProps['defaultController']) ||
      5 C5 T8 P" ^! f2 u2 i
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 l! e0 @0 G. c4 i2 T- `. Q. u
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      ' h) X0 P$ \. R; c
    64.             }0 }8 [9 Z6 y5 _, f/ H4 f+ H
    65.             $mode = $pageProps['defaultController'];
      9 b# j3 l0 j( i6 E  e, }+ Q
    66.         }
      + i6 J' L5 Z" r- ^8 a
    67. 8 l1 N; _: D7 ~$ m; A
    68.         // 調用相應的方法; C1 H# r& L: L9 b7 v
    69.         return $this->pageObj->$mode();& i) Z; d5 I  Z/ K
    70.     }& J8 E* i, t* p7 O
    71. 3 K$ t6 x" [& I) L: L
    72.     protected function showError($message)
      7 B5 a; o/ ^' k' ?- J
    73.     {
      ; w3 k+ ]. z9 _- r
    74.         return view('errors/custom_error', ['message' => $message]);
      , [9 r# U1 n, {
    75.     }; w' F0 S- ^, N' j, ?5 T& {; f$ w
    76. ' l, j9 C  V4 P# y0 A' |
    77.     protected function isModuleAvailable($moduleId)* l* k  n% a" z4 Y$ }
    78.     {' R6 D* w- b4 H/ p0 P0 `
    79.         // 實現模組可用性檢查邏輯
      0 l* x* V6 |6 E0 q& Q
    80.         return true; // 根據實際需求修改
      : y' G( [- x) k0 k8 d5 C5 M4 m
    81.     }
      7 V, G) ^* {  k2 u8 z: `
    82. }; E( \  I0 T$ u7 `

    83. $ L! e; t$ t$ Y
    84. // app/Controllers/Login/AbstractLoginPage.php
      1 [. r& ^& _! C( _
    85. namespace App\Controllers\Login;
      - I  a9 g: R! F0 F3 S, K. }

    86. 0 G: S, J: B6 a6 v/ }! c
    87. use CodeIgniter\Controller;
      8 u- v3 K& C. \- |$ _+ O

    88. ! X% e; W) v2 r( T9 q! z
    89. abstract class AbstractLoginPage extends Controller2 c3 g7 u: E2 F) d, d5 Q
    90. {* T& {# ^+ _7 e: F8 s+ K
    91.     // 實現基礎登錄頁面功能
      & O2 J) G- I5 ~* v
    92. }
      ) a; A3 u5 A" W: U, f
    93. ( F4 V# A! l+ X2 A7 e7 G2 Z9 r
    94. // app/Controllers/Login/ShowErrorPage.php
      % q# e  P& M- e3 Q6 G7 w& X
    95. namespace App\Controllers\Login;
      + W: d, I' C; |4 Q9 A

    96. # R2 x1 g0 X0 [! L: E9 A
    97. class ShowErrorPage extends AbstractLoginPage
      8 G; O, v- Q  G% n# d9 a
    98. {
      1 K) b7 z- K8 R9 Z' o  E  b
    99.     public static function printError($message)
      $ I/ Y! G* I' m7 O6 c  S
    100.     {
      . D4 J8 N3 j/ B9 ?" J
    101.         $controller = new LoginController();) _2 V+ d$ x' j0 I" ?" n
    102.         return $controller->showError($message);
      9 u3 N6 U* a% x+ k5 b7 Q
    103.     }
      & B7 t2 w. c0 b, V' }) x
    104. }
      # n$ k! |& y4 p: N
    105. 2 a. _6 Z' x6 n
    106. // app/Controllers/Login/ShowIndexPage.php
      & z- q- ~* i! m/ V2 C( I0 k$ r
    107. namespace App\Controllers\Login;4 ~1 p" I) V5 u+ k: C0 F
    108. 4 h$ _$ {. }  E% u' V$ m9 C
    109. class ShowIndexPage extends AbstractLoginPage% G" ^" ~0 s1 @8 v5 A# r
    110. {
      & G- e) F: b7 G* d' X  v
    111.     public function show(): L" t. x/ Z& e( B
    112.     {
        n5 n' `' c$ W) W' e5 @
    113.         // 實現登錄頁面顯示邏輯8 }" X4 r6 v" h
    114.         return view('login/index');
      ' c0 `# a: G. |& \: ^8 ]) o1 J
    115.     }! u5 \3 w$ J4 b: B3 d3 c
    116. }
      2 H, w# C' \3 O. ], u
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-7-8 14:12 , Processed in 0.017178 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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