找回密碼
 立即註冊
點閱: 648|回覆: 0

[閒聊] AI 改版新架構記錄 [複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14427 / 14427

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    * w. ^: h. L0 J" f' A2 A9 V% TAI 就是站長的最佳幫手。
    6 g  X( u% m' q; l, C
    , a7 P( q" D2 j% e# B, Y
    ! V3 _& U" t' N0 p這裡的「新架構」是指後端的架構會有大變化
    1 D- g  y# F# O7 K$ C" s$ B4 I8 w但前端的 UI 介面玩家不會感受出來有何不同: W, c& R2 I: k2 I  s  [

    + w* g3 x7 d/ _  a: G2 L* b; P7 C' w: v+ r
    為什麼站長要改成新的獨家架構?
      n9 [5 i) A' q* }就一樣由AI模型來解釋清楚吧。; M& F* i8 e( ^" \0 q

    & K8 v5 X# ]5 _) y' Y1 g) ~: J; c+ E
    * J( {7 I# |0 Y* E% c% G讓我分析一下使用純 PHP 和使用框架的優缺點:( ^' q* k' ~6 n7 ~% ?
    純 PHP 的優點:
    - z* {* A+ f6 g( a! |5 R7 Q1.        性能較好 - 沒有框架的額外開銷; }8 l. `' g3 h. F; e" Y
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識& b; [% O( ]6 e
    3.        更靈活 - 可以完全按照自己的需求來設計架構. ~/ O& o- F/ T1 F6 V% f/ N
    4.        代碼量小 - 不包含不需要的功能模組
    0 q+ b2 l, ?' P: z5.        適合小型項目
    1 o3 S8 U' a% Z純 PHP 的缺點:4 F) i& \" ]- M6 ]3 ?1 E
    1.        需要自己處理很多底層細節
    , |0 r0 @& z. T- _) `2.        代碼複用性差
    / V* E, J7 x+ E9 `% l2 R3.        缺乏統一的開發規範2 d' L8 h0 X1 e) k% W( f# @& M
    4.        安全性需要自行考慮和實現
    6 k) x' \( M  n( }( s/ S: m$ Y# c5.        開發效率相對較低
    : T4 T9 n  f& C% n% P1 c6.        維護成本高
    & ^) F% G, }# q/ o+ \使用框架的優點:, Y& r. j7 V5 I- A
    1.        開發效率高 - 有現成的元件和工具  r- R% d/ Y! j
    2.        有完善的安全機制
    " k) h  d1 x9 h! c8 T% @$ @* T3.        統一的編碼規範" w+ l4 h. u  [: W$ @
    4.        易於維護
      f7 Y% p. C- o7 _7 H5.        有活躍的社區支持
    5 W4 I5 @2 [0 M! z: c6.        適合團隊協作
    9 y1 W. \2 Y: E7.        自帶很多常用功能(ORM、緩存等)
    . i- i' a4 \1 N3 n" c0 B使用框架的缺點:$ u; b* o- ?( r6 h: O/ @9 ]
    1.        性能有一定損耗& p7 \) J. k. M+ C5 r) t
    2.        學習成本較高! _5 \5 O" W4 P9 R- r  z6 G& f
    3.        可能包含很多用不到的功能- ]0 J2 k# H4 n' w4 }& V: o4 `
    4.        不夠靈活,需要遵循框架的規範- J! K3 b- M! W
    5.        對小項目可能顯得過重+ H7 X3 L% \, F
    建議:
    7 c# H# E+ v4 p7 a1 ^3 r# X: t1.        小型項目或學習階段可以使用純 PHP
      g% O7 n+ t/ C( f3 Q2.        中大型專案建議使用框架
    : x. V' e1 D; n* v8 K- Q3.        選擇框架要根據專案需求和團隊情況
    & t* |$ d- Z: G" x9 o3 h4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    9 A! P/ @9 }" f1 Q. {  X您打算開發什麼類型的專案?這樣我可以給出更具體的建議。- K7 H+ k$ M; F6 v; E& e% f  U
    " j5 ?# P) @( d9 I% w8 L. m
    0 R- Y- P7 G( K$ O+ D6 Q
    7 m/ I. L9 H2 f, P; L% e/ {
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    : s, V5 C" t# V  R0 Q& j3 G$ `9 @: N' Z+ `- ]4 y! x
    這個轉換主要做了以下改動:
    5 c7 v  O8 g/ K1 f) c. W( e6 E1 J1 O+ Z' X: ]
    路由結構:9 G7 S! G, h  ^/ l' U( v+ V

      e4 E3 k6 v, |; @0 l- U* m使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下* a7 H2 M% p$ j2 H- H+ x! r3 `
    支援原有的 page/mode 參數結構
    ) h& u+ ?" h. v1 N  Q8 o0 V, J, N通過路由規則自動匹配到對應的控制器方法
    8 l  X9 _. x0 c# T( R. x
    - `! t1 R+ j1 ]- r- P3 D6 A; k4 t- p: J  Y) i1 ?% I$ T
    控制器結構:
    ! {0 V$ y. b- ]+ g7 h9 C1 p! {! p1 L: [( u
    創建了主要的 LoginController 處理所有請求7 K$ V1 ]+ E" }
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    . Z3 g4 A) y0 g) z- o8 O錯誤處理改用CI4的視圖系統
    4 p" L- W+ `: Z2 [; F" h0 t: m; H0 Z# W+ ^
    8 {9 |& u0 m& y
    類的組織:
    8 b1 v) s" r0 F" k# l- g/ e5 p, H# A
    ) q9 c4 u7 Y$ n7 Q4 [; N/ U所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    - a4 R0 {+ L) d% Z, e2 V- C% I保持了原有的類繼承結構
    , b5 X. d" Z  P/ l8 E" c' ]8 a% I改用CI4的控制器基類和特性
    " k2 A/ `' i/ C7 I$ k+ {6 d
    6 q$ P7 u2 q- H8 N" S, Z, ^* p0 x3 |
    改進的安全性:+ j; k" f" {- c- \2 H2 G
    : s" D) F! e) {  r$ T
    使用CI4內置的安全特性
    - I9 X( `: o7 u+ J/ Y更嚴格的輸入過濾' U) [" w* r2 }& \4 `) y
    更好的錯誤處理機制
    ' p8 Y" b% j7 E# c1 ?3 K) i- h* Y: }2 L: N- t7 m

    6 Q+ a; Q) X, N; |# o$ N" y9 y' e0 M1 m
    要使用這個新結構,你需要:& u# p! n; Y. v0 u% N' l' {

    3 O5 R$ n- y3 X+ R3 s9 Q  Y將這些檔放在對應的CI4目錄結構中
    & ?# x8 ?2 j, z: O$ c確保創建相應的視圖文件
    8 n! f& r% y6 p* O" L+ k配置語言服務
    2 J; v7 `2 d, S# r/ N根據需要調整模組檢查邏輯) a5 o  }0 M* f4 {  h9 s0 S9 i3 Q' k/ u
    & H2 g! `9 T& R: G7 ?& k" v, g
    需要注意的是,你可能還需要:* z6 [5 `/ R( g
      {7 J4 F& @+ H* E( G2 H- i2 d
    創建相應的視圖檔(在 app/Views/ 目錄下)
    6 \' Q4 R9 e2 V( }配置適當的中介軟體來處理會話( a# f1 G' t( ]3 i4 X" s/ ?
    實現具體的登錄邏輯
    - T% W! r: \8 d4 A
    2 ~4 @( z1 J2 n$ y' m需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?6 z0 Y* F* \# \7 O) n

    ) G$ o: I8 B7 g' b( f
    1. <?php' f* p+ I  T- i2 m
    2. // app/Config/Routes.php( J8 }  \: J  X5 R8 u
    3. namespace Config;
      + }( e# ?( U' S7 _/ h0 H
    4. , Z+ [7 H# b, W9 V* @$ D( @% r
    5. $routes = Services::routes();2 h- ?) z, G5 @) ^( `

    6. ' e; S: B2 \/ ?% h6 \* W
    7. // 添加自訂路由規則
      , q" f. v2 v- @" \
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {4 }7 y8 A, n" ?
    9.     $routes->get('/', 'LoginController::index');. Y# F% A6 I+ o
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');, c7 X1 V9 N8 {0 h0 m$ K
    11.     // 默認路由處理
      6 B# E' N) g* }- Y* U# p! g
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');8 v. X$ u/ U+ }5 {" x3 j
    13. });
      6 f2 W2 v( f3 s9 L2 w

    14. , _, W& R+ e$ U( s" }: l7 _) o  `
    15. // app/Controllers/Login/LoginController.php
      9 C$ y7 P& @  }5 L. Q8 D
    16. namespace App\Controllers\Login;, p( h& o: z5 K8 w7 l
    17. $ F" C0 Y$ {2 p- V$ X
    18. use CodeIgniter\Controller;
      % p, o5 y7 b4 ?6 s$ z
    19. use App\Controllers\Login\AbstractLoginPage;
      # Y) {/ B& ~, I8 [4 h

    20. ( X9 I2 M7 G+ p$ t+ n* x/ J
    21. class LoginController extends Controller
      5 ?0 N; d5 i* a" X7 I
    22. {
      * R5 A( q: Z6 T0 P
    23.     protected $pageObj;' y: a0 Z1 _  Z$ a2 C
    24.     protected $LNG; // 語言物件" H' t4 G1 w3 b8 s

    25. & }/ i3 R; w4 l9 j3 \0 H9 P7 o
    26.     public function __construct()
      7 \) O1 K" g4 p$ u% U
    27.     {6 X% r/ F& n  k. o# p. a
    28.         // 載入語言檔和其他必要的依賴% [2 Y0 I4 U0 T- {3 S/ p" G
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務& N0 D2 d8 a  [$ D4 Y! i& _1 e2 D& Y
    30.     }
      / n) E! N0 g8 K. h
    31. . V/ q; J, |3 ]! u1 D5 I. s3 k  ~
    32.     public function index()
      5 S5 S" }9 U" A. G7 L& _: D: e6 E
    33.     {) x7 r' L4 {7 T4 I+ u5 i
    34.         return $this->handle('index', 'show');
      4 M/ t; Y  R4 ]5 @( ?5 o+ L/ O+ z$ d
    35.     }3 _# z- n  g( u7 ~6 e& [* I1 ?
    36.   R* T& U( v0 S8 c8 Q8 _
    37.     public function handle($page = 'index', $mode = 'show')
      % u: d8 c4 e- c. Y6 W4 N
    38.     {
      # N) n( E" R* A, _, D+ m
    39.         // 安全過濾頁面名稱
      & K! b9 j) r' r0 s
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      2 Z/ p  d/ ?, i( T
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      7 ^5 [  n6 d2 v! Y* U2 j/ q# h
    42.         7 ]; @' o3 o* h5 @$ u! P
    43.         // 檢查類檔是否存在
      $ c: l+ R- R* W  B3 S4 R
    44.         if (!class_exists($pageClass)) {: s1 l' h- V, V
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      3 j7 `6 f) _& W5 h- q
    46.         }
      ( ?- M  R# {1 A1 J4 L: X
    47. 6 ^. `+ y- W# ?9 N
    48.         // 產生實體頁面類' `* r- o  E( n& o* S
    49.         $this->pageObj = new $pageClass();
      # c7 G" |4 U1 b0 t! y
    50.         ' x8 u$ E2 c8 h, `) D
    51.         // 檢查模組要求
      , ^" U' Z+ Y  Z4 Y: o. V0 s8 ?
    52.         $pageProps = get_class_vars($pageClass);
      4 i/ f& `! l  o) ?
    53.         if (isset($pageProps['requireModule']) &&
      ; G% {% F& I  `: G8 B. j
    54.             $pageProps['requireModule'] !== 0 &&
      5 B- I- t1 |# d2 q; h4 S
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {1 A( ], N; i5 O: V
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      9 v4 N- i) q; ]' B
    57.         }
      , T9 M. k3 a$ D$ y
    58. ) x& o# B) v, E3 ?$ b
    59.         // 檢查方法是否可調用- {2 ?- h( M3 `/ I/ _# L2 _+ r$ p* [
    60.         if (!is_callable([$this->pageObj, $mode])) {
      ( O' t% `) n1 l9 ]1 C5 n
    61.             if (!isset($pageProps['defaultController']) ||
      6 C) y+ W- j! U( a+ a7 w( M
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {' C8 f8 o  n( J% ~1 h3 x
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
        |$ ?0 z4 Q* C0 t/ k+ o. ^
    64.             }
      % E  A- X, N1 ^: y. t
    65.             $mode = $pageProps['defaultController'];2 p# x. l9 }: {! \" U# L
    66.         }& e" \6 ^$ J: ?1 D8 i* K
    67. ; n6 W0 R" ?1 u( ^
    68.         // 調用相應的方法
      9 A. a& n, D5 K$ ?7 L% f
    69.         return $this->pageObj->$mode();
      1 @7 f1 G# Y% }7 m; {9 m9 E
    70.     }
      3 z( t4 k; ~+ n7 S; z  H0 x8 D4 l  M

    71. # H( H9 v, \6 D2 i5 F
    72.     protected function showError($message)
      3 d4 l9 r2 T& A4 A
    73.     {. v% G' y% {! X; J
    74.         return view('errors/custom_error', ['message' => $message]);
      $ Z& b# N+ w" o- [& K  d- ?
    75.     }
      / g; ?" h) S- p
    76. 2 ~" q1 C0 }9 U" k
    77.     protected function isModuleAvailable($moduleId)8 o5 a5 S& j2 z& V! `  |1 T" f
    78.     {* `2 Y8 p" \* K% n, m1 C
    79.         // 實現模組可用性檢查邏輯" |* b8 U- D6 ^! o7 Y5 ^
    80.         return true; // 根據實際需求修改
      8 `3 z1 R- [- o5 O1 g0 Z8 Q# ^
    81.     }
      & o3 E, p  V# @* b4 W
    82. }
      " L7 V' h, D5 o6 d
    83. 0 D# ^8 p1 W9 M6 e3 q  y; @
    84. // app/Controllers/Login/AbstractLoginPage.php
      - w0 I) z9 ?- ]/ g: B% e" g; {
    85. namespace App\Controllers\Login;
      6 e! d/ m. G0 v; ~* P7 n

    86. $ {, B' P7 B1 n- {9 w. y! n
    87. use CodeIgniter\Controller;0 S3 q9 c% Q. o" |( H3 b. L' [
    88. ; o- K+ p  n' w4 E
    89. abstract class AbstractLoginPage extends Controller
      6 M6 o3 h( o) C) |7 W
    90. {
      * T. k( Y& n& A: \7 ^2 P$ x7 K1 a
    91.     // 實現基礎登錄頁面功能- _! l9 ~) |1 G; }) |
    92. }) S: B( u0 S, L" s5 t: m: ^0 c5 @

    93. " s, _! ~# R* ]8 t  Z7 Z; ?) A% {
    94. // app/Controllers/Login/ShowErrorPage.php
      7 _0 \. T; G$ x, A$ U
    95. namespace App\Controllers\Login;
      " A' H1 t' W/ G4 W. D

    96. ; Q& Z: U3 ~1 }
    97. class ShowErrorPage extends AbstractLoginPage& N$ ~3 [& y; l; f; i5 R. c4 Z; ^
    98. {" e0 y& s2 H1 ~$ A* a
    99.     public static function printError($message)
      ' @! y) Q4 y  F8 _- n1 E
    100.     {
      5 L3 M/ X% V' @
    101.         $controller = new LoginController();
        D8 r% U3 E- E0 |0 b( `
    102.         return $controller->showError($message);
      2 C4 a: n0 \4 K9 i
    103.     }
      4 {  x& K! a$ R4 b$ }
    104. }9 i9 e) g8 r9 l& Z
    105. & D5 M* Z9 Z8 z2 A
    106. // app/Controllers/Login/ShowIndexPage.php
      $ k. R$ ^/ [& e" J4 `$ Z) e0 o* z
    107. namespace App\Controllers\Login;
      # A% Z2 D3 j& t) n9 }7 A3 Y
    108. + Y+ V0 y4 i4 S& P# w
    109. class ShowIndexPage extends AbstractLoginPage: G6 T! P( ?2 y$ o8 q4 A5 _/ q; g  E
    110. {; h4 M, }8 x# B$ _, U+ |2 O( j
    111.     public function show()
      ) ^4 T7 A- d1 X0 ~8 T4 I0 `$ L6 X
    112.     {/ E# `- ^' r; y9 ?) t: N: F' o
    113.         // 實現登錄頁面顯示邏輯* p1 A9 s, l2 g4 Z. [& |% i7 Q
    114.         return view('login/index');2 f/ u/ Z& P6 \& X: }
    115.     }
      2 m  A5 }% X5 r
    116. }
      1 }1 i- {$ `, {0 i, ?
    複製程式碼

    文章的最近訪客

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

    本版積分規則

    Archiver|手機版|MyXNova (原 myxnova.com)

    GMT+8, 2025-12-18 20:54 , Processed in 0.013399 second(s), 8 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2014 Comsenz Inc. 界面設計: 我的XNova論壇

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