請選擇 進入手機版 | 繼續瀏覽電腦版

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

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

等級:25 - 爐火純青

經驗值:0 / 244

魔法值:13457 / 13457

生命值:4%

升級   100%

  • TA的每日心情

    昨天 00:48
  • 簽到天數: 5449 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    - P2 j, f0 w1 GAI 就是站長的最佳幫手。
    - [+ q8 B, m* N2 w3 m
    ! B- v3 Z) W; D8 D
    2 a! }3 F, F( i4 r$ A/ s2 w  w這裡的「新架構」是指後端的架構會有大變化! X; q3 c8 U' ~
    但前端的 UI 介面玩家不會感受出來有何不同
    . N: f3 ~- k$ q+ C, V! l* X, T$ }

    " t4 Y/ o. L- p2 H( f為什麼站長要改成新的獨家架構?
    7 m/ J, m/ X, z! {就一樣由AI模型來解釋清楚吧。1 R* m6 B. k. u+ g3 [
    ' p1 H" _" p8 C
    ; x8 Y* h$ v$ _" ~0 D6 _/ ^( q
    讓我分析一下使用純 PHP 和使用框架的優缺點:/ Q( [7 y; R) Z7 |7 t
    純 PHP 的優點:
    % p9 E9 X8 y0 p! q1.        性能較好 - 沒有框架的額外開銷
    7 ?" @1 a7 h% x& {2 X; P$ I2.        學習曲線低 - 只需要掌握 PHP 基礎知識% u  d) |! @# A
    3.        更靈活 - 可以完全按照自己的需求來設計架構$ r; v# N8 W% F4 n3 F3 ^
    4.        代碼量小 - 不包含不需要的功能模組$ q8 ]# k2 B, f2 r7 {
    5.        適合小型項目* j% p: {" E* c0 U9 a* U& Q
    純 PHP 的缺點:
    ; p) O' {' E( Q6 x/ i& j6 K1.        需要自己處理很多底層細節5 k! ?( `" t) S; H8 g4 o( k
    2.        代碼複用性差
    8 U2 b" {/ C5 U+ F3.        缺乏統一的開發規範
    ' _7 Z* D/ d. ^. O7 X4.        安全性需要自行考慮和實現
    - G0 D$ C% d* p2 Z/ M" f8 X5 v5.        開發效率相對較低, u) ]+ E/ R+ \2 T" r- N
    6.        維護成本高- ?) \9 S/ F0 O% @: p
    使用框架的優點:
    6 M% W1 c# W6 J4 s$ y1.        開發效率高 - 有現成的元件和工具
    # c( W& b0 V9 _  \$ l* ^2.        有完善的安全機制
    1 k6 G1 w5 p/ N: r4 D3.        統一的編碼規範
    8 l+ U% L5 f6 @& }! v1 ]; Y4.        易於維護  z) y6 {/ `1 K2 \. D) ?
    5.        有活躍的社區支持  y, m% e3 Z6 l" U# ^/ T
    6.        適合團隊協作
    ; r4 d) M  d* g* p/ V$ N5 i7.        自帶很多常用功能(ORM、緩存等)* O) Y" i8 i8 J, ~8 U! }% ]
    使用框架的缺點:
    , h5 m+ O( Q( f9 h) t0 i+ ^1.        性能有一定損耗
    ; p9 _# _- u& j2.        學習成本較高: J1 l! z/ _6 K* `
    3.        可能包含很多用不到的功能9 q% }. M' K3 D9 \7 s
    4.        不夠靈活,需要遵循框架的規範
    : j8 }/ a8 E+ T- y, E8 R) n7 N- q5.        對小項目可能顯得過重  P. M& V! x3 Z$ Y
    建議:, m( l+ U/ ~$ F
    1.        小型項目或學習階段可以使用純 PHP! J8 K) H- Q/ G( P+ ]$ B; O
    2.        中大型專案建議使用框架
    , w9 ]3 o/ i1 O3 E5 ~7 E3.        選擇框架要根據專案需求和團隊情況( Y" l) H0 Q; ~5 w$ p
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    1 T$ ?: g$ U, J; I9 Q3 [+ c您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    / _8 D  `" P6 N1 k% N: |# {4 U, ]
    5 r4 @, e/ a; i, t4 b3 h, g% n7 ?% w3 v; M5 V" C3 f
    1 F) j* ~0 Y3 |  q4 r# h
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    - C& y0 ^  C% Y5 ?; v
    ! ?( g" B; b! e# e這個轉換主要做了以下改動:! Y$ ]0 x0 {" C2 f$ `: c
    - v( k/ W" ?& E; O4 _# G7 u) W
    路由結構:
    ( ^  R' ^# G' M$ W- d6 o. W1 y0 v2 X
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    + H4 g  [5 D6 T支援原有的 page/mode 參數結構
    . r$ L9 k) R5 C" J. D通過路由規則自動匹配到對應的控制器方法
    0 V4 n0 b& p+ Q4 @" G
    5 q, a; u( q  `2 O% _4 u! B' d  Y5 p
    % c2 J% h7 W- X  F# ~控制器結構:
    ) |4 \* j7 Q- x. ^" s2 K, t, j! u$ A+ B, A' e. V# E2 j
    創建了主要的 LoginController 處理所有請求7 {. U# w+ Z' `) x  ]# ]
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範2 M# Z, S3 a+ }9 g
    錯誤處理改用CI4的視圖系統" h2 ~* }* P9 E5 @- r$ S
    1 V1 P! ~% }) |% p, R) |% Q
    ( c' R% W2 S# \& q' k
    類的組織:0 K7 X. Z* }! k: F; j
    - u. |, d7 ?. M4 Z
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    7 M) K- `* e2 S! C保持了原有的類繼承結構
    0 ?1 w, K% b/ x9 H* p( {! U' b改用CI4的控制器基類和特性
    : O9 i6 ~9 N! v& W# U' p1 R/ z1 w( X0 S! E1 K

    ! @. F: a6 s( L! i6 `& }  X6 i4 Z改進的安全性:
    : r8 k$ I/ e+ g( N) s
    6 [2 f9 c, R5 ^( I使用CI4內置的安全特性# Q1 I* |% D* ?) Q+ f( {: |
    更嚴格的輸入過濾  u) U, B% a$ G# H  X! q: i
    更好的錯誤處理機制6 N6 W: r, w) ~% H* W8 T
    / Y0 s& v. ^5 D( \

    * D) t  }. z! V. w$ ]/ {; `8 B, x2 C0 d3 n/ l+ Z! R% m* z
    要使用這個新結構,你需要:0 _6 R' b  L. L

    " o- Z5 `9 Q4 L+ q7 U! J將這些檔放在對應的CI4目錄結構中0 i3 X8 E% ?! P. r
    確保創建相應的視圖文件' S! F% H6 h/ g4 Y- G
    配置語言服務" e4 o2 m6 P9 z) c8 E
    根據需要調整模組檢查邏輯; ]" C- p# ]8 l: Z
    # ~5 `) z4 Z) X3 v
    需要注意的是,你可能還需要:; A5 ^& V$ b; V, M3 e8 n. O
    . L8 H/ f$ {+ z/ {( k( Z: @8 d3 s2 B
    創建相應的視圖檔(在 app/Views/ 目錄下)
    % M- o/ ]+ [) L% b* \* p$ w配置適當的中介軟體來處理會話
    " ^: m" g! R" d! u/ o實現具體的登錄邏輯
    # H2 b( e2 ]7 h' V7 {- r0 m! g+ q* x1 m% u8 [" [8 K
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    ( R8 `- @. e1 u; e1 q
    , B) P* t! N% q8 B
    1. <?php: }; O3 _6 F( [  R1 U1 b% n
    2. // app/Config/Routes.php* T6 b6 z9 @3 [
    3. namespace Config;8 L$ X( a1 q' H; Y5 V. z6 o# m

    4. * G+ B3 g9 T/ p* [5 W
    5. $routes = Services::routes();
      , u. T! q4 x6 E) v3 H

    6. - ^* o4 i* W1 k& i- a% A
    7. // 添加自訂路由規則& X" V0 b: C7 z% T9 }
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      4 `  \# m" K1 O
    9.     $routes->get('/', 'LoginController::index');1 H* u' N$ C: k6 Y* t( @
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ( o! ]# Q0 |$ K) }# Q
    11.     // 默認路由處理
      ( ], J/ c& l0 D) ^' }
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');- K1 D7 {- `, s% X
    13. });
      ; q$ R, E$ J) U$ R$ D

    14. ) \& `+ P- Q2 w1 M+ J
    15. // app/Controllers/Login/LoginController.php, ~; s  c& l3 x6 y) h
    16. namespace App\Controllers\Login;- Z* B% J& {. {* J7 n

    17. - N! T  j- b; P, _6 m
    18. use CodeIgniter\Controller;; k! }. p. y1 o, n/ {" k/ u
    19. use App\Controllers\Login\AbstractLoginPage;
      ) m$ V* P9 b' ?! W' u/ K
    20. # j: C) g% c$ I! Z7 P1 J
    21. class LoginController extends Controller4 g! f7 k3 M! ~3 t0 n7 M: o2 a' l
    22. {; r& I' f. i3 T8 P
    23.     protected $pageObj;: J8 M, h, g* q& K" n. b
    24.     protected $LNG; // 語言物件7 E" N6 K$ J3 E* l/ U
    25. , c4 y' i" I5 J5 U, F# W
    26.     public function __construct() 7 L) K* G# d" U& Y: Q5 b( W
    27.     {
      / c: E$ Q4 @4 X) o
    28.         // 載入語言檔和其他必要的依賴' A3 j1 t1 C+ O+ O% C( n
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      % B  R( C  [/ `3 R! K  T2 l+ y6 ^
    30.     }4 w! h6 V, k' p5 V( z+ t
    31. ( d/ r/ ?; I" u7 \# ?' f
    32.     public function index()
      - [8 ^/ g3 J) W9 i3 Q* W8 }
    33.     {
      / I5 t6 k6 b# w" h7 H9 R+ i! R8 F" v
    34.         return $this->handle('index', 'show');6 u! Y" q  \' L  Z
    35.     }1 j# \8 J( Y% |4 X: s, r' b
    36. , ?* }4 }( H% Q6 @, ^# v
    37.     public function handle($page = 'index', $mode = 'show')
      " r$ Z  |4 `$ f" _# ?
    38.     {* D1 r, F' @5 d% k: p+ ?
    39.         // 安全過濾頁面名稱
      9 W. G  ]- C: S1 l$ ^# |5 ]6 J
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);: C! B0 d+ X7 d7 _, Q& k/ H0 a
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';- }# U! N  x1 _( ]' f$ a' \
    42.           b# j: i  g8 x
    43.         // 檢查類檔是否存在  T. b) p. P) V/ r( I
    44.         if (!class_exists($pageClass)) {# P' S) Q" e2 N1 ]
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      0 ]2 E7 g& S$ m3 s. N. `
    46.         }
      1 y* u/ y3 k8 T+ U: h

    47. , v5 I; X' {( s/ q! t8 l7 v
    48.         // 產生實體頁面類
      8 o3 F+ y, Z+ {" F% z. Y; ?8 {
    49.         $this->pageObj = new $pageClass();
      % D. y0 d, o( S" h+ H+ E" k: _: v
    50.         ' F( M& g. H4 e2 X( M, f
    51.         // 檢查模組要求
      7 q% G) S& G4 _4 _
    52.         $pageProps = get_class_vars($pageClass);- b, v0 n# Y1 U# M. `
    53.         if (isset($pageProps['requireModule']) && 7 [6 C4 z6 k$ X: f+ z1 Y
    54.             $pageProps['requireModule'] !== 0 && 1 a% r& p. p1 W. }" ]
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      * d0 [+ i8 @: t0 H' q% [# [" T
    56.             return $this->showError($this->LNG['sys_module_inactive']);+ E; a3 f) H$ N) f& x& C) p
    57.         }. s& A% H6 e' n  z& [0 X3 W" A

    58. * q' _. N1 ~  x
    59.         // 檢查方法是否可調用
      5 C, x% G1 J6 P7 ^( H2 j
    60.         if (!is_callable([$this->pageObj, $mode])) {9 u- ]8 |# y" C1 i0 A
    61.             if (!isset($pageProps['defaultController']) ||
      4 M  P* n$ ^8 q
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      + R1 t- ^$ @! h% k  g" f: h
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);# ?! V. }1 P1 n1 R) s0 m0 V
    64.             }, R, x1 B4 `3 j3 m3 v
    65.             $mode = $pageProps['defaultController'];
      ' w. F0 M8 G$ ]; A
    66.         }
      " D6 Y5 w. \9 |' f  L. n* x- T

    67. $ G  K1 a: G6 u; f- G  j6 D' ^8 a
    68.         // 調用相應的方法
      " O! D; Q# c$ i+ B5 b" Q
    69.         return $this->pageObj->$mode();& v6 z& o. I; I4 h! F) _# q5 b6 O# X
    70.     }
      4 _) p  j* _( i$ Q) l
    71. ; A  X" t$ H* @$ w0 s2 t8 @9 k
    72.     protected function showError($message)
      & X4 R7 l- V3 T: `' w+ r
    73.     {
      * I1 ~* I' A/ V7 t# @# k5 }
    74.         return view('errors/custom_error', ['message' => $message]);+ N" U) V* w! v% t0 W
    75.     }8 \4 B& t$ I7 j- R7 m

    76. $ Z4 S; E9 r4 W; ~7 K
    77.     protected function isModuleAvailable($moduleId). ~7 n. f) Z. M( N6 H
    78.     {0 I4 ]) S2 O& {9 I
    79.         // 實現模組可用性檢查邏輯
      * L/ S$ [8 u3 l; y
    80.         return true; // 根據實際需求修改
      4 @, v) Z  W* }$ s  Q9 h' z' v2 Z4 Z/ w5 [* j
    81.     }
      0 D3 {3 d' j/ G& l: {! _% q5 i
    82. }  ~% G3 U5 v/ l6 H8 l) e

    83. : M2 A: v' p) y1 d
    84. // app/Controllers/Login/AbstractLoginPage.php
      + S3 x; z$ l. |3 Z! L* S+ n: [
    85. namespace App\Controllers\Login;
        ?3 g! m6 y& e) y6 N' k7 ^8 \

    86. . _1 r- ?: d& q8 M3 V& ]
    87. use CodeIgniter\Controller;
      0 z9 }: m$ R, H- c2 P# {  I
    88. $ e. |' i2 [& g/ t1 s
    89. abstract class AbstractLoginPage extends Controller
      ! G3 m$ s# b' h( [$ @
    90. {
      % q% o% Q/ B, N3 F
    91.     // 實現基礎登錄頁面功能
      * I( b9 ~8 L9 z- y" m& M
    92. }
      5 l* R- o. n0 M% J) T  D) S  V' z

    93. 0 Q* [0 a+ y; a
    94. // app/Controllers/Login/ShowErrorPage.php' F% ~3 j" q; z6 {5 I6 O
    95. namespace App\Controllers\Login;
      3 m/ n. N' h4 c' }: b% h/ {3 T# T

    96. * O. U# f* L6 A! \/ L
    97. class ShowErrorPage extends AbstractLoginPage" ]/ b  c1 Y( O
    98. {
      5 W- R: M1 U! m& ]4 g% r
    99.     public static function printError($message)
      . H9 C& b" \' p, `3 }; w% s
    100.     {
      % ^& G) i! a! D5 L
    101.         $controller = new LoginController();
      . ?( `6 ?& g$ Y* n8 N
    102.         return $controller->showError($message);
      2 o8 _! z& t8 P, x+ s
    103.     }
      : {0 z) P+ T5 p- x8 x
    104. }% d1 c+ W0 g) R6 V1 G

    105. 2 U6 @" ?- l  Q
    106. // app/Controllers/Login/ShowIndexPage.php! l2 a# I6 q' S1 W# R& n7 t  Y! W
    107. namespace App\Controllers\Login;
      0 ^- V$ k: J  E: e% K
    108. " U0 v0 F/ x* {- p' J) X; d# A
    109. class ShowIndexPage extends AbstractLoginPage' W6 Y- J! S- c) M7 T3 C- i; T9 P
    110. {
      % D) x( o. ?  r1 v/ C: l
    111.     public function show()
      + q0 a$ j1 n5 p+ z2 K1 o( |
    112.     {  m0 t1 f/ m3 F. |8 R
    113.         // 實現登錄頁面顯示邏輯6 X- s2 P0 R( v' w' e/ Y7 b" K' P6 V0 C
    114.         return view('login/index');0 Z, B1 o2 R& R) ?6 A& G; h5 V
    115.     }9 j+ d4 ?/ J% ~; b0 ]% U0 h3 n
    116. }
      : W. U, y+ i& S) n6 k" H
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2024-12-15 00:38 , Processed in 0.008789 second(s), 9 queries , Gzip On.

    Powered by Discuz! X3.5

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

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