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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14808 / 14808

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致1 Z5 Y; @/ V, J* U
    AI 就是站長的最佳幫手。
    * o1 `' O' [% u# {, d4 C& Y
    ; H# F. q$ y( k+ U# p$ y  j6 v- e0 z9 @  m. z& x
    這裡的「新架構」是指後端的架構會有大變化9 J  y7 N# l. N' `* p
    但前端的 UI 介面玩家不會感受出來有何不同
    # x; g( [5 y& S& C0 Y: ~8 J
    ; H) P* c9 e2 X. ?% _  [& j- w' O2 ?4 T6 i6 X9 x, Q9 q
    為什麼站長要改成新的獨家架構?
    * {: J& l& r( V7 `. v' ?就一樣由AI模型來解釋清楚吧。, \! m/ v/ m0 G) m9 B

    : q" s8 o7 b% z7 u9 r8 A6 t$ O0 y0 \) ~8 [6 N/ x( v' h2 l
    讓我分析一下使用純 PHP 和使用框架的優缺點:- [( V! D/ z  D" N! t; I, ^3 R5 C
    純 PHP 的優點:
    1 l/ t' y; a$ O1.        性能較好 - 沒有框架的額外開銷
    : p9 [+ s& c4 N4 ^) R3 T! `2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    ) k0 ~' f; I8 C. ~1 i3.        更靈活 - 可以完全按照自己的需求來設計架構4 J  ?' t8 h* Y1 C* E
    4.        代碼量小 - 不包含不需要的功能模組
    ) S& O" n+ z3 c1 f# C) F- i/ g0 Y( H5.        適合小型項目4 Y; h1 t; e/ M' b
    純 PHP 的缺點:, ?1 _6 s, P6 [4 W" r6 Q( ~, ]' ^; F* h. K  S
    1.        需要自己處理很多底層細節% x& d& [! Q8 @8 |3 y% B4 z/ N  }
    2.        代碼複用性差% k( n9 I8 z3 k, u6 O, x5 W
    3.        缺乏統一的開發規範
    $ m7 y0 S5 l. `# C2 f4.        安全性需要自行考慮和實現+ Q5 B/ `5 p5 M; n& D, P, X4 J
    5.        開發效率相對較低5 f( |" ~4 E1 l; G& S' |& U4 v
    6.        維護成本高; {  M: x: e4 M! T& J4 j
    使用框架的優點:2 K5 _# n5 F# `* F  I% b: T
    1.        開發效率高 - 有現成的元件和工具0 `5 S1 E* ^  O3 p. k) T  [; N( s3 A
    2.        有完善的安全機制; t" l) C3 Y$ [# b9 U% m: B
    3.        統一的編碼規範8 W- i- O3 |% A2 J9 f
    4.        易於維護$ C2 l% D, K: j. X  f/ P8 X
    5.        有活躍的社區支持2 ?6 p  x$ N2 N8 b
    6.        適合團隊協作
    " S+ X- D, h; `2 _! A) O7 n7.        自帶很多常用功能(ORM、緩存等), t: O8 i, J* a3 U7 W- U4 {6 C
    使用框架的缺點:
    & J  k& Q4 \1 M$ y& l( A+ Q1.        性能有一定損耗
    & _; z2 u2 c& c2.        學習成本較高/ N, B$ @! O* e) @$ Q* U' t6 e# {
    3.        可能包含很多用不到的功能% L& }8 q, k+ u! z' B0 C% A; n1 F
    4.        不夠靈活,需要遵循框架的規範  y% ~# E" Z  l7 u5 |/ O
    5.        對小項目可能顯得過重
    ( [: P- e% T. I% {4 l& d建議:7 K" @2 b, Q- F" [% W" [
    1.        小型項目或學習階段可以使用純 PHP
    ( d$ Z# H3 k$ O2.        中大型專案建議使用框架
      B4 Q$ S5 r; a  @# ]3.        選擇框架要根據專案需求和團隊情況
    3 X. S; ]3 E& f. I( p7 s4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    3 R  ^. r! X5 w$ ?" e您打算開發什麼類型的專案?這樣我可以給出更具體的建議。, p7 X0 {9 u, E' ?7 \6 s6 b

    : Z5 |; U( q7 a5 K# e% j
    # n3 d# M5 Y; o, [2 R& O$ w, t! r' l+ J2 b* j1 N3 e0 B0 I
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。1 s3 t) C. ^# X) Z8 |
    + O- t: L, G9 N1 F3 |
    這個轉換主要做了以下改動:1 q7 s- U7 O9 _. _6 d
      C$ s5 b0 |; z  d# w
    路由結構:- y7 X5 ?* a. o$ r: G: P

    ; p3 z. I1 [9 K" |使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下- u2 w3 @2 ~, J' ~
    支援原有的 page/mode 參數結構# I( S$ @( r; o" @! K' O
    通過路由規則自動匹配到對應的控制器方法
      M: H6 u9 `. S7 D. G: |# B, \* g9 [+ u8 }# Y

    ) U2 `- d# P5 b( G1 b控制器結構:
    + B' ]: w8 _7 U$ I. ?, c" ]* G5 v+ y: ^9 u: B/ s  j# ?3 m
    創建了主要的 LoginController 處理所有請求
    7 }+ V$ o9 {+ B9 m; }7 r5 m. `) w保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    2 o' D* t, u4 V# e. p0 E# X8 A% {7 @錯誤處理改用CI4的視圖系統6 G% a0 w$ X% p' f; l' w; o* @% n

    + B9 r& @2 m0 {+ r; U
    7 E# d; X) X, V- D! D8 n類的組織:" c1 M+ |! l- Y; e2 {
    ) T8 ^, U) h* _) e+ W2 R
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    7 v( _- j% h" {2 Q2 n1 L3 i( [保持了原有的類繼承結構
    * W/ q5 m9 @3 g0 t  G改用CI4的控制器基類和特性
    * f: h) t, ]7 @9 U( @, L3 L- q! r3 l6 r& g0 c. V) p* Y

    . g8 w7 t* y4 J" {7 q) C改進的安全性:
    ' F$ H: j9 R# ]: S: |7 R5 s- n* f1 |$ u7 @, l% n
    使用CI4內置的安全特性: K- ], ^7 i' l: p
    更嚴格的輸入過濾
    . @6 @1 `4 i1 v# e1 M+ B更好的錯誤處理機制
    , ~7 u5 Z. c; x, b' m; g7 B+ r6 k, r- h
    * b3 B# m3 C' S3 }( W' B

    8 [) g( }4 C! M0 [* D( C) S要使用這個新結構,你需要:2 b! @$ j- R; K/ i8 L; [7 K
    0 @3 M1 ]9 R" K* ]2 V
    將這些檔放在對應的CI4目錄結構中
    # y' Z( t/ G5 }/ }" U確保創建相應的視圖文件
    + K; Y2 e) A" B; d( p8 ?% {配置語言服務
    2 u5 W( o  w! e: g: n' a, R9 X根據需要調整模組檢查邏輯  ]/ C, |7 T3 D( |! \* D
    , c0 H& M5 R/ R3 L
    需要注意的是,你可能還需要:
    9 ^6 P$ o$ v* Q3 n- R/ }3 g. @. s+ B
    + O: r. y' s2 ~; k# `創建相應的視圖檔(在 app/Views/ 目錄下)
    " F6 O: T2 R+ p8 a配置適當的中介軟體來處理會話
    9 j2 f/ V5 s2 w7 u實現具體的登錄邏輯7 |$ V2 c, O: X9 l5 Z
    / D! a( L7 c6 T4 a" ?( O5 [
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?4 i( x& F- o' q5 I8 n
    : ~: G  o; q! _
    1. <?php* ^, Q& ]* Z7 ?: W! o6 R$ |2 l
    2. // app/Config/Routes.php
      ' k% k( [) h; D8 ~$ {+ T
    3. namespace Config;& o4 Z$ Y  m, P& A
    4. ) S- R5 Q3 i& S; P+ R
    5. $routes = Services::routes();
      : L/ V( y- I5 |% i' h; e8 i
    6. " U  q, {) n8 P. n$ D  L7 D/ o
    7. // 添加自訂路由規則. t% W6 l8 I' U. G4 o2 m+ S" ?
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 O8 u  e* G( Q/ a  E
    9.     $routes->get('/', 'LoginController::index');8 j- J# d1 c! T4 N3 g/ I6 f
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');! q5 B0 M+ p' ~  g, D7 q
    11.     // 默認路由處理& n( Y6 t) R. J+ V' U" S# m. l
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');. Y9 ^) Y4 x' J" t+ o! |
    13. });
      ) i! B( Q8 @8 ^7 {! k! K
    14. + @' T6 p" |6 ]/ \" h8 g0 n- X
    15. // app/Controllers/Login/LoginController.php& k9 j+ R# J" n3 D& E4 z* v$ a% z* ?3 g
    16. namespace App\Controllers\Login;: R' e- F! E9 n4 {1 d
    17. 6 I5 Z$ s; {1 a$ I
    18. use CodeIgniter\Controller;
      ) s& H. x; w4 x. o! T) w
    19. use App\Controllers\Login\AbstractLoginPage;: k4 W7 G6 O: z3 t/ k, E
    20. 1 N( w/ p7 e" {9 Z' G! v
    21. class LoginController extends Controller% n3 j3 T/ @5 {* A
    22. {1 Y) v2 c5 z9 x- w7 u: P$ b
    23.     protected $pageObj;$ t- v; x! w) Q; m5 C
    24.     protected $LNG; // 語言物件
      . ?$ S, u1 `' x  ^

    25. % M' Z/ }& F/ v* ]0 o5 c9 s0 k
    26.     public function __construct()
      , y0 m$ B9 ?- Z' A! Z; I
    27.     {
      & U3 R* V6 q. `4 E! j7 N
    28.         // 載入語言檔和其他必要的依賴
      6 z1 `" K, ^9 N# Q7 ]0 S, }) \+ y
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務7 @3 j# e1 _# h, T. f
    30.     }( }; }; q+ K+ k
    31. 8 w  F/ B# X6 E, [9 a. [# o4 N
    32.     public function index()
        X* W; k* c1 U4 d8 X
    33.     {
      + C* o/ u) k" N7 H
    34.         return $this->handle('index', 'show');  g7 }5 ]5 `: ?5 c! f
    35.     }) z* X' _3 B8 F6 E; S, V! N0 a
    36. ! L: n8 Z) V6 b/ ]/ W+ z& Y; Y* Z
    37.     public function handle($page = 'index', $mode = 'show')  q8 X: C  o8 A: u  j9 w- ^
    38.     {. m# F' x7 ?; W& ?
    39.         // 安全過濾頁面名稱* ^# f3 A$ \8 S3 d4 t, K
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      : R, b4 F7 v( Q5 t
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      0 G9 \3 F* ~4 d! ~) W! R) {8 t, z
    42.         2 ]3 c1 Y1 H" O: @2 o
    43.         // 檢查類檔是否存在
      7 f& U# w: H+ U9 t% x
    44.         if (!class_exists($pageClass)) {
      6 A, Z3 s) p4 w2 R  L
    45.             return $this->showError($this->LNG['page_doesnt_exist']);. m( d5 @. Q: [) _* V
    46.         }
        q7 t- h* T4 v; }8 @% R4 K$ I% J1 {
    47. 2 ?9 c1 o; L# h7 R/ v
    48.         // 產生實體頁面類
      $ Q4 D" U7 f3 Q3 [6 x% m
    49.         $this->pageObj = new $pageClass();0 K( @; |$ _( ^- s% k
    50.         : W. l3 @. ~- h( \/ ~: S  q3 j/ |
    51.         // 檢查模組要求
      & l% q7 L8 Y' ~2 p
    52.         $pageProps = get_class_vars($pageClass);
      # ^1 H. P9 w; z6 q% v" q
    53.         if (isset($pageProps['requireModule']) &&
      : v4 j9 b# f! V( |# [* s* y
    54.             $pageProps['requireModule'] !== 0 &&
      4 S5 J/ L/ P& P+ E- ^2 J$ ^, {
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {1 J* i/ {0 D' [
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      " e9 c( |5 Z; v: X/ }" O. a
    57.         }
      + W% Z. |0 a( n. U
    58. 5 e; Y: @7 U% p6 ^7 a5 e: s, S
    59.         // 檢查方法是否可調用
      0 P( i  A3 K- B
    60.         if (!is_callable([$this->pageObj, $mode])) {  L: U# R; n2 u; n. P" F3 v
    61.             if (!isset($pageProps['defaultController']) ||
      : m! W/ g+ e! i5 e
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      ( w) ^2 }) x5 ~7 J
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      ! U" r/ s1 u& @" H& P
    64.             }  v8 C* b) `$ D: h( ?$ T
    65.             $mode = $pageProps['defaultController'];' h+ J0 W& ]' e! w
    66.         }
      7 v5 T$ F, g5 D/ f- h
    67. 6 c8 S. t$ r+ D/ H
    68.         // 調用相應的方法
      ; K) G  W: j" O! a2 g: J& t
    69.         return $this->pageObj->$mode();
      % C0 d5 \* F0 N6 F
    70.     }5 L/ ?6 J) Y) ^1 J. p( I

    71. 9 R/ x6 u# {3 y: `  R( d$ ?
    72.     protected function showError($message). H: @! x+ o+ I
    73.     {
      : Z, l, k" Y9 U; L) m
    74.         return view('errors/custom_error', ['message' => $message]);
        o  Y0 u- l5 B( O* g! f/ @% I
    75.     }
      $ J( ]  s( J; n1 ?# n+ ?

    76. ! O$ g8 K% v. Y4 W. f' c$ t3 W
    77.     protected function isModuleAvailable($moduleId)
      9 ^0 a, v/ c3 _, O& B& R8 i# a
    78.     {
      : q0 J6 w# x3 V& I6 G
    79.         // 實現模組可用性檢查邏輯; Q5 I. g, n' t  @
    80.         return true; // 根據實際需求修改+ i5 d7 e7 H2 T+ y2 D7 b" `+ u
    81.     }5 e( X* C! E. N* v" `/ H9 G& e: S
    82. }
      + G5 q0 l. ~* s

    83. % e7 ~8 T7 O/ \; Y* d* w" F# s
    84. // app/Controllers/Login/AbstractLoginPage.php7 x" K4 S2 e% F( i( C1 t
    85. namespace App\Controllers\Login;! d& ]' g0 E) ]! G" i

    86. ! `* T7 \: }6 X' x
    87. use CodeIgniter\Controller;
      ' y/ G) K. g2 _
    88. 1 n. V  c7 x, _
    89. abstract class AbstractLoginPage extends Controller
      ; Y. O  m( w5 v0 k" A$ h* z$ W$ X% ?
    90. {
      2 M+ X7 A0 a8 m5 j2 F5 ]
    91.     // 實現基礎登錄頁面功能
      9 l3 Z  q* E) ]+ }* R3 g
    92. }# J" y7 s/ G6 q3 U1 i3 i
    93. 0 W6 P) [$ n8 M7 f' m5 j
    94. // app/Controllers/Login/ShowErrorPage.php
      ( [* P7 [. e- C  {3 z" f
    95. namespace App\Controllers\Login;
      ) E0 E' N2 P8 _/ C, ^7 G

    96. . v3 n/ x$ E6 P# q) B7 C( m
    97. class ShowErrorPage extends AbstractLoginPage, s; @  D5 ~$ Y
    98. {# X5 A) Z0 y3 _0 [7 x
    99.     public static function printError($message)
      7 ?1 D9 s' x, O8 l' R( C" ]& {& Y# ]/ Y
    100.     {
      % s! d4 t1 v4 T( n
    101.         $controller = new LoginController();$ o5 k$ }) s+ g/ Y
    102.         return $controller->showError($message);
      8 w8 c# \0 z7 Z; {1 B' G* F3 b- G
    103.     }
      0 U4 I; r. K9 ?! h3 j2 m
    104. }* [9 x$ Y/ b* J& x4 J( J

    105. / b8 f) d8 }9 W/ s3 A
    106. // app/Controllers/Login/ShowIndexPage.php
      , |( }( k1 ?' B7 j6 L
    107. namespace App\Controllers\Login;
      * N8 {) f/ M. s& B  ^
    108. 7 _" P" W+ j* D+ t' X8 @7 s
    109. class ShowIndexPage extends AbstractLoginPage
      % o5 v, [* n% |% W5 k
    110. {7 ~) ]1 m+ U0 g# x- m
    111.     public function show()
      # @: M7 Y4 B$ N
    112.     {& b3 i" O* }! }
    113.         // 實現登錄頁面顯示邏輯8 K, M& J6 S1 o+ l; K
    114.         return view('login/index');
      7 w# U+ x7 m, A. {( V- q5 ~
    115.     }4 a2 C* m- t- |% Z+ n+ N7 n
    116. }
      3 E& }. _8 K  K5 {. W$ e
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-5-12 14:03 , Processed in 0.012224 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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