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

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

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14449 / 14449

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    ! u- f' q# _7 U2 c+ P, SAI 就是站長的最佳幫手。! G1 w3 Z  O3 u4 r! W% ?
    ( X+ J' S, s/ Q1 f! m% w

    3 k$ `* A) J& X這裡的「新架構」是指後端的架構會有大變化
      f& m( g7 k$ |/ L2 K但前端的 UI 介面玩家不會感受出來有何不同
    1 ?% w1 a9 z0 r+ |) Z( g+ z* n+ U. y. `" V$ `6 S: u8 T" T' [

    + d) k# y0 e% X, C5 y  ^3 W$ E為什麼站長要改成新的獨家架構?
    4 J% A" X( t8 X就一樣由AI模型來解釋清楚吧。# x$ N0 ]4 ]) Q, N

    $ ~. c+ }+ Q# P8 W, _: }9 v: B! r. i' N* s, f7 x% i- P0 I+ Y2 Z
    讓我分析一下使用純 PHP 和使用框架的優缺點:. o: W+ L: n7 Z3 o( Y& A8 e
    純 PHP 的優點:
    % ]$ J3 N$ ^) \* x  p; E5 x1.        性能較好 - 沒有框架的額外開銷% |( v4 J, B# ?; n, b5 ~
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    0 O" b( @3 G- b% |3.        更靈活 - 可以完全按照自己的需求來設計架構
    ) Z! g, _- L8 k' C$ C4.        代碼量小 - 不包含不需要的功能模組( Y1 s. ^2 d- ]
    5.        適合小型項目% s! c1 x: B  F$ G& Y
    純 PHP 的缺點:# y: q- n/ d) C9 o) [2 P' `: j- t
    1.        需要自己處理很多底層細節& ~& `0 j: f- o# Y  W$ T
    2.        代碼複用性差5 Z1 {8 }  c2 z3 k$ ]& H+ L! A
    3.        缺乏統一的開發規範+ Q) @5 |6 R1 F9 ~) F
    4.        安全性需要自行考慮和實現
    . Q# ]% H" r! }) w( z4 b5.        開發效率相對較低
    % _; g  g* G: K! n" W) @6.        維護成本高8 {! O; P2 ^# b6 ^3 A- m/ {
    使用框架的優點:' ?) k7 h! C6 I% Q/ u  r* l5 x
    1.        開發效率高 - 有現成的元件和工具
    " T  s+ |* X& X. o2.        有完善的安全機制0 k0 i0 y0 Z; W! e
    3.        統一的編碼規範
    4 t6 Y8 d* O, x; B1 x. U4.        易於維護
    1 j; H. m" ?, f# [  H) K; m5 @5.        有活躍的社區支持
    ! ^# l4 \  x) b( Z# O6.        適合團隊協作
    3 m. Y$ b7 ]& P0 ?1 d; |7.        自帶很多常用功能(ORM、緩存等)& m, ?# c% p' w
    使用框架的缺點:
      m* v- X3 |8 V/ ?+ ^0 i1.        性能有一定損耗# s0 p. }/ ]: u( Y3 A2 v$ i' t
    2.        學習成本較高
    1 G1 h1 U6 D1 ]5 k3.        可能包含很多用不到的功能
    & R! @- Q, `1 Y& G4.        不夠靈活,需要遵循框架的規範
    , @( `1 Z2 G2 U- r2 O/ Z& E/ `8 M5.        對小項目可能顯得過重* v7 G8 `. F9 B
    建議:
    * o4 H; |- f( J4 V6 x9 l* A1.        小型項目或學習階段可以使用純 PHP
    $ U& s( d, G+ B; K6 d0 e2.        中大型專案建議使用框架/ z6 A; n$ j1 P
    3.        選擇框架要根據專案需求和團隊情況( V+ L! i+ `, ^# f( a0 T
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    7 e# I$ o6 t) R" U) x7 S您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 [4 P2 f" G6 R! E% ^. _

    4 N7 t* [' a- \9 K7 j! }$ D" W2 c
    ) H6 q5 r! b; T2 h* r" \+ ~  b8 S4 n! k- M3 q# c2 I
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。, S: n8 Z9 h' W9 Z/ w6 E# g. q
    : {" k( m- z) C* _6 T4 z. i* a' Z
    這個轉換主要做了以下改動:$ g: V( o! v4 m

    ( _* E1 w5 p7 v# F路由結構:
    - Q. c  t- H. p/ e
    4 H( c# f7 G( t9 T# v使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    3 Q3 L1 Y( e( o2 U( y4 b. ~支援原有的 page/mode 參數結構
    + O* g' Y; J9 H通過路由規則自動匹配到對應的控制器方法
    8 a2 g/ ]; B& L' m7 `7 h) h+ u4 o/ i3 u! @- Q4 B# R
    0 J* k* Y! Z8 S4 E  t
    控制器結構:
    6 o: L6 f7 Y8 _6 |5 M% f. \) R# Z; C# I5 |. i
    創建了主要的 LoginController 處理所有請求/ A6 W/ n: @4 U$ n
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    3 ~- ^- U; @  ]( w3 Z錯誤處理改用CI4的視圖系統# W$ a2 a! ?+ J: m7 E5 o

    * r: L1 x! a) l& ~+ y9 o1 }
    0 t; w) G9 D4 E! Z/ c7 `: R類的組織:
    ! N7 J8 O" L$ G3 ^
    ( _+ j3 {* r3 b; Z所有登錄相關的類都放在 App\Controllers\Login 命名空間下* y, L$ J) M5 s: t6 G
    保持了原有的類繼承結構
    5 |2 E& T8 l+ r5 ~8 ?4 M7 @改用CI4的控制器基類和特性; j* ^: W% c) J; D7 R
    . I5 C' ~* S- T! j9 g( q0 ~
    ) N4 j5 t  }) u- v
    改進的安全性:$ E* U: y- h& ^+ z# J3 o0 L6 C, m
    & j8 b% {, L; G. {9 w' q
    使用CI4內置的安全特性
    + p" T% [* R) ^& k, s, u% l更嚴格的輸入過濾' Z( `' n9 b* b! P' l
    更好的錯誤處理機制
    . q0 t6 v$ e4 I. ?9 ^+ b
    0 n5 _" r" f4 x* T
    5 D6 d4 E' F; M; @
    5 l% Q1 n- O- s要使用這個新結構,你需要:
    ! N% g! D, K/ j4 U: L, b2 l$ f* ?. z' k; u- L1 i
    將這些檔放在對應的CI4目錄結構中7 Z, J# q7 h( {$ A
    確保創建相應的視圖文件
    4 Z; b# ~( H3 l& j# J% K/ N& Q配置語言服務. }- }. p$ t7 Y- z
    根據需要調整模組檢查邏輯8 A1 C9 j1 _- \" h! k' c  L

    - W; D/ R  G3 C需要注意的是,你可能還需要:
    % H+ A4 t+ [; d- g
    6 _/ _) V' t  H0 a( N6 i+ i# g創建相應的視圖檔(在 app/Views/ 目錄下)
    & {3 C9 |5 g) @% `6 R& b8 n, T3 l配置適當的中介軟體來處理會話
    . h8 m# h+ p/ J/ c' ]/ B8 S; S實現具體的登錄邏輯
    - l1 S( G0 f& \! U
    ' }2 b; ~8 ^9 `8 f' c: t  t& x需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?) Z% T8 v2 o, {' }# U, \; L

    6 \" F/ _8 s2 V) u
    1. <?php
      ; m  V/ Z1 T0 T. F. e
    2. // app/Config/Routes.php
      4 Z: H8 }6 s& {% y. H
    3. namespace Config;
      - g) r6 c2 v* F) s0 V  s

    4. ; F5 I0 f1 ?$ s7 |+ [2 M2 f
    5. $routes = Services::routes();% g$ T* U9 M  @2 C3 `6 \
    6. & L: g  X& `8 V6 v3 U3 O
    7. // 添加自訂路由規則
      2 R( F, r# ]% c9 z! N2 w1 Z
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ! K- V4 k; z( }2 h
    9.     $routes->get('/', 'LoginController::index');, C* v2 f7 @) j( i: V9 R9 P
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      5 G4 c) d2 [" O) o
    11.     // 默認路由處理6 G$ d- r, d( M$ E  r' O
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      2 o* H5 S5 U8 t( P/ s# d2 G- z
    13. });) v' N4 ?6 x7 y
    14. # Q$ s4 B2 [3 h7 E0 i, D, Y8 S
    15. // app/Controllers/Login/LoginController.php0 Z6 y: U$ l- L# ^9 r. ~1 w+ I
    16. namespace App\Controllers\Login;
      5 X! X" c# K/ e( }& M
    17. ) L: ^4 f9 m- L3 {5 P; \- U
    18. use CodeIgniter\Controller;' n0 `0 j' ]- t. G
    19. use App\Controllers\Login\AbstractLoginPage;0 w* Q) Y. ^- M' x! W2 _: H$ N
    20. 7 ]- F0 x+ R' h, `+ {: [% _! @
    21. class LoginController extends Controller4 O7 H7 \: \& Q  K
    22. {
      7 _* \* e! ^3 @7 f& p% z
    23.     protected $pageObj;
      6 [4 l  d3 O1 j& O
    24.     protected $LNG; // 語言物件9 ]3 B( N) ?2 m- w* ?; m# r
    25. ' s5 S1 p- J  n
    26.     public function __construct() + Q  K5 s) P+ R- n+ _: b+ w
    27.     {
      0 a9 |& f. {7 y' f( b
    28.         // 載入語言檔和其他必要的依賴- b' ?" Z3 i8 ]2 k& k
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務. F1 h# k7 D" w( V* d
    30.     }; T3 ~* C" x- c  V! M

    31. 9 g' N) {. }! v6 _) ~
    32.     public function index()
      " z+ p( i& u5 H
    33.     {
      2 i& v0 f9 t( M4 I7 ^
    34.         return $this->handle('index', 'show');
      : m5 Q2 q/ z" @$ ^
    35.     }  a( r" r9 j) O1 X

    36. 5 ?' l3 N: C, Y7 p3 I4 }' c  w
    37.     public function handle($page = 'index', $mode = 'show')
      - u( _3 B/ o0 [- M3 S9 I' I( g# A
    38.     {7 r7 j% b/ `% w
    39.         // 安全過濾頁面名稱
      . a  \2 y7 W+ B7 V% p
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      7 X* ?; F5 h1 M' {* W
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';( |: [, B) Y4 g% ?0 o# g/ W# T% }" a
    42.         7 P0 e6 E# T  o; M; ~6 ~5 u/ d
    43.         // 檢查類檔是否存在% [2 U" i; E; K: u
    44.         if (!class_exists($pageClass)) {0 b+ T% Z$ I- s" c  r. D
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      5 {4 w, N4 B3 e' K. D$ s
    46.         }% P0 H# ~; y2 }& f) k) T

    47. 2 _9 f! O$ [) H5 ^& I  b
    48.         // 產生實體頁面類
      6 d5 V$ m% G1 F  z$ R2 [! q: P
    49.         $this->pageObj = new $pageClass();
      , b6 i) H4 y6 q/ M. U3 Z
    50.         : J; x; I  s2 `3 U' u
    51.         // 檢查模組要求
      # P3 ~8 g, F  a4 e- A8 s
    52.         $pageProps = get_class_vars($pageClass);
      6 q$ i% K( i9 n# R; Y
    53.         if (isset($pageProps['requireModule']) && $ P+ J$ F8 C: z2 H$ f; x* h, f
    54.             $pageProps['requireModule'] !== 0 &&
      # i; x7 L7 [3 O( M9 f7 k; _
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      ' b# X3 ?6 S$ }
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      & f" b8 C& U) V+ C; o; \9 p2 @
    57.         }
      , u6 `& k7 W4 Y: d
    58. 8 d( \: o1 d) J5 P) A
    59.         // 檢查方法是否可調用1 `/ ]; ?: _7 l/ V; D8 m
    60.         if (!is_callable([$this->pageObj, $mode])) {
      5 g+ D6 u$ T) _7 I8 @
    61.             if (!isset($pageProps['defaultController']) || ' E8 a7 N! z# F; A, r
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 V( u# U. I+ S7 @7 ?( M
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);- C: C2 L" K% }
    64.             }
      9 q7 F. @" u' T9 ^
    65.             $mode = $pageProps['defaultController'];2 p) _4 d0 C- N! ?. i1 c' @
    66.         }% E# N: ^( C2 C' Y! c
    67. * [- T: l! s) e' R& i
    68.         // 調用相應的方法! n* R$ f( c3 ]8 Y& T
    69.         return $this->pageObj->$mode();
      6 F! o7 ]6 g6 N9 T, e
    70.     }
      . t: v5 ~7 Z8 E* M. a7 P

    71. ' b7 o% Q4 j5 `: r% s& L( x. ?
    72.     protected function showError($message)7 a! c$ ?! q, \) G' E( W3 k' D
    73.     {9 a. E1 n5 U0 S" g0 Q9 K
    74.         return view('errors/custom_error', ['message' => $message]);- n; y  E* e7 U
    75.     }' Q  ^; z% D; \, W
    76. 2 O* T- u8 d' Y( |( q( D
    77.     protected function isModuleAvailable($moduleId)7 ~" j: H1 o9 l9 N5 B& m
    78.     {1 n; a- m$ P$ Z9 W  h$ g9 s
    79.         // 實現模組可用性檢查邏輯9 E* ?  Q# R0 l
    80.         return true; // 根據實際需求修改
      0 z( u# I1 l. @4 j7 I
    81.     }
      $ y' z& H$ q  T' D- o& q8 |
    82. }
      5 q# u) u$ ?" |
    83. # U9 w0 C2 C  F( p+ g
    84. // app/Controllers/Login/AbstractLoginPage.php
      1 [: Q# G  D4 |. e
    85. namespace App\Controllers\Login;
      # [' w" {* ~; p, R" x
    86. $ C# k6 }" V) t* h
    87. use CodeIgniter\Controller;
      8 A0 P6 ^" W9 y* V/ X% _1 Q

    88. 2 I' w' e% {. s7 P# P) ]
    89. abstract class AbstractLoginPage extends Controller* P" @1 J; p+ {
    90. {
      ' J# B; P: K( q5 a+ r; |" y
    91.     // 實現基礎登錄頁面功能- Q: }! O! K! b, |1 Y3 N, f
    92. }, ]+ v# b: b8 S& P

    93. 5 W+ ?. E1 [) B1 A
    94. // app/Controllers/Login/ShowErrorPage.php
      2 l1 r1 M7 Z  b* F& R# e7 S" J1 O
    95. namespace App\Controllers\Login;4 z1 ]0 Z% J) N, q1 W, `7 F" G

    96. . p& v/ P2 Q6 m* a3 ?
    97. class ShowErrorPage extends AbstractLoginPage
      5 ^1 _8 m/ x7 i
    98. {( b5 J4 q5 w( j. o
    99.     public static function printError($message)- C& _+ E% z9 `  O! v+ \
    100.     {+ M  v( |* E- C7 h! w* `% [5 @
    101.         $controller = new LoginController();
      2 m' c( ], m. F( q* J4 _
    102.         return $controller->showError($message);
      3 b, Y! T- r& Y# @% Q* t- {; I
    103.     }/ I5 t: J! t' P! `$ v) Y7 L1 ]. L. S
    104. }
      + Y9 G7 Q" W0 z7 M+ F

    105. 1 X/ i5 y$ Y- Z3 e9 I$ Q# s5 _
    106. // app/Controllers/Login/ShowIndexPage.php
        W% x5 X/ V+ i) Z
    107. namespace App\Controllers\Login;0 Q) \6 f2 K; z

    108. 3 }, ]$ Q8 s  q) U0 P6 }7 b
    109. class ShowIndexPage extends AbstractLoginPage  `4 ]. g. q. x: s* a
    110. {/ ~* U  }; j! Y0 D
    111.     public function show(). ?3 V( f* R, m0 X
    112.     {6 E: w% f5 U8 f
    113.         // 實現登錄頁面顯示邏輯
      $ R# m# T3 b: Z8 V# C5 T1 Y
    114.         return view('login/index');
      6 Z1 [1 K) S) v7 B) T, z0 j
    115.     }- o; T+ n8 }2 C7 x3 J0 _
    116. }
      - D3 p' j+ W" ^$ X6 z9 g8 Z1 Q, @' K
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-12-26 14:00 , Processed in 0.013412 second(s), 9 queries , Gzip On.

    Powered by Discuz! X3.5

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

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