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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 244

魔法值:13397 / 13397

生命值:4%

升級   100%

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

    [LV.Master]伴壇終老

    發表於 4 天前 | 顯示全部樓層 |閱讀模式

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    - y( S& Q" G6 a: p7 R& }0 ~- VAI 就是站長的最佳幫手。
    * V; R" B- C" E0 J& M1 Y- l2 _( w1 k% ]( V

    & u7 L& X- W& b+ H3 y這裡的「新架構」是指後端的架構會有大變化; F& Y% n+ e: S7 H2 b3 Q
    但前端的 UI 介面玩家不會感受出來有何不同1 ~3 R0 H( n" F. g9 p. }' V
    ( z/ U0 j9 l* y# A& M% P# C$ B
    0 i& Q, n& p, S3 d
    為什麼站長要改成新的獨家架構?# W8 |4 @+ C7 n" ?" v
    就一樣由AI模型來解釋清楚吧。
    - w3 F# |# ^" M+ b0 s6 }! H
    6 m1 n# d- L/ B4 v4 o
    - |8 V# e4 ^, J) F  |1 Y4 ?9 x8 b讓我分析一下使用純 PHP 和使用框架的優缺點:
    , F, |6 W9 W- A( c+ T4 y: }純 PHP 的優點:
    . @6 ?$ z: R5 ]6 p5 q! c9 ?9 h+ ?1.        性能較好 - 沒有框架的額外開銷5 c% e' o  D- s' }8 f
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    # m  g% P" g+ i$ z5 i; {! Q) t" t3.        更靈活 - 可以完全按照自己的需求來設計架構/ P3 Z. x% ?  B/ n3 T8 j" q
    4.        代碼量小 - 不包含不需要的功能模組* Q5 _5 q- ^1 q2 Q& k6 F, t; R6 s
    5.        適合小型項目
    2 m2 w: }+ U# F/ F純 PHP 的缺點:' @% `7 b9 j% r; ^  U3 }
    1.        需要自己處理很多底層細節
    4 _; ?1 k& S$ m0 x3 b0 p$ [2.        代碼複用性差
    , s4 ]% n; G6 |* D! a7 _7 Z3.        缺乏統一的開發規範
    / }7 F& w$ o& w7 a2 }) j/ [4.        安全性需要自行考慮和實現5 a$ D1 s4 v+ B1 u
    5.        開發效率相對較低
    7 l  C4 d4 W8 Z; z6.        維護成本高
    1 }( ^" i! o( F/ E, A使用框架的優點:
    ( n& S( W. D0 L% Y$ l! ^2 B1.        開發效率高 - 有現成的元件和工具
    * D0 v& N; }. o% K2.        有完善的安全機制5 z9 Z# R; ?0 Y2 c. |
    3.        統一的編碼規範6 q, {; y, _) \. h
    4.        易於維護
    ; r8 k/ B- |( G$ ^. X5.        有活躍的社區支持, M  D& x4 X; [- g
    6.        適合團隊協作8 v5 ~- N$ B3 \- j/ F, R
    7.        自帶很多常用功能(ORM、緩存等): o$ S4 \; ~1 H$ t
    使用框架的缺點:/ ~+ E. u# v4 S& ~  K( z
    1.        性能有一定損耗( q: i* F! P- ?2 d4 r5 K
    2.        學習成本較高
    3 M! {1 D4 Q( Z1 f3.        可能包含很多用不到的功能
      Q2 P1 N* o# R; ^$ e- ~4.        不夠靈活,需要遵循框架的規範# f! o0 ~' F4 T* w( @
    5.        對小項目可能顯得過重9 d# `+ D  f( E% B5 m) [; |
    建議:
    9 g5 `/ b. ^, ~+ e9 i% Q1 r. D7 W1.        小型項目或學習階段可以使用純 PHP
    * S' Y* ~' ~3 J  x" o4 ^, M3 W" {2.        中大型專案建議使用框架' N4 T% \% u. d' s8 a6 C2 d
    3.        選擇框架要根據專案需求和團隊情況8 m( b5 [' G  e3 j! _1 P; ~  G" i  K
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    2 ~/ B) A" Z/ |7 c6 q' Y- Z您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    5 D/ ^; d/ Q' e$ W& |6 j/ Z" R0 t& r  O, D$ ?0 z3 i3 i

    9 G+ u! W( }9 m6 A9 d9 O9 L& t& \( s8 z$ }/ ?0 _
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 }- f+ C) ~- m! }3 o
    ) W. D) C' ~) e6 z  J/ }0 j
    這個轉換主要做了以下改動:
    / o6 `2 }% {& \
    # N  v( c3 b- h( F! V路由結構:
    & p7 Q" x' u  {1 a4 M. |3 A  p; Z6 O
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下8 L! A2 A! C5 A- ^' K
    支援原有的 page/mode 參數結構: c, w; X5 O4 S; E  s
    通過路由規則自動匹配到對應的控制器方法
    4 @% l6 m) t1 K7 b% u1 v+ |( e% `, v! j* `# C, x
    5 [" J% S3 U: R2 ]- W- T/ X# z
    控制器結構:
    3 {/ T: ]' O0 p0 e8 H" i% \5 F; x  Q& R+ M
    ( E4 C- V# T2 K創建了主要的 LoginController 處理所有請求
    0 ~+ g' i. n7 A! Z; i/ N' t0 d& t$ P保留了原有的頁面類結構,但改為符合CI4的命名空間規範* Z2 ^& J9 V+ H, B  O" `/ ~
    錯誤處理改用CI4的視圖系統
    1 B( H" A: Y7 f' j: W$ k; P( S, j# l1 U  N. Z" T' Q( L+ ]. p1 Z. h1 v. i

    % e/ X/ V# L% h, F' S類的組織:/ b% W* `- l0 R
    $ p  B) S- Q6 X) ^4 L1 \
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    0 [; s. F$ r/ ~" h6 ]4 C保持了原有的類繼承結構
    . s) H; b- |1 u$ j" v; R改用CI4的控制器基類和特性
    / n& N1 S- `+ p" l7 d6 N# `4 z) m2 k$ I! ]0 }

    / T$ O" I. r, \5 T改進的安全性:
    % m& n# l* m9 l7 l5 c2 _3 W0 f' t/ {* L
    使用CI4內置的安全特性
    3 h- _2 v2 m( l更嚴格的輸入過濾
    / ^6 v7 C; F' o, N4 ^更好的錯誤處理機制, e% y1 H$ N  w2 Y+ U8 b
    # U0 o% I, `+ T5 m" J0 X
    4 Z9 V& q# D1 H! Q+ [

    ; o0 I5 G1 }5 S# U( j要使用這個新結構,你需要:. Q& k8 S) y9 I* s$ _
    " r1 r3 F6 Q; e" X3 Z7 U% u
    將這些檔放在對應的CI4目錄結構中6 v# \5 _7 Y3 \, ]
    確保創建相應的視圖文件
    % R; q+ p/ V1 B配置語言服務4 O  p; B* L, w" c9 S0 a
    根據需要調整模組檢查邏輯
    : s8 K/ [) q$ i/ {, Z( k- T- o" C4 }& ?5 a8 K4 L( \
    需要注意的是,你可能還需要:
    5 g5 @# s- L( n2 ^+ |! _$ x; k$ h* m, A4 w5 I4 G: W
    創建相應的視圖檔(在 app/Views/ 目錄下)7 p+ h+ n; n/ P9 l! t" x
    配置適當的中介軟體來處理會話: g/ e. e0 S) k8 G- I
    實現具體的登錄邏輯
    ! G) S0 z/ k5 C0 i. Q. @8 N+ X# p4 f4 [0 K8 A/ _- K( r
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    - g9 Q; X; ~0 p" y  |& ^& ~9 U
    8 T6 n5 m) T5 j5 T: W6 v+ c
    1. <?php
      % H- E+ b& b7 w% G; e; Z
    2. // app/Config/Routes.php
      4 D% c/ K9 _/ B3 F: w- ?! i! l
    3. namespace Config;! R2 A  _* h$ l- \

    4. ! y. e+ d% `* v9 ^% R$ I9 `
    5. $routes = Services::routes();5 y, S$ V/ R- ~  N( u

    6. ; R& k+ o- F4 N$ I3 C' L9 f" |2 I* S
    7. // 添加自訂路由規則( }8 x1 G8 t  C. b4 M. S7 m
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      9 D5 Y' S4 D8 u4 J: u! a
    9.     $routes->get('/', 'LoginController::index');
      / j0 k: s9 k+ D; e
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      . v# O/ Q+ s5 ^5 g5 M5 |( A( t6 V
    11.     // 默認路由處理  B, r# _, v' V) |; Z
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      - H9 n( q2 y- X
    13. });% c4 ~1 ~! e8 h9 b3 E* V
    14. : x. A# S1 Y4 z+ L
    15. // app/Controllers/Login/LoginController.php* a9 _+ B6 p  M0 D& ?8 J
    16. namespace App\Controllers\Login;
      . |+ M+ J* Z4 ]& }  Y. C

    17. 7 g8 R5 y; v' K6 r; i
    18. use CodeIgniter\Controller;( D* Y, z& S  b) W, C
    19. use App\Controllers\Login\AbstractLoginPage;
      ; z3 m" E1 a) p; n, q* D3 q

    20. $ _4 ]/ Y; X, Q5 _
    21. class LoginController extends Controller9 k1 g% |( I; q7 b1 |/ _
    22. {7 ?) {) v( s' o. W
    23.     protected $pageObj;5 v2 Y1 E# s8 Q3 Y0 R7 @
    24.     protected $LNG; // 語言物件# ~# e9 s  [6 d( ?

    25. 7 N* ?) }) o: b% ~
    26.     public function __construct() ; O  Z4 |' i/ h: |
    27.     {# y. p; J8 o4 @6 Q( f0 x' Q/ @
    28.         // 載入語言檔和其他必要的依賴
      * P& q8 ^5 D' S
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ; P+ q4 e4 P, e4 D; }, J9 C
    30.     }
      8 ?( o8 z6 F' ~$ G% G4 H+ C: `  h
    31. ' Y- m& g% T$ W, S
    32.     public function index()
      ! |( r- J1 V" f" X; i
    33.     {# J4 q5 Z) z- R- m
    34.         return $this->handle('index', 'show');
      $ ?$ @( ^0 {4 E8 P7 ^1 j, e( c8 e8 C
    35.     }9 Q5 s; M( t  W# s
    36. 6 a6 H9 d! ?3 H* w) Z
    37.     public function handle($page = 'index', $mode = 'show')
      % P4 F" ]8 ]2 V" h0 K
    38.     {
      ( y: z; w! Y& B- \: x
    39.         // 安全過濾頁面名稱4 y  P3 I1 U5 ]4 @# O
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);* W0 u, H! m9 Y1 N  V, \8 I
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      3 D3 V, ?8 G5 v/ E5 H
    42.         ' t8 ^1 S: v; Q( _# B% i& y, N9 q4 C: G
    43.         // 檢查類檔是否存在3 Y, N8 F. O3 S# O2 W3 |8 q
    44.         if (!class_exists($pageClass)) {7 a' n0 B, c* c, p4 m4 Q3 B
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      9 x* q4 g. G7 O# r7 _
    46.         }
      : z2 N5 y' K1 i9 g8 J) C+ @

    47. % n& N0 W. ]3 n
    48.         // 產生實體頁面類
      9 U9 w6 q. n0 |, q* S3 y6 _. a& K
    49.         $this->pageObj = new $pageClass();
      9 T1 g5 |5 ]* F6 b7 l
    50.         
      ( G7 |4 q7 g# B- Q+ {8 @
    51.         // 檢查模組要求4 V) t  a6 A3 ?+ t( D
    52.         $pageProps = get_class_vars($pageClass);& W: k7 Q! t2 k4 U) a% J( F/ N
    53.         if (isset($pageProps['requireModule']) &&
      1 B# l; c& ?' P( F. }+ r6 e
    54.             $pageProps['requireModule'] !== 0 && # C3 R5 T+ s# `2 q/ ^
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {# n. T, K# Q& D! `. r8 n
    56.             return $this->showError($this->LNG['sys_module_inactive']);7 i; m7 @6 F1 C8 c8 S
    57.         }$ T8 r3 ?* O. F+ ~
    58. 3 I$ f9 G4 e- ?* x# M( P
    59.         // 檢查方法是否可調用
      8 x, x. g0 p* v, A2 o4 t2 W" j1 s
    60.         if (!is_callable([$this->pageObj, $mode])) {
      & {- K- Q' J3 D
    61.             if (!isset($pageProps['defaultController']) || % \% _, M' X( a1 I; T, i
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 L& D* _) a+ f4 D4 S8 b, [& O% N2 b
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      " [- \) C( X2 f# ]0 R
    64.             }2 U- Y2 U5 T! C% _
    65.             $mode = $pageProps['defaultController'];) I! W6 X, C6 C5 K
    66.         }7 T" y( H1 n- w7 u9 v( D
    67. $ W* _8 n* F. t) E2 M: H
    68.         // 調用相應的方法2 G! k; ]% [& j" N; ?. ^
    69.         return $this->pageObj->$mode();' u0 S2 E* W- p7 V1 J
    70.     }* X! @4 i, P# h6 |  J

    71. % @6 o) A3 J- u+ l* m: L! _
    72.     protected function showError($message)8 v4 q2 J0 u4 B0 A6 {1 L+ M
    73.     {( B" D& ~& B$ [# C) l
    74.         return view('errors/custom_error', ['message' => $message]);' S4 U/ f% j+ W; w0 s" b
    75.     }$ ?# e: Z" K8 b$ c7 Q7 o7 I: Y/ u

    76. * q4 W% b6 L  S' f0 A! y
    77.     protected function isModuleAvailable($moduleId). m7 B- w! ?5 d$ }/ u5 G$ r
    78.     {) E9 |" A' v, _+ G
    79.         // 實現模組可用性檢查邏輯0 W0 {' c# h. @% q5 r+ f+ k8 p8 V) x
    80.         return true; // 根據實際需求修改
      / m, D" Z5 ]# E6 w0 e
    81.     }
      # r! O& @9 L4 y! L
    82. }; A& L$ P) A3 ^' O. m9 D
    83. 7 [, ^0 R3 V8 x6 Y5 K/ `! m
    84. // app/Controllers/Login/AbstractLoginPage.php! p2 ]0 g0 G8 T
    85. namespace App\Controllers\Login;1 v* S* X7 d( X# p+ z* D3 d  w
    86. 4 F9 G/ w; U. w" K& i
    87. use CodeIgniter\Controller;& I% T2 w! X& O9 O1 C3 L

    88. 7 E4 ?5 z) L7 A8 m4 ~
    89. abstract class AbstractLoginPage extends Controller
      + w; g9 Z# r* e: m" W" g1 G
    90. {
      8 J8 {1 h" i* [$ l3 s: d) b
    91.     // 實現基礎登錄頁面功能; }6 Y7 m# s! |/ o
    92. }# I, U; B) ?$ [. ~5 O- B
    93. * t+ a0 Z7 V& [: \+ ~4 M+ z
    94. // app/Controllers/Login/ShowErrorPage.php
      - L. \1 u$ [: v. m  ~. g3 c
    95. namespace App\Controllers\Login;9 |6 R$ |4 K) l$ K; I# P; V6 M
    96. + H! G# `1 o6 v: W3 ?& o
    97. class ShowErrorPage extends AbstractLoginPage, e6 a" w* Z) L' @9 i# C/ Q
    98. {
      ! }* N& i" k3 L- \/ ^
    99.     public static function printError($message)0 o) K6 w  E+ x/ @& a8 @) V: O
    100.     {" a$ j" J4 ^/ o3 g4 d: V2 g* F* V
    101.         $controller = new LoginController();$ x& R, k& `$ a
    102.         return $controller->showError($message);6 D0 m$ ]: M# S- P0 H: N
    103.     }. z9 h2 F, I; }) v& \4 I
    104. }
      : d+ A7 E& b2 F* s

    105. 4 h7 T* w& X: q: M& ~5 l
    106. // app/Controllers/Login/ShowIndexPage.php
      $ X0 X2 v6 Z' f: E% V
    107. namespace App\Controllers\Login;
      7 b$ |& @& E2 x; X' Q. }. f5 V0 @
    108. : c9 k6 T1 y6 c
    109. class ShowIndexPage extends AbstractLoginPage( b/ r/ _/ T# T; ?5 G# m' {
    110. {
      2 t! _" }( X2 G7 S2 ]
    111.     public function show()- t, Q% C6 K' d5 N" N4 M; d
    112.     {) |8 s( x' z) o% j) D8 U
    113.         // 實現登錄頁面顯示邏輯
      5 h  X1 y) o& |9 R  F; w
    114.         return view('login/index');; S+ a4 k0 l; f# i
    115.     }) A/ p- M1 C+ K! z5 z1 F
    116. }! p* V1 B1 N# g/ y
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2024-11-21 14:23 , Processed in 0.012067 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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