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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14187 / 14187

生命值:5%

升級   100%

  • TA的每日心情
    慵懶
    13 小時前
  • 簽到天數: 5712 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致% y2 ]- ^$ b: O  q
    AI 就是站長的最佳幫手。
    4 ?' A' Z2 H9 V9 D9 e& L) b( h$ R
    2 X' @! ^( b$ s3 [
    7 I: I; ~; {* q+ T2 J! `9 ~這裡的「新架構」是指後端的架構會有大變化, Y) F* J$ e# e/ D: c$ c: F
    但前端的 UI 介面玩家不會感受出來有何不同8 _/ G+ S9 A7 e5 {; q

    9 V2 e/ _' }( w! F7 f. t. k) H- K7 Y" y4 c: V
    為什麼站長要改成新的獨家架構?
    " u5 V8 y7 W8 q1 s3 q( c就一樣由AI模型來解釋清楚吧。% X- N. w6 C' S$ M. ^" g  C- M

    ' m  t3 |" a/ P4 ~. c7 y3 b+ N$ O* `/ z
    讓我分析一下使用純 PHP 和使用框架的優缺點:* G$ ?& y) u" f5 R
    純 PHP 的優點:
    ; ^' o/ Q6 z$ \6 a9 F1.        性能較好 - 沒有框架的額外開銷! k: y& Z6 a( v8 A  e( B
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    * M2 ^! O5 P2 [8 J. a3.        更靈活 - 可以完全按照自己的需求來設計架構
    ; ]$ `1 Z% h- g; a- {3 y4.        代碼量小 - 不包含不需要的功能模組
    / S& p6 z$ S9 o  g7 {' |! V# O5.        適合小型項目) W# M/ Q2 M) m; w
    純 PHP 的缺點:& s" H0 t$ m5 g
    1.        需要自己處理很多底層細節0 `) o* a7 {2 p7 ?; \
    2.        代碼複用性差
    : q+ N/ U8 x0 J% e( q4 _# Y3.        缺乏統一的開發規範! n' `! N2 Q" c  h
    4.        安全性需要自行考慮和實現
    3 f8 ]' X* r. k/ X5.        開發效率相對較低" a0 k* S" k! T/ @
    6.        維護成本高
    6 r. Z7 G3 z5 S0 j+ M使用框架的優點:
    2 v7 H3 w! y! }% ?& I" k1.        開發效率高 - 有現成的元件和工具
    / H" B' K3 |! L7 C* s  e2.        有完善的安全機制. I8 z9 |' ~$ a3 N
    3.        統一的編碼規範
    ' @2 t' J/ Y5 C3 l4.        易於維護+ J3 V0 s0 z& a2 D& c
    5.        有活躍的社區支持, A+ h9 x2 h$ ^! I
    6.        適合團隊協作( L; n7 J( Z1 ]5 _6 |4 d4 Y. j
    7.        自帶很多常用功能(ORM、緩存等)
    + Y# h% C- U- B. ?( d% S9 H使用框架的缺點:0 {0 i) T! A3 s2 l8 p$ z: f, A0 F5 I
    1.        性能有一定損耗9 j8 S! ^: ^' M: A, a2 ?! x% R5 h
    2.        學習成本較高" X" Y. c9 E4 {. F9 y/ s. @: k
    3.        可能包含很多用不到的功能
    # C% B  y* F( I/ @2 Z) F8 }" d! K4.        不夠靈活,需要遵循框架的規範2 m+ k# }( ~* R5 g2 R* d! h
    5.        對小項目可能顯得過重! _& }' @! Q2 a1 o, n( T
    建議:
    9 B: g/ ?' c) c% [; \5 F1.        小型項目或學習階段可以使用純 PHP3 e0 I. m) V& M* U+ k8 f
    2.        中大型專案建議使用框架
    " P7 p% |% f- z7 f6 d3.        選擇框架要根據專案需求和團隊情況
    % l2 f$ S' L3 _4 Y, l8 |- d4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇& T5 o. q+ I! p9 N2 f; {, A9 D
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。6 c. Z: Y5 E! D% d  ]6 E) K; F* C: n
    1 Q" u& A  s7 N# m

    # m" H- g) S2 ^, x1 ~" B  y+ s* x8 \- z
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。0 C8 {* v6 i/ J; J9 W

    & o- [; V2 R' ^' Y這個轉換主要做了以下改動:. b  [, s1 C3 S4 J5 s) ~/ q9 Q3 K. n

      i$ d1 P* t3 O, `路由結構:0 e" K5 l) s8 z2 [% G1 v* i

    # S! U2 f  {0 E! T' ~( O使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下2 h. G( q9 }2 C! k& N- W% y
    支援原有的 page/mode 參數結構
    # g* `9 P5 l) I3 N& A8 a/ r通過路由規則自動匹配到對應的控制器方法% E3 ^# I3 X- m$ y8 S
    3 M/ G5 g7 W: q2 Q) G- ]  W& T2 L
    ' O* Q, ^  L) ?+ U# j4 h2 P" {
    控制器結構:
    7 N+ y# I" P/ v* V( B, R0 ?8 C9 o# Y4 s8 |
    創建了主要的 LoginController 處理所有請求5 a, d' z  J: Q% f
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    5 r, P. D3 E# N9 B3 ?錯誤處理改用CI4的視圖系統% I8 O- b/ O3 ?! ]
    + y( F0 d6 v7 H' r

    - ?# Z7 S* M/ I& f2 F# A5 x類的組織:+ b$ B9 A, U" l& p* e
    ! Q5 N8 a6 t5 n6 V
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    . H$ ?% ?( |) l$ i9 M6 ~7 G  B/ M4 ^保持了原有的類繼承結構
      H5 v* X, c1 n' u3 i  J& B改用CI4的控制器基類和特性  s, ~0 y1 F- a9 y2 l( F, v5 ~4 ^' R

    $ j' p6 M; B* n3 b* h4 l/ {/ h. s" C4 p! ]% M
    改進的安全性:
    3 f. s% X* h% `0 Y  a
    " I- F8 _2 `. P( K0 \使用CI4內置的安全特性
    $ ^' y, s# H: v* e8 o更嚴格的輸入過濾
    0 N! g0 }! @1 d# }- [' A更好的錯誤處理機制
    ' G8 j( Q1 d3 x1 D2 \+ j3 f
    ' x. M$ T, k# ~* o! `
    2 X5 ^+ n4 R6 ~. v& f: e
    4 X# t) E% Y8 I- w) {0 h8 u- |/ W; i要使用這個新結構,你需要:
    " t5 k4 A, V, L1 M; y& P& d: v/ _! s3 P/ x
    將這些檔放在對應的CI4目錄結構中
    ( @1 {6 W, n. o; D6 i4 @# `確保創建相應的視圖文件
      G+ c; {- m3 a8 |# ~配置語言服務" ]1 Z& _/ f8 k
    根據需要調整模組檢查邏輯
    9 w. P+ f3 Z& J
    0 a) s+ d/ V2 ~; _; V需要注意的是,你可能還需要:
    8 f# _, ^) y- J! L4 [* L: P- Q6 n  @( o) o( I
    創建相應的視圖檔(在 app/Views/ 目錄下)
    ) g! _8 l  p5 _# Z配置適當的中介軟體來處理會話% \  r8 F' V/ ~- T+ @& Z& f
    實現具體的登錄邏輯0 N4 R) n; ~7 {# T  y# [. h- ~

    0 f$ b& _0 D$ s9 H需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?9 m& a1 F) @  f9 V" p( r( u

    . v  i$ Y& w7 b! ^, u8 {
    1. <?php5 c0 O3 n" `0 n, ^* P3 o, n
    2. // app/Config/Routes.php) m$ u& d/ z$ K1 ]/ Y* p% T+ Q
    3. namespace Config;: _1 U: @% V. O
    4. 5 C' A0 Y  k* `( |! w! h# N5 u
    5. $routes = Services::routes();
      6 H  g. K  _/ ?& ^0 g: |7 S& C
    6. / J5 D/ ~9 ^. I! Y4 H
    7. // 添加自訂路由規則
      $ W( x; n* z4 D2 I
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      / }6 W4 o  l/ J( u4 ]
    9.     $routes->get('/', 'LoginController::index');
      7 J) ?' n2 r: V! Z
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ( O  i5 C' o5 M, a) L" K; m; m5 n9 m
    11.     // 默認路由處理
      8 r' r6 _8 ]3 J+ c
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');1 o/ R* X2 T( o$ k% }4 |! V
    13. });
      . p$ m9 ?' W- n& v. Q
    14. * O, ?! ^% f, P+ d7 {
    15. // app/Controllers/Login/LoginController.php
      4 U* M; x& s3 D9 i% w
    16. namespace App\Controllers\Login;
      1 w5 v7 {# a) e2 Q; }, r% k! Z) E
    17. 4 p5 C9 ]5 D8 ~0 |6 W3 G
    18. use CodeIgniter\Controller;* N# Y4 ~+ @9 w+ l# [7 @: m
    19. use App\Controllers\Login\AbstractLoginPage;
      ) U4 E& C! _# i" @& I9 v* ?6 e) ~& z
    20. 7 ?& V3 K. k; p4 \
    21. class LoginController extends Controller8 O( L2 \4 X5 V8 w
    22. {
      4 {8 y  Y+ P+ N+ q, R6 E& ~
    23.     protected $pageObj;
      ' k2 K+ n! f( J7 k
    24.     protected $LNG; // 語言物件
      . n/ j' F$ x0 \& Z+ T' r

    25. 7 l* @  c7 v+ ^2 B
    26.     public function __construct()
      ) F' m, j2 a$ l6 X) q$ `+ d% _* N
    27.     {
      6 G" P, {. {" z+ q% v7 c
    28.         // 載入語言檔和其他必要的依賴
      3 o/ H3 i- p& g5 g/ r$ a! O
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      / M3 y  |" O: o! B, \0 z/ B
    30.     }
      , J& Q, W! w: ?& ?
    31. 1 t+ r! i* x& P+ i9 M6 ]# n
    32.     public function index()
      ! M+ B; l$ c& @# c
    33.     {% Q4 x! x. ?4 y- V# `2 K' P
    34.         return $this->handle('index', 'show');) U( C( o6 M8 B/ [# V2 W
    35.     }+ b' c$ c! ]) r' r  \! R' l, i+ @2 e
    36. 0 q( O- d' K9 L! D8 a1 _/ l9 O
    37.     public function handle($page = 'index', $mode = 'show')* c! V! W4 @# |( j6 C& @: S5 w
    38.     {
      ! j6 E' Y  h8 k
    39.         // 安全過濾頁面名稱8 f- c$ w1 G6 Z' {. H4 W6 w
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);% U! h- v6 q2 n1 H  e4 b- x
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';, y$ f, N3 @& ], N4 p) K
    42.         
      ) B- w2 A4 J. ~& ~1 }, F( K4 O& ]2 ^
    43.         // 檢查類檔是否存在! F/ I7 F+ a, F. [( l5 {: S
    44.         if (!class_exists($pageClass)) {) z! V& D9 _  ]  \" G7 W
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      ! U) `1 c8 A, D9 z8 f
    46.         }* U' Z* F0 Q+ X( ]
    47. 5 c7 i: E# s# B. M$ \1 \8 w1 E3 x
    48.         // 產生實體頁面類
      6 O9 {" e6 r% U, |0 `, K; y
    49.         $this->pageObj = new $pageClass();6 e1 W; I8 K. x$ [2 L3 h2 h( I5 ^6 h
    50.         
      ( s# Z8 d/ Z2 P  a+ I$ A5 v! n; R+ D
    51.         // 檢查模組要求
      % ?$ B5 Q! r" o& d8 _" t2 w6 }
    52.         $pageProps = get_class_vars($pageClass);
      * L7 K7 m) S7 C, S# p  J& e
    53.         if (isset($pageProps['requireModule']) &&
      $ v, I: h, l0 E" ]3 f1 h- v- i
    54.             $pageProps['requireModule'] !== 0 &&
      + F& n/ @. N6 C7 X& z
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {3 G6 e4 m6 m. ~9 E
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      ) p4 y+ t9 P+ ^2 G
    57.         }) D  Z( [3 F) z, Q3 v! [$ h, w! W

    58. 6 Y+ J' q# C& w$ O
    59.         // 檢查方法是否可調用& q8 w3 Y( X* G) l
    60.         if (!is_callable([$this->pageObj, $mode])) {
      7 W6 T  |, I% A  q0 T+ N% \
    61.             if (!isset($pageProps['defaultController']) ||
      3 ]9 U: N1 v8 s. j. \
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      1 U, b4 B' I% d# q. D& N' d8 m
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);3 ^4 c. V9 d3 }8 T# F( {
    64.             }
      1 }' p0 ~6 y+ T9 A! _; C
    65.             $mode = $pageProps['defaultController'];+ ?* {9 v: o1 C: f/ c  n
    66.         }, N- x8 {+ ?  U5 _
    67. ' c# u$ ^  Y# F* h; i: ?$ P0 u+ P  y
    68.         // 調用相應的方法3 |$ n4 [" E, k/ }8 T2 u! c
    69.         return $this->pageObj->$mode();
      * _4 e' I4 @$ d5 _0 [9 G2 v1 j
    70.     }
      ' ]/ W6 P$ \% m4 k: T

    71. 3 S/ f6 |! `9 [, v2 r
    72.     protected function showError($message)1 e  [& J. s) B. G* P
    73.     {/ T4 e' H% P9 P, D4 i
    74.         return view('errors/custom_error', ['message' => $message]);
      $ [( ]0 C- L/ ^
    75.     }8 v4 \9 I6 ]4 [$ F
    76. ' s3 B1 F' v" w7 O4 R1 b
    77.     protected function isModuleAvailable($moduleId)
      7 G$ H6 f# h+ D$ o: v
    78.     {' b( v8 {; Q0 e+ U1 A- Q
    79.         // 實現模組可用性檢查邏輯
      $ V7 _3 h  q* @' |$ F& c/ `
    80.         return true; // 根據實際需求修改
      ! N5 _3 F' E, _. r0 D  X" {
    81.     }" \( L+ K$ ?# z3 ?. t+ I$ ^
    82. }
      9 J  [. c3 j3 b  {6 S! I1 e0 [
    83. 3 C5 L/ e1 R9 f: @6 B" Z
    84. // app/Controllers/Login/AbstractLoginPage.php0 `7 ~5 x) ?- R9 b' M4 t0 G& Q
    85. namespace App\Controllers\Login;
      9 Y; N! w9 ?) p4 e0 U
    86. " n& s9 n: X. e# b9 j! q' I, d- k
    87. use CodeIgniter\Controller;5 t1 l- f; J* U9 I3 \

    88. 8 O2 A$ N- r( u3 P2 V
    89. abstract class AbstractLoginPage extends Controller4 V* x& r+ z$ E! A: s
    90. {. o* y3 o" S; _) c
    91.     // 實現基礎登錄頁面功能
      - x! q2 c( I" B0 M9 Y& {8 F
    92. }
      & [  ]/ @, n! Q# j2 {

    93. * u' Q5 x# p& [9 u4 }
    94. // app/Controllers/Login/ShowErrorPage.php/ u* y0 @4 U3 i) S0 v9 [! j' J5 q$ Q
    95. namespace App\Controllers\Login;
      6 P( B: `" q7 H, s6 N+ V
    96. * G# u0 l3 ]' {( K. S- ?' r# ^' k
    97. class ShowErrorPage extends AbstractLoginPage' y# A8 R2 N2 Z1 {- t1 c. c, Y
    98. {  J4 q6 Z9 m& @  _* O/ H
    99.     public static function printError($message)) L  \( [% K4 P9 a: w( z' N
    100.     {8 k! G: L0 E' S$ m$ w
    101.         $controller = new LoginController();
      9 J1 b6 m$ @$ m9 t; y
    102.         return $controller->showError($message);8 ]3 I- {1 h& p9 U
    103.     }+ b2 U$ d2 t, `+ \: h
    104. }
      8 e2 V& O0 n0 I, H) O

    105. # N- T% V+ V% x; E
    106. // app/Controllers/Login/ShowIndexPage.php
      3 K4 @+ x1 r% F8 [, l) ]4 Q
    107. namespace App\Controllers\Login;$ _9 x+ S( N& S. b. r0 ~
    108. # w+ c; G4 K0 {% ^
    109. class ShowIndexPage extends AbstractLoginPage- F7 \7 n" L$ N) K* D) b
    110. {
      6 o7 W4 s3 U: G3 i. t" ?
    111.     public function show()
      2 ]* Z+ M# g  P6 V0 l
    112.     {9 v% _1 n4 C8 s9 V
    113.         // 實現登錄頁面顯示邏輯- G! Q# K3 w" X( z: Z- j
    114.         return view('login/index');
      ( P- x7 H5 f. Z5 T! |
    115.     }- I1 z" l: U) y! q) A8 g
    116. }  Z) k" Z5 G; P3 \# Z. i* E
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-9-18 14:27 , Processed in 0.017304 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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