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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14395 / 14395

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    昨天 00:46
  • 簽到天數: 5789 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致1 V/ C) S8 l3 o$ i5 F
    AI 就是站長的最佳幫手。
    ( W2 E# g8 ]- \
    9 e2 ?1 m0 y# b$ K0 E; a+ Z, Y
    7 Z7 |1 [4 ]0 g/ b4 o% z2 z這裡的「新架構」是指後端的架構會有大變化" U+ Q' z+ M7 h/ G/ l; g3 L2 @( A
    但前端的 UI 介面玩家不會感受出來有何不同' H% E- G7 B) s- [. C$ N
    ' Q  q( S: S* t# @
    . H: G; t/ A7 g% [
    為什麼站長要改成新的獨家架構?
    0 o2 C. Z- Z+ |6 O$ m* g! Q: Q就一樣由AI模型來解釋清楚吧。+ h) P+ }  }7 \% e$ }& I1 f

    - M7 e1 ~& H8 D" t4 Z
    4 l, V' B2 @6 l讓我分析一下使用純 PHP 和使用框架的優缺點:
    * x; I) P$ G$ h6 X純 PHP 的優點:' _& S7 C) g2 v5 T( p  q. W9 U
    1.        性能較好 - 沒有框架的額外開銷8 L0 P. |; j- f/ y, L4 N1 I$ C
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識' A, h- j0 G5 e  e9 C) ?
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    ) s6 ?5 G3 y1 Z: j4.        代碼量小 - 不包含不需要的功能模組
    , x3 Y+ m: S5 ]8 \. c5.        適合小型項目
    2 z7 E( m! k1 ~  _0 i2 V" w純 PHP 的缺點:7 u8 Q! U% m9 v! ]8 N  E( r+ ~
    1.        需要自己處理很多底層細節7 p# J! m' q5 V: C. E
    2.        代碼複用性差
    - S- Q! Z# s- H& \. L3 {3.        缺乏統一的開發規範( W# }$ x* K) Z' G3 t
    4.        安全性需要自行考慮和實現8 R+ U2 b% r( h0 B
    5.        開發效率相對較低" M1 m6 I$ z  l9 j
    6.        維護成本高2 m3 E4 b. ~1 z$ _" A) R, r7 a% k2 b: ]
    使用框架的優點:
    , e5 u# Z! J* I6 A' o5 n1.        開發效率高 - 有現成的元件和工具
    & c/ @# K( e6 |$ @2.        有完善的安全機制
    ; E+ d4 b) e# C! V  |3.        統一的編碼規範
    9 p7 S& Q9 w6 `( z6 }2 E- p4.        易於維護
    1 V1 G8 e: e  F1 R; G9 c- E5.        有活躍的社區支持
    - ^% b5 H) Z3 I- I+ X2 G* p5 U1 S  c6.        適合團隊協作
    ' _* q( I" M6 b- h  x2 P: }' M5 N7.        自帶很多常用功能(ORM、緩存等)5 e- j" q* k$ _8 M
    使用框架的缺點:
    " J( s: f4 j5 V5 W1.        性能有一定損耗" K3 q; v- W+ R( p; c2 h. t& y8 V
    2.        學習成本較高, j' S# ]& S/ O  k- Y9 @8 w
    3.        可能包含很多用不到的功能5 W$ Y1 K, ]5 i) P
    4.        不夠靈活,需要遵循框架的規範
    / E) M7 M1 T: F9 ?9 u% t1 r5.        對小項目可能顯得過重* ?: r- M6 N8 v, V! W, {
    建議:  ?" i" T7 V% J' v1 u2 \
    1.        小型項目或學習階段可以使用純 PHP
    0 t- v. ?9 G+ T2 D$ [0 i; {- F- l/ u2.        中大型專案建議使用框架+ |+ M( d' o5 g& S
    3.        選擇框架要根據專案需求和團隊情況7 Q1 p- J& e8 a( s1 x
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇; k! B- Y& S  R/ d
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    ' m3 v: E1 K: a4 A% A; q: }
    : a6 ~2 p' J6 e6 S' C2 k' H) n5 A" h& h& ^

    3 b  B- t% c$ \6 `我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。4 _$ V. R" P/ L' h* o

    ! m' C0 v1 O2 ~# t1 y0 `! p這個轉換主要做了以下改動:2 L3 p) b  b2 J# N7 s

    % T$ t: t0 R% k路由結構:4 v: e0 f0 Q6 A6 W* U
    / C$ v' s2 Y9 I4 v# o
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    3 c+ p, [9 b2 x6 x  {! T5 \* |8 q. D支援原有的 page/mode 參數結構
    ; v& X2 H; J+ d( y8 E通過路由規則自動匹配到對應的控制器方法
    1 m4 ~+ m, q; S- r
    0 T& B" N2 R5 S, m9 ^
    $ o, H- g: P. l& h9 [$ c$ Q( ?7 v控制器結構:
    : |0 f/ `; f' r4 i  O: s  N  B5 a* u4 _- ?. o$ T! j7 A9 ?
    創建了主要的 LoginController 處理所有請求* _: w& V) g9 V1 A5 B, E
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    ; M2 e8 t1 `( z, |- e: P. M' x錯誤處理改用CI4的視圖系統. E3 ^4 r8 e2 O+ c7 H

    * t0 J( ~- ^% m  ~6 J4 L
    & B$ Y% r- @, G: a8 [; P類的組織:
    3 N8 v' U# Y' k8 [: |8 z0 Z. d( c& ~# o0 q  L
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    ! E/ a. r2 `6 e6 H% ?  f) {5 c6 @- _保持了原有的類繼承結構
    - k( K; G& Z; d9 Z改用CI4的控制器基類和特性
    ) S, o' e6 n  w1 B9 w
    * r: l4 c6 {. [0 B& [3 |  L
    ) A9 |5 I' R/ }+ m改進的安全性:
    2 Q; \! k: J8 C' m) J6 C9 y/ G6 e  U) X4 D# S* E; x: v. `9 q( i
    使用CI4內置的安全特性) [! `6 s! {9 n% \' }9 y: }9 t
    更嚴格的輸入過濾
    ! i0 r  R5 ^, a' I4 P更好的錯誤處理機制! [) n; K, z$ t8 z
    ( ]( s* B& \6 |8 C* b! U0 l, a
    : N9 a: f! V6 e; z4 Z8 K
    + i) f0 i- D8 k) U7 v
    要使用這個新結構,你需要:
    * m' k  Z2 N0 q% z3 F/ ^& a4 _. M4 S8 |0 k) g' h
    將這些檔放在對應的CI4目錄結構中
    # U% D1 |. B' y4 f5 }確保創建相應的視圖文件2 m' I- I9 `* {' Q  W+ y9 J) x1 o
    配置語言服務
    6 M9 E% p' R! q0 E; W  {根據需要調整模組檢查邏輯
    - {4 X+ y! k% d9 @) |1 W! O) O, l- T
    需要注意的是,你可能還需要:
    7 h' s  R! Y3 {: G8 B
    : ^0 n( Z/ T- Q' n4 y創建相應的視圖檔(在 app/Views/ 目錄下)/ v& s' u  H* E8 I4 w
    配置適當的中介軟體來處理會話, `+ |) y- ~( r; D, [& I  E& {) r% u; x
    實現具體的登錄邏輯. {5 m* a0 V  l- L
    & C; \$ c8 _* H" W
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?0 x+ }% f% f0 x# I+ o
    3 b! q1 D+ o% J; C  k+ F
    1. <?php3 x( J4 K% t" S0 D/ M& _
    2. // app/Config/Routes.php4 ~& \$ H" n5 O) e; t. t0 b
    3. namespace Config;
      6 _7 @9 q& |4 g$ A  _
    4. - `4 H4 m. a' l4 w2 a
    5. $routes = Services::routes();
      7 _7 s& H* [/ b: ~8 l( f; _
    6. & U+ \, w9 F$ ^/ n/ i9 A! ~
    7. // 添加自訂路由規則
      ( c3 m" Q  l$ ?0 I- _
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      " _( \4 e4 `/ m& Q7 x( x' Z
    9.     $routes->get('/', 'LoginController::index');8 M- D5 @" p" d3 b( w+ a) j
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');& N9 z- @. k! U% Q+ l5 s& E
    11.     // 默認路由處理. E0 O7 c8 R, T
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      ; U6 n  t* b3 Q" `. Z
    13. });! D+ R  e( L; t( p. X5 j
    14. 4 R9 `" H9 W. g
    15. // app/Controllers/Login/LoginController.php4 F3 O* f  k7 ~/ \* K% i% S% v
    16. namespace App\Controllers\Login;
      % ^0 f1 y3 \0 P2 p' p

    17. 9 ?+ Q/ e, C- L- \0 h, Z
    18. use CodeIgniter\Controller;" Z/ r) O4 j' ^+ Z* l0 n* {) ]
    19. use App\Controllers\Login\AbstractLoginPage;2 ]; F0 s% z- k5 @+ L, s: {

    20. & n. k4 b- t- `( `. m: l5 V* E
    21. class LoginController extends Controller2 Q( F7 N4 k- o
    22. {
      ( M2 @) i! }" }7 H
    23.     protected $pageObj;
      0 b7 ]: b% t+ A' D) O; H: @& g
    24.     protected $LNG; // 語言物件, w1 Y# X, p! B) Q
    25. ( k* Q$ x5 g  G
    26.     public function __construct()
      $ I" j% e5 ?. p5 c# s& |
    27.     {9 y2 T% `; S/ g. {9 o$ h/ }* Q
    28.         // 載入語言檔和其他必要的依賴6 p7 b) Z! i' e
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      $ W8 {$ w' r/ k/ J
    30.     }
      + {: t' q6 Y, j. I' I. S) p
    31. & X' @+ n% {4 o6 z* L: j
    32.     public function index()
      ) B& P! s( Z" a" Q7 t7 X
    33.     {4 e5 k' d& |; H0 @0 I. K
    34.         return $this->handle('index', 'show');
      7 ^7 H7 o* [8 y7 m" G8 `
    35.     }0 t, r% t- L4 O2 B$ `4 y$ N5 B
    36. * ]7 ?' }& z; Y& H* v
    37.     public function handle($page = 'index', $mode = 'show')
      8 K0 _9 y# W! p( Q; U! o
    38.     {. A0 n5 b) _! m5 G# Q+ M3 v: V; P
    39.         // 安全過濾頁面名稱+ @6 D. Y) d5 T/ Z
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      * }9 {; n% [; L- ~; h7 K
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      ! ]- P+ x+ @- R1 H: X
    42.         
      9 o5 C7 C9 T( [0 g1 X) Q# P! Y
    43.         // 檢查類檔是否存在
      3 ~9 A- ]/ |5 Z3 I; S; N! Q, L) K$ I
    44.         if (!class_exists($pageClass)) {
      5 a& e/ M$ D. y) F; ~7 E, `
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      + O+ L" N, r4 A/ ]5 S( y; ^' P
    46.         }# c. j2 u! v0 b

    47. : h4 x3 F# q8 X( r* G7 w4 ?
    48.         // 產生實體頁面類
      ) U3 o5 O; p0 J1 N. t
    49.         $this->pageObj = new $pageClass();
      6 v6 ]$ r; s9 \
    50.         
      ; L4 @- T# J) B4 H
    51.         // 檢查模組要求5 [* ?6 f) G% z+ a$ I; {
    52.         $pageProps = get_class_vars($pageClass);/ `7 w4 g" E  V& q7 I" c( X
    53.         if (isset($pageProps['requireModule']) &&
      . @; U6 Q7 z, t! {/ `- S4 R9 p$ S
    54.             $pageProps['requireModule'] !== 0 &&
      0 J- f+ {- H) t! M; e/ J7 [& O
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {' \3 r3 ?8 c  b9 Z0 m) S$ [! w* J
    56.             return $this->showError($this->LNG['sys_module_inactive']);2 O3 q; `! I( L  r3 j
    57.         }
      - S/ G9 t& {0 X0 G) l: v0 t8 C6 c9 n
    58. 4 n& g/ u8 y3 n8 k) X2 W, r
    59.         // 檢查方法是否可調用7 x* T3 |) E$ ~# P
    60.         if (!is_callable([$this->pageObj, $mode])) {
      2 {9 d4 `1 O7 ^, D( s, a' R
    61.             if (!isset($pageProps['defaultController']) || 0 G9 {# c, w0 C* ^! ^* J; h
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {! P5 Q4 C' C; B  m( U' Z8 j
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);  E( W0 \: L# B; O
    64.             }( [6 p1 ]& n  f! j6 ~1 k  a: {3 [
    65.             $mode = $pageProps['defaultController'];5 S0 y& K1 F! _3 W$ |5 g
    66.         }# ~) z9 M4 a( W* \/ R/ c
    67. + c* |4 \7 u- q. d& @! |
    68.         // 調用相應的方法8 N: L! i8 _* B2 g
    69.         return $this->pageObj->$mode();
      5 s# v) I. N% m& `
    70.     }
      ! G4 V+ ?. P, m0 K# z2 [

    71. - L3 R# I/ u0 i) P* [3 @
    72.     protected function showError($message)9 {! q6 L7 k4 ^1 M: c9 Q
    73.     {$ T7 H  V4 f& }( l7 u2 p* v/ `; W
    74.         return view('errors/custom_error', ['message' => $message]);
      - |2 g) M( s  o! X& P2 u  J
    75.     }
      5 s6 g! m3 f( \5 [$ f. d

    76. + k- k" k' j* y7 F
    77.     protected function isModuleAvailable($moduleId)
      # X8 c0 n8 q! y$ Y
    78.     {. B& W/ ^0 o  a
    79.         // 實現模組可用性檢查邏輯
      6 b% s2 @0 p" y! B8 v* S( O* N7 r
    80.         return true; // 根據實際需求修改& l: k# q/ J# P4 b, q
    81.     }" b3 w% ~  \4 D/ U3 |
    82. }
      % a: A( d. m8 P8 S% `

    83. 1 L8 ~! I1 f6 _; \) O" _
    84. // app/Controllers/Login/AbstractLoginPage.php0 _" ^3 ?8 j6 F6 P: Q8 T
    85. namespace App\Controllers\Login;
      2 P8 Z9 \+ Z; s% @. G% k
    86.   u, [4 q8 f4 u3 w8 ~
    87. use CodeIgniter\Controller;
      1 Y6 y0 e: l( X$ k. {
    88. 0 j# R  y/ R0 |* \
    89. abstract class AbstractLoginPage extends Controller
      # w# L- ?0 _- l: \9 f1 \1 R5 R; ^* o
    90. {
      / X6 |6 K, ?  a5 W: z' M# X
    91.     // 實現基礎登錄頁面功能2 N+ x5 `8 ]5 ^# Y% b/ n
    92. }, g# s4 j7 o% }. B! H
    93. " ]5 D- O7 T0 U7 c3 Q
    94. // app/Controllers/Login/ShowErrorPage.php
      1 b) [& v6 k* M4 T
    95. namespace App\Controllers\Login;0 T# i$ |1 ]) X2 X# l

    96. 3 {3 K1 O0 B; x  n+ Q. W! |
    97. class ShowErrorPage extends AbstractLoginPage
      # h3 h! W; @8 _: W% V) _6 z
    98. {2 L0 O; k' M- e
    99.     public static function printError($message)% ^: C$ q& U/ D- A9 ~6 Z% u
    100.     {* f  ^8 h7 [* B' W
    101.         $controller = new LoginController();* A6 b2 C: z* Z8 C5 l0 g5 H2 S
    102.         return $controller->showError($message);' o7 B. u/ X1 K2 e7 R! ]  Y
    103.     }
      * T# F4 y; c8 m3 {( M$ I1 d
    104. }
      % u: h2 |; K1 n; q

    105. & S, a- ~# W" {5 D' f4 g6 u
    106. // app/Controllers/Login/ShowIndexPage.php
      * {9 @, b7 n+ a
    107. namespace App\Controllers\Login;; N* c7 I) S3 R. G3 b

    108. " H6 O' Q9 i* A8 N  [
    109. class ShowIndexPage extends AbstractLoginPage- p; `3 p! d; _) E) z# B5 x
    110. {3 m9 V  |6 H5 e5 y
    111.     public function show()7 I* F# a$ q- B; m
    112.     {
      $ X$ a- @: g) I, G
    113.         // 實現登錄頁面顯示邏輯3 i5 Z8 [0 ~" F. r* ]7 b
    114.         return view('login/index');
      , h0 _5 `* n; ]  o
    115.     }
      + _0 b5 T! G1 p) F+ \. o% a. j
    116. }/ z0 p( C- p) E* ?& _/ T: V$ T* w9 C
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-12-7 02:15 , Processed in 0.012774 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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