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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15133 / 15133

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    + o+ s$ \( @  B- x+ i4 r" \AI 就是站長的最佳幫手。
    . l- B8 w& u+ O5 S/ M. |9 g
    + S4 J4 f* X& E2 l+ ?& }
    : g& b1 X- Q/ \3 m$ d這裡的「新架構」是指後端的架構會有大變化
    3 ^0 H- T+ M. b' a6 c但前端的 UI 介面玩家不會感受出來有何不同5 G% x+ s  g* B/ X; N
      L; g0 N* p' H- [
    . M6 [& [5 w3 r$ F! l1 R# X
    為什麼站長要改成新的獨家架構?
    ! c& U9 o3 i5 _" `就一樣由AI模型來解釋清楚吧。
    ' R" V6 H' Q- q, P% @! q1 v% R; @) l2 y* O! t
    ! o( u; K' b: }% J8 C
    讓我分析一下使用純 PHP 和使用框架的優缺點:, Z( G# W$ B  N$ A
    純 PHP 的優點:/ t' j4 O: X& K0 e+ v
    1.        性能較好 - 沒有框架的額外開銷
    + W1 P6 v4 i% V2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    0 S0 N' M$ p3 A1 D  ~8 j: g3.        更靈活 - 可以完全按照自己的需求來設計架構/ g6 s) Q( ?" [" J. W% }! c/ Y9 c+ W
    4.        代碼量小 - 不包含不需要的功能模組
    3 n8 c0 R" W* h9 X5.        適合小型項目2 H1 E0 N: L; x4 F6 \3 f& W3 O6 \; [
    純 PHP 的缺點:
    " d5 B* R: {/ [% d1.        需要自己處理很多底層細節
    6 f! v/ w' e' i% e* A- j2.        代碼複用性差$ ~2 x6 n: N7 q7 z4 U! D( Z7 X7 `  F/ ~
    3.        缺乏統一的開發規範9 g/ V9 [8 b  `7 j' s
    4.        安全性需要自行考慮和實現) k+ Y. M9 @. t8 e2 l' P$ w* D
    5.        開發效率相對較低
    8 U8 ~; p# f/ M4 J1 F6.        維護成本高
    0 S% l! e7 E! M0 D使用框架的優點:3 w  L$ V5 S2 b9 }4 \7 D
    1.        開發效率高 - 有現成的元件和工具; O, C# `& A( a; F7 |$ j. L# p1 x! \
    2.        有完善的安全機制$ _3 f. ]) C6 S! S
    3.        統一的編碼規範
    3 O/ r6 d: C4 z4.        易於維護
    ) l. ?9 R; L9 y4 L4 y* o8 [5.        有活躍的社區支持3 L$ D# Y& F. c# j
    6.        適合團隊協作  p, H: l& ^/ G; w4 ^- T
    7.        自帶很多常用功能(ORM、緩存等)
    4 {. Y  T6 c2 w$ }: J# s' ]使用框架的缺點:
    7 Y( o6 A' Q! e0 c& E% S0 e3 B+ R8 ?1.        性能有一定損耗; E% o7 i' u" e  w: W9 g' g
    2.        學習成本較高0 v. i3 T( R: I% ?" N) V. ~
    3.        可能包含很多用不到的功能7 Z7 C* y8 C+ x* O, j* F+ Z
    4.        不夠靈活,需要遵循框架的規範- `% f* j6 Y9 c
    5.        對小項目可能顯得過重& ^3 D# S: {) U# U6 S) @# t
    建議:
    , Q# e. }8 D1 h0 o/ n1.        小型項目或學習階段可以使用純 PHP' W: b( i/ f  x/ Q: d+ [
    2.        中大型專案建議使用框架0 T& G+ t; @- |1 E
    3.        選擇框架要根據專案需求和團隊情況4 U* \( s; ?4 w
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    . b4 ], K$ `* Z# z; ^' \您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    4 S, J2 {' R+ G, \3 ?' Z; d" D+ y% X1 T1 ?# A9 a; s, R+ L

    ' f$ o0 {( g: O$ n2 d2 w% @: {& p1 s  S, [2 R8 P
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    6 J; s8 X) \, ~/ d( f" w0 {' P3 ]- n% l! F
    這個轉換主要做了以下改動:
    ! C- T3 }8 V5 N) ~" R
    ( ]$ J7 A) R( D) m$ b路由結構:
    1 V+ D; X( P1 ^0 j# H+ A$ m  _+ i( Z
    & l$ c# O, o0 }5 J  B0 H0 l使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下( ?. i6 W- v/ m( c& _& q$ Z/ i
    支援原有的 page/mode 參數結構8 h/ }; _8 y( V. L9 r' `
    通過路由規則自動匹配到對應的控制器方法
    ' `% G% t+ |6 H/ Z) E1 n% _
    6 y  [6 g* f+ C$ v" o% C- H4 M4 |) p; R- T) H3 N! u
    控制器結構:7 ?3 ^/ |5 ]% E0 @
    % }8 D( o: `5 Y! T8 b5 u& H/ @
    創建了主要的 LoginController 處理所有請求, R8 j7 H' y3 g: e& Z6 N
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    6 B' C* g2 |) A: A5 j錯誤處理改用CI4的視圖系統4 Q( a( ~* n4 `

    1 H: I! N9 Z( I0 J- Y) _
    ( I9 w$ J; r8 H; g; r& r類的組織:; m) U7 X. i4 `4 U8 f  C4 C
    ( z( Q2 o8 a1 r
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    0 Q4 w+ g8 F/ C  H保持了原有的類繼承結構& r8 g, F; n* z( l( h( F
    改用CI4的控制器基類和特性
      z$ M% {# L5 d% q! q
    7 r/ W2 y/ d, u" ?4 w* ?0 o
    * [! H( q+ S$ A, S! q改進的安全性:
    ! j6 A9 G( n9 q9 Q6 B' B& F; ^& q0 @5 \. {* {" W! R
    使用CI4內置的安全特性
    8 t% z4 J- r+ t8 x& I更嚴格的輸入過濾/ p  ]. r& o8 o- k2 w
    更好的錯誤處理機制6 X9 v9 X) j& C+ o! Z# {; x( O6 K
    ! f: t( p. j9 X* r9 @

    & K; O. `. v# Y0 W
    ! z6 }. s% D7 F, B要使用這個新結構,你需要:
      b9 t: d0 b2 k8 Q/ ~: D- r! k$ j4 ^2 t  _9 K4 ?7 N5 Q
    將這些檔放在對應的CI4目錄結構中
    . Q- p$ {9 D; E$ O0 ]$ I# N0 {1 s確保創建相應的視圖文件
    % A0 z) l2 i; [+ \2 C9 r) M配置語言服務
    4 k( \/ w: h& Q7 N6 s根據需要調整模組檢查邏輯
    0 q! G, C& R0 D- {$ M  D' |" L0 t& I0 A7 }* `
    需要注意的是,你可能還需要:7 p# }1 j7 r7 l

    & s9 g5 m6 a6 p1 {創建相應的視圖檔(在 app/Views/ 目錄下)
    # W; {% ~; @5 ?; E  s" J配置適當的中介軟體來處理會話
    2 o/ U- v' h4 [/ q" p+ E+ K" H實現具體的登錄邏輯5 R8 E7 F- X9 s9 j/ ?, X
    4 B7 s( X# D  C, n
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    # e9 K! o3 j3 u, z2 Y" G4 R% p+ V+ M' ]; x: m. d& @; \
    1. <?php
      0 v- x  U  J: a" D4 r
    2. // app/Config/Routes.php* ~* N8 ?1 [; g) F7 R- x
    3. namespace Config;
      ; N7 _6 q7 |7 j: {7 P8 W. \5 t, P
    4. 0 I! L: e' \" h. L) `; v
    5. $routes = Services::routes();
      : g7 B/ {4 ^  M& _. _

    6. * f- n! D( Y+ M: t( @  N5 X& ?. @; s
    7. // 添加自訂路由規則
      9 R: `1 B. i* h: m
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      ; ~, M. d% U& H( }- J9 u% k; Q; U
    9.     $routes->get('/', 'LoginController::index');- ^9 w& y$ Q' p! P" ~
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      # |2 P* Z. z5 S1 X0 t. D! s
    11.     // 默認路由處理
      6 J* K( _  r4 ^' R
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      - i  h. |% Q( N& n1 ~
    13. });
      1 S4 C# C7 ]' Q, I6 E
    14. % d+ i1 d3 ^; z
    15. // app/Controllers/Login/LoginController.php
      * \, Y& d$ Q( i
    16. namespace App\Controllers\Login;
      . w+ t8 R$ y( K4 V- J
    17. : a* E1 p3 \0 T
    18. use CodeIgniter\Controller;5 O; N' }$ P$ i, B" F
    19. use App\Controllers\Login\AbstractLoginPage;3 r/ J( }, x0 q5 x

    20. , p; G* N, Y& M# O* b% Y7 k
    21. class LoginController extends Controller
      8 w4 @1 q$ E/ Q# S
    22. {- D# a. p! I% Q$ T
    23.     protected $pageObj;
      " T: E$ D( b& J( b; P/ t5 d
    24.     protected $LNG; // 語言物件7 ~: i* R( k' b! `, x. U) O2 v

    25. . y+ e: m3 F2 z1 V& S3 x
    26.     public function __construct() ( S: k  B9 k, C1 I( a" V
    27.     {
      / Y( i5 u" z  S# P) H3 f( }; [
    28.         // 載入語言檔和其他必要的依賴1 A2 A( M( l% v0 v3 u: d& [
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務/ n2 s! N2 s' p# B' s) ^6 A3 l0 H* R
    30.     }
      & ]0 R7 ?) M* G

    31. 0 ?; X; K  e) V0 W" Z3 l$ V  r
    32.     public function index()
      # m- d% d* x" }6 y
    33.     {7 s- c1 c: ~5 a9 @' h$ n( e
    34.         return $this->handle('index', 'show');
      % G" \1 U: N9 h9 \
    35.     }
      2 I5 d% R  w; B/ G9 |5 l5 C) A
    36. + ]2 J4 U- z  T, C9 c7 z6 H" `' G. v
    37.     public function handle($page = 'index', $mode = 'show')
      6 u$ I; _+ _5 H, i: q
    38.     {
      # q; T6 Q8 [( G" i2 ]" U* k
    39.         // 安全過濾頁面名稱8 K, I$ @) {/ @; U  P6 L
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      0 q, h3 Y0 t2 ]; v: ~& O
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';  H3 K- H% u0 o( a" |! ~
    42.         
      $ r) X5 m7 d0 Z( T
    43.         // 檢查類檔是否存在
      3 o" r% Y( ?3 W  _+ P( z* u# t
    44.         if (!class_exists($pageClass)) {
      ( g$ l: R6 {2 J0 u" p
    45.             return $this->showError($this->LNG['page_doesnt_exist']);+ d& W+ c4 ?$ k+ Q5 D5 K
    46.         }
      9 `% V0 d1 R: L8 ^# K8 i
    47. . J0 N: u& I+ N/ ~) L
    48.         // 產生實體頁面類
      # u# i9 d0 C! H( S1 g2 b, W; c
    49.         $this->pageObj = new $pageClass();
      ! q9 {/ s, s+ p4 f; z" w' q1 p9 c+ ~
    50.         
      ; ?" l# [7 |3 j4 ?% _% G
    51.         // 檢查模組要求& e( N) ?  z6 t# a) X
    52.         $pageProps = get_class_vars($pageClass);1 n/ I1 O+ @) V+ [$ L5 b
    53.         if (isset($pageProps['requireModule']) && 7 U( A" S; V* s
    54.             $pageProps['requireModule'] !== 0 &&
      4 P# v* d8 l1 {2 l
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {& I! D3 C( a' e1 y4 {
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      6 T' A0 t, K, i
    57.         }
      2 a9 G; |  k: {/ \: L
    58. 2 m, ]/ M2 f* S0 g/ {
    59.         // 檢查方法是否可調用
      0 P  `" I) s+ \7 g- \
    60.         if (!is_callable([$this->pageObj, $mode])) {6 c1 c" B% y& ^; _4 E
    61.             if (!isset($pageProps['defaultController']) || # x" v4 H3 ~+ [# k
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      6 z+ S3 Q5 i0 S: j  q, A0 W
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      % W+ Z1 ?# y8 x* x: I- P) E
    64.             }1 n5 d0 a8 Q- z  w3 v, L$ I) n
    65.             $mode = $pageProps['defaultController'];
      $ _& I4 ]1 u# x* z- n4 V
    66.         }* K) M0 \+ O3 V% Y. R4 Y
    67. 9 P( }+ I$ |8 K
    68.         // 調用相應的方法  F  ]3 K  e9 I* c
    69.         return $this->pageObj->$mode();
      % ~9 y* o3 ^7 G) ~/ g
    70.     }
      5 }+ ~; n8 l8 _  P1 W7 {, u

    71. ' P% M* I0 |( y% F+ h* C, n7 G
    72.     protected function showError($message)
      3 A( h) e; ]* [5 l
    73.     {9 v5 b: q' g/ Q
    74.         return view('errors/custom_error', ['message' => $message]);" ~/ b* }1 Z9 j6 B
    75.     }
      2 H& _3 _. O6 l2 ]
    76. 7 J+ l2 }; m/ F/ h4 ]. G& ^
    77.     protected function isModuleAvailable($moduleId)
      + e2 {  Q3 q7 c/ `/ a1 ?8 r# S
    78.     {8 h! E0 H5 J/ C3 |) G9 k
    79.         // 實現模組可用性檢查邏輯8 c' X& ~" i" h- `' t
    80.         return true; // 根據實際需求修改
      / v' \) V7 \9 Z7 `7 \
    81.     }* W4 j+ r0 j' S$ G" w. O
    82. }
      ( |4 ^4 O4 }% i* W$ t
    83. / B) U4 h: N2 z/ C8 G- w  |' a
    84. // app/Controllers/Login/AbstractLoginPage.php
      7 _$ [6 i1 U0 a6 _& f; e
    85. namespace App\Controllers\Login;
      % e7 m6 G& p& q5 r; Y2 s0 C

    86. 5 A# M. c- K; v9 r
    87. use CodeIgniter\Controller;5 X4 H6 @2 {% q+ z) l

    88. ' q3 F* j8 l5 W# e4 {7 T
    89. abstract class AbstractLoginPage extends Controller
      + l7 N# U. J* ~. z7 W$ l+ p
    90. {* h8 a) I7 b% O) [# j/ o
    91.     // 實現基礎登錄頁面功能
      8 G1 Z$ s% ?1 R) y0 z  M; d0 h
    92. }0 f5 t) w4 e1 z  j! ]4 n6 j3 i, s

    93. 2 J: T  Q: f2 I' X
    94. // app/Controllers/Login/ShowErrorPage.php
      . h) T7 W% \; y4 j( |
    95. namespace App\Controllers\Login;
      # |2 O0 r) i% F
    96. 8 ?8 G6 [: @8 F4 s& m  B( ?3 C0 }
    97. class ShowErrorPage extends AbstractLoginPage
        L1 S& {0 j5 H9 l; X( Q* J
    98. {
      ' i3 r  X+ j) H3 k% _
    99.     public static function printError($message)7 {) s4 r! R; A/ A& N
    100.     {
      - j4 n+ R* n) O+ A  B
    101.         $controller = new LoginController();( r; z4 ~2 S( |) }- x
    102.         return $controller->showError($message);" t/ k6 w6 |4 o9 I  N8 |( \3 Y  P7 d
    103.     }
      0 R4 @5 O  x8 S) X# S  J
    104. }
      # [6 }7 J9 P' z- u+ p7 [

    105. 6 }- p  J7 Q" d
    106. // app/Controllers/Login/ShowIndexPage.php6 r* X% Q8 z+ `* Q9 l, S! [$ \  q8 ~
    107. namespace App\Controllers\Login;
      * d! l# ^' }/ @+ f' K* q

    108. 1 f9 U8 X& `- i6 Z6 r8 L
    109. class ShowIndexPage extends AbstractLoginPage. c5 ?* @/ V+ k! t! c
    110. {
      1 @* }" Q1 P9 Y- |$ S: I, u7 W- o
    111.     public function show()
      ' g2 j8 D5 y6 ~/ k* g
    112.     {! Z/ e# x1 ~* H9 ]& O7 g
    113.         // 實現登錄頁面顯示邏輯2 a: K- F/ H3 G+ x, k
    114.         return view('login/index');
      ( Z, o% P& K3 ?9 P5 s, l/ V! R( v- G( W
    115.     }! g& Y! N# R- j* {
    116. }, \; {$ c' `# y1 ~7 |( S
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-9-11 09:41 , Processed in 0.012581 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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