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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:13940 / 13940

生命值:5%

升級   100%

  • TA的每日心情
    奮斗
    昨天 14:52
  • 簽到天數: 5627 天

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    . w+ n. Q8 G6 i: P% S; Z8 eAI 就是站長的最佳幫手。' G0 a' Y9 X( `  G, T; L
    3 n' K5 o( U$ h% ~% s$ T3 K% T

    2 a) c0 @8 D* o) k這裡的「新架構」是指後端的架構會有大變化
      N3 h- g6 B' `) A! e但前端的 UI 介面玩家不會感受出來有何不同
    1 t( H, l* h* z1 m* f* q+ L$ c- \& E* ?* ?" I' w
    7 E5 h0 l4 N3 L9 V1 v
    為什麼站長要改成新的獨家架構?
    * a4 m8 Z# ~/ u就一樣由AI模型來解釋清楚吧。
    2 f) ^0 r& H" k9 C0 P0 e* X
    ; ?6 o- ^* i$ n3 v9 d
    8 t+ y  J$ J# g# L4 ?* Y讓我分析一下使用純 PHP 和使用框架的優缺點:! ^6 A' d, L) }2 v
    純 PHP 的優點:2 u% T( N3 F; A/ |# q
    1.        性能較好 - 沒有框架的額外開銷
    ) w. D+ ~; t/ A! a9 V2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    0 n% _6 v5 Z, l$ ]2 L3.        更靈活 - 可以完全按照自己的需求來設計架構* j, h- K2 \* `4 c. }$ N
    4.        代碼量小 - 不包含不需要的功能模組. @" k& B/ j/ X) {, b* Q( X# @
    5.        適合小型項目7 e0 N. H1 c. P' x: Z" N
    純 PHP 的缺點:
    " f: m9 x& f- r3 @1 U( ?1.        需要自己處理很多底層細節
    , U6 V4 f3 o  m# Y. L2.        代碼複用性差' r) K$ H& V# ?  ^
    3.        缺乏統一的開發規範
    " D  j' `- J# }4.        安全性需要自行考慮和實現9 T# U) E" [8 O1 t
    5.        開發效率相對較低
    % V+ U% i4 Q2 h- R6.        維護成本高
    2 `. Y: G7 ~* t: |" J% w! Z( I使用框架的優點:
    9 g" a# Y( \" [" o. V1.        開發效率高 - 有現成的元件和工具
    ; L# J) s) y: A$ N% p. H2.        有完善的安全機制8 I+ M+ P# a, Z* C. x" H
    3.        統一的編碼規範
    $ T: R* }* @) |/ z% C4.        易於維護+ E: X" J2 X# M3 N2 N6 U
    5.        有活躍的社區支持+ ?4 w3 S0 V7 {4 G% @
    6.        適合團隊協作
    . k2 ^7 }' H: T: D7 y: T7.        自帶很多常用功能(ORM、緩存等)% v$ b/ P6 y# J" g, Z8 I) h; H
    使用框架的缺點:9 c7 P# y" ?* g, `
    1.        性能有一定損耗
    " B5 y% X9 f$ l5 k4 c& e  w1 k7 d2.        學習成本較高
    0 _$ v# b: K9 G* G3.        可能包含很多用不到的功能! c7 @* K- n  ]
    4.        不夠靈活,需要遵循框架的規範
      J- o0 u9 R6 b4 a5.        對小項目可能顯得過重
    8 X3 p9 c! I* v) Q3 y3 y4 C/ J; x. {建議:
    " K* x+ \2 P1 ^: l8 v+ w; |! q1.        小型項目或學習階段可以使用純 PHP. r6 I; @& p( P; U' D. T" z
    2.        中大型專案建議使用框架
    ' T! y3 R! S* D9 l# v0 {3.        選擇框架要根據專案需求和團隊情況- T! O5 O4 |4 Y2 C; e( O
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇, d8 h( d' X" A/ ^
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。8 x/ [+ B$ i% @

    4 h% F) S9 w" l0 Y. b5 \# \4 g* X/ \
    5 L) h# W: }5 V( @: {- ?
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。/ P4 A2 m! o2 N3 D; w/ [
    6 h8 @+ W2 L0 V) f  B* p& H: X$ h
    這個轉換主要做了以下改動:7 k/ z9 U, V4 b7 F* e9 O
    ( k; m! m" [9 v  J( g
    路由結構:
    8 S" R+ a6 C/ C7 z3 z# _2 B9 e, k, T
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下8 P& g$ U: a! ^  o" W
    支援原有的 page/mode 參數結構. h6 o& z7 r7 h
    通過路由規則自動匹配到對應的控制器方法
    * h9 B" r9 B7 a% j
    $ ^5 z( k7 g9 h( F- m1 S( o; {9 M. A7 ]
    控制器結構:
    . r) J8 G  H$ g0 L% N$ `5 \, ~. S; x9 k2 H6 b& a5 Y# j9 y+ N
    創建了主要的 LoginController 處理所有請求+ x8 W4 t0 ]0 g6 X/ _
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    8 b% _! O5 n( z8 G$ K錯誤處理改用CI4的視圖系統
    7 \* n: `1 k6 |9 ~5 h6 i2 J
    2 W6 m7 r0 A+ B8 B* c! w. V
    6 A+ |" e+ W6 R5 u( D4 n( \/ e1 y" w類的組織:
    ; g$ n5 U( y) e1 B  ~8 H
      W; F8 G: ^4 |/ w+ b" r, R! ~所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    7 p4 {9 N. P: R4 X% t! v7 }' `% _保持了原有的類繼承結構
    . d5 R' |- P! D改用CI4的控制器基類和特性
    $ d  e3 V( }2 [5 I" e9 D% ^) Q. z4 t# m, u$ ~) y- F1 @

    5 y3 c: V6 j% T3 Y- y1 K' ?改進的安全性:& e0 v9 g/ ^* E, w& e! `
    6 @2 Z5 E4 x: D+ g+ _
    使用CI4內置的安全特性9 ?* z) u& d( c- ~8 c5 Y
    更嚴格的輸入過濾4 s8 x1 Y& {- M
    更好的錯誤處理機制. A- k/ R) [' q% y2 G6 ?% {
    0 j; ^$ r  P8 ]; |1 `

      x  V+ }4 L/ k! w- P* n" _
    9 e# c8 Z( R8 s; A) {1 ?/ L& F要使用這個新結構,你需要:4 K# j) z& {, C, \( L9 |
    9 B4 g1 z# `2 o: X8 {" T2 p: q
    將這些檔放在對應的CI4目錄結構中' Y7 s9 z  e# T5 C1 E$ w
    確保創建相應的視圖文件
    % ]0 u( X2 {0 }  H% S; D0 Y' y& ?配置語言服務8 _) J( ~$ @' W; @
    根據需要調整模組檢查邏輯
    # Z, t* n. W0 f7 {) Y8 _* h& c/ G7 [4 P2 a3 z0 K1 N
    需要注意的是,你可能還需要:8 `9 w& O; X8 i$ @

      W/ O) @! O5 B; T創建相應的視圖檔(在 app/Views/ 目錄下)( l8 e2 K5 w( o. r5 T
    配置適當的中介軟體來處理會話- @5 w2 X, V/ T# t; _; Z
    實現具體的登錄邏輯* x' ]/ ?  E$ X- E5 i' C) T

    7 M* \1 j; v9 O7 V需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    , ^5 S) r; c, n$ ^1 {. L, F$ \; Z$ Y# z% d" ?
    1. <?php; q1 Z( m9 b+ Y2 W: f  k
    2. // app/Config/Routes.php6 _; z$ Z' R6 o* f; [
    3. namespace Config;
      ) ~  V4 R" Q3 u; g! t2 C+ l

    4. " i' k" @- ^3 g  B5 N3 R% h, O" j( L/ \
    5. $routes = Services::routes();7 q% W5 i  Q+ {  F
    6. " V' [6 a2 h% l5 D% K' S2 M* [
    7. // 添加自訂路由規則
      + c+ v$ g. E8 x7 f  H
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 D  r" t$ I5 g4 q8 y( |
    9.     $routes->get('/', 'LoginController::index');8 ^7 \& Y# I, i9 Y$ x( L3 D
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      ) g: t! Z$ K+ D- e* x
    11.     // 默認路由處理
      ' d, T6 Q# F. Z. `% j' j& i
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      , ^0 g5 h' c: T* x% s' D
    13. });# j# P0 V7 z# j1 e" o6 y' D
    14. " C* g; g3 Z8 E- J% O; w  M. m
    15. // app/Controllers/Login/LoginController.php
      $ t1 x/ o  c$ j
    16. namespace App\Controllers\Login;: s+ {0 n# |; h

    17. - U2 z! ~8 p! d3 k+ x9 F) ~
    18. use CodeIgniter\Controller;
      2 I* w+ P7 p; e
    19. use App\Controllers\Login\AbstractLoginPage;
      1 z3 i' }; a1 x0 B

    20. . F2 ]# x! K4 y5 U
    21. class LoginController extends Controller) h: ~( Q4 _# J1 F. \* l9 B
    22. {) Z: ]8 z/ `3 ]7 t& j' ^7 `
    23.     protected $pageObj;
      1 w; c, [% f9 |+ j6 @
    24.     protected $LNG; // 語言物件3 h) @7 f( u0 A* S/ W& I
    25. % F% {* o4 u, @% |7 c
    26.     public function __construct()
      ' i# F$ r% S3 r1 f( Z2 L, S
    27.     {6 }1 Y- v+ U1 p( y8 |+ G! `
    28.         // 載入語言檔和其他必要的依賴) O! C) Q3 e. T2 O7 S7 Q, R
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      & Q4 t. S, U# P) Z" k- ?
    30.     }9 F8 `+ d8 K+ O; ~% r
    31. 7 H3 B  U# a2 \* f( c/ a- }
    32.     public function index()
      $ u0 R2 L) m/ ]% r3 ~4 y# ]
    33.     {# E& s9 O% Y" v& T& Y/ p% g) k
    34.         return $this->handle('index', 'show');
      4 J7 [* l' a; q
    35.     }
      ! f% Q/ M  f3 A3 X  V, K: k
    36. , j: _4 ~" Z8 g) L
    37.     public function handle($page = 'index', $mode = 'show')
      0 ?, q0 o/ K0 r5 s
    38.     {
      ! z& S" `! o; ^* y) V
    39.         // 安全過濾頁面名稱9 a9 U3 v4 W, V# [+ b5 b
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);  V  l( f. U4 C7 P2 N$ M+ d
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';% O' N8 Q+ H* z1 L+ g5 I' p5 n+ A0 H
    42.         : t  H# x! V7 R/ {( F. ]# t
    43.         // 檢查類檔是否存在9 U) g7 `6 `) R& t' n
    44.         if (!class_exists($pageClass)) {# N: |* ?* w# z  S: u2 l$ p
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      * N. l* u) V: {1 O  V
    46.         }# c: a. X' F3 d7 N9 _
    47. # O* P1 |8 s2 D  V9 d: E
    48.         // 產生實體頁面類
      ! W9 L( b( Y1 A7 ]
    49.         $this->pageObj = new $pageClass();2 F, |9 w2 c" ?/ J
    50.         
      % _: `% d5 z( ]
    51.         // 檢查模組要求
      7 @5 v) Q& L! v- C3 }1 z$ t: R! x3 M
    52.         $pageProps = get_class_vars($pageClass);, w' p' r: G, V* q5 I( H, g4 A8 L  @
    53.         if (isset($pageProps['requireModule']) && " v5 H  k2 j% R! k1 h6 E- ]
    54.             $pageProps['requireModule'] !== 0 &&   i1 y9 ^& N! X- Z: E8 q3 X
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      9 k* \1 _6 J) t/ v* h
    56.             return $this->showError($this->LNG['sys_module_inactive']);7 z) d* C+ f$ B: r. V9 E6 [
    57.         }7 f5 R( R  }+ r' ~1 ^0 X% G* ]

    58. # B# l% `) A9 M7 b& x- j" L
    59.         // 檢查方法是否可調用
      ; Y+ A' v  ^0 T- c. n  [; D
    60.         if (!is_callable([$this->pageObj, $mode])) {
        M- S' Y8 g2 w  S) D; X
    61.             if (!isset($pageProps['defaultController']) ||
      . m9 g/ R. O) {5 e9 Y! S8 q) y
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {, g! T8 _2 h! A5 x% L. z+ O. v, v
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);& H, D8 Q& R4 \7 S
    64.             }) I  s. M7 A1 N! F
    65.             $mode = $pageProps['defaultController'];
      4 R: C0 h9 m% F8 w; }
    66.         }/ _9 R3 k9 t* T: U7 a. q: x
    67. 7 r) S* ?5 }3 k/ q" [  x( ]
    68.         // 調用相應的方法( g. i, ~: J. ?- c8 O4 O
    69.         return $this->pageObj->$mode();4 A7 i1 F6 \' ]$ ^7 T! `5 F
    70.     }
      * B0 r4 f8 @+ h! e

    71. * \4 X, U2 C4 E1 O! o$ F, V
    72.     protected function showError($message)
      # t5 W1 W8 j5 U2 f  E  w' {" L
    73.     {
      1 {  y8 |5 h/ E
    74.         return view('errors/custom_error', ['message' => $message]);
      3 Z7 P& O# [* @. F* O: {, x; {" I8 a
    75.     }
      : N% U6 t! @3 _0 J

    76. 8 @' q! u+ c) W7 {# L
    77.     protected function isModuleAvailable($moduleId)
      ( L- V9 g2 C/ O# H7 n1 E6 `0 P
    78.     {
      5 v5 v2 W8 d! @6 f; D8 ], s
    79.         // 實現模組可用性檢查邏輯( H, X7 V: C3 H/ s6 E, n- |
    80.         return true; // 根據實際需求修改
      7 B$ W; o7 _, c3 Z
    81.     }& X8 a: y/ h, ^, d# _5 n/ Z
    82. }
      7 h% |  ~2 R; Y
    83. % B3 q5 f+ H6 y
    84. // app/Controllers/Login/AbstractLoginPage.php
      3 g& r: d8 I6 m- q- E2 w
    85. namespace App\Controllers\Login;
      4 f) ]8 o$ D% ?9 n$ Z' d/ G7 d1 J
    86. : o# N; R; |; A/ G, r8 S' M  Q
    87. use CodeIgniter\Controller;8 N( v  l( |% z+ y6 V

    88. / j  m& x1 ~1 x! F8 S
    89. abstract class AbstractLoginPage extends Controller
      * Q  v& i0 B7 v  B8 B
    90. {
      , L. Y: O7 a9 m2 I
    91.     // 實現基礎登錄頁面功能
      8 g0 Y3 H. m" k. k
    92. }
      0 p: X# ~- ^( e: s

    93. * _- _5 M1 u4 `, c& |" Y0 w9 o
    94. // app/Controllers/Login/ShowErrorPage.php
      . l0 i+ _, @/ Q' V$ F( u5 Z
    95. namespace App\Controllers\Login;# y9 v8 w  d9 e+ ^/ i. ]3 x4 q4 X; h

    96. : F& X  [: i7 ~7 _9 c# l* y9 b
    97. class ShowErrorPage extends AbstractLoginPage" Y$ ?7 Q, o1 P7 O. k
    98. {' A3 K. z0 z/ j; U  n5 D* t  w. \- s) _
    99.     public static function printError($message): V( W; G8 p! w' p+ ?7 u, @1 ?
    100.     {7 ]. d. b: Z2 C$ ~
    101.         $controller = new LoginController();) Y' _* j0 |5 e: q4 h+ T/ i
    102.         return $controller->showError($message);. j  U; C- }# K
    103.     }$ g. k  ~3 l1 _3 V! y
    104. }
      % @4 G! r* |' K  T: E: N

    105. / E% m7 R5 D7 [2 [: e! z
    106. // app/Controllers/Login/ShowIndexPage.php3 d) M4 r. d, `. F" m4 J
    107. namespace App\Controllers\Login;5 M$ b- J: U$ z2 B$ Q

    108. 1 ^: m4 Z; d( {' I0 v
    109. class ShowIndexPage extends AbstractLoginPage* A+ T6 U: V" N; ]
    110. {
      & F$ E# }* ]3 k" D
    111.     public function show()
      * J' Y, J' w6 C6 Q6 S. ?* Z5 q
    112.     {
      ' F2 P- P7 \4 I* C$ Q) b9 ^4 J
    113.         // 實現登錄頁面顯示邏輯# U. |0 v4 g4 @" m( ~
    114.         return view('login/index');
      * G3 r2 W6 S/ ^' }
    115.     }
      9 w; n$ l7 E8 I, R
    116. }3 g* ]% F5 q- [3 W
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-6-16 06:41 , Processed in 0.017406 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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