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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14528 / 14528

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    " H# B, T! A- {  S" }5 X6 E- {AI 就是站長的最佳幫手。
    7 [$ L. m* h0 U; ^* N
    4 i& A. H5 @( X, n% ?) l3 D6 j0 x% }' c' O8 O) E* w5 m4 V0 \! G
    這裡的「新架構」是指後端的架構會有大變化2 N# }- U( T4 d! ?) r
    但前端的 UI 介面玩家不會感受出來有何不同
    ! M& j( b7 R% Y9 A6 y1 n! ?6 V5 U5 q6 F, x$ z2 ^% k$ b

    1 N5 i5 e# m9 \+ l& m8 b+ M為什麼站長要改成新的獨家架構?: N$ L$ d3 X7 v, ^) R3 [
    就一樣由AI模型來解釋清楚吧。
    , u/ @8 Y5 }% m# a& M% S8 a0 v; J6 k
    7 |8 X! S" u+ D( x
    2 J: K$ x  B- I! x+ o) @3 d- |( y讓我分析一下使用純 PHP 和使用框架的優缺點:8 U% |# `3 F" P% s5 a
    純 PHP 的優點:1 [! y5 l6 `/ `" s6 h% P7 F) [
    1.        性能較好 - 沒有框架的額外開銷' T+ G& Q! L. p5 P0 W8 q# d
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識8 m: C4 ?4 t* n+ B+ R
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    0 h3 j1 g# F/ N+ O; N5 B5 e4.        代碼量小 - 不包含不需要的功能模組" ], A, t9 T% Z+ U" ~0 A
    5.        適合小型項目3 v3 P" |7 @* K: o& X# q  l
    純 PHP 的缺點:4 E8 h9 N' `1 F+ V( }
    1.        需要自己處理很多底層細節, Y, D- C0 [# Z8 [
    2.        代碼複用性差
    # K6 u/ g1 f+ n2 m9 V- D& C3.        缺乏統一的開發規範4 W" f% ^6 k- B. R- ?
    4.        安全性需要自行考慮和實現
    1 e# Z+ A7 v6 w: ]" I5.        開發效率相對較低+ h( O7 ~. o9 E' e9 w+ v: p
    6.        維護成本高
    $ c9 i6 @' _7 ^" V! _7 F" a6 _使用框架的優點:
    1 a' ], r4 e1 z% }' L1.        開發效率高 - 有現成的元件和工具7 c7 D( R6 l7 ]4 U7 u, [( A
    2.        有完善的安全機制* e" ]& g! ?' W' n" `6 j) J/ A
    3.        統一的編碼規範$ _6 O* K: ?* \2 {7 ~3 b) i- V
    4.        易於維護
    . G+ i6 ~3 o) n& m" c6 h5.        有活躍的社區支持9 l; j: ^# ]# V! h$ C
    6.        適合團隊協作" {# y+ k  b- F" r9 O% t1 D/ c. f
    7.        自帶很多常用功能(ORM、緩存等)
    , n) ?1 r0 X* q- P3 w" d% i使用框架的缺點:
    / ]( S$ P4 D  G1.        性能有一定損耗3 ?; R5 {9 n  ?+ x4 p9 [: E! M6 c
    2.        學習成本較高
    0 a* ]7 o9 r+ d) ]; J3.        可能包含很多用不到的功能
    # z# U! q& T* Z' U) m6 i  k* X& y6 M4.        不夠靈活,需要遵循框架的規範
    ( S. x5 j, ?" l5.        對小項目可能顯得過重
    3 m! W/ I% T. p0 u3 D7 V, M! T建議:" t% ]; S0 q; N9 U# Y+ u1 C' u
    1.        小型項目或學習階段可以使用純 PHP( f6 t5 h2 s- y8 s7 F+ {
    2.        中大型專案建議使用框架3 }2 j2 {7 `1 B/ {# G
    3.        選擇框架要根據專案需求和團隊情況- K" c7 B- X1 W& d* X9 n6 t8 k+ a! o
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    7 G% D0 u. J6 p" Z6 P. s您打算開發什麼類型的專案?這樣我可以給出更具體的建議。# M  Q$ D3 O  j8 k7 D2 ]

    2 b" d6 |2 F  k" x8 o% b
    $ ]3 B! l9 r; V# b2 ^
    # Q1 }; @$ F1 l: R我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。1 g! `* q) ^1 o% R( I" `8 O
    2 N$ o' O+ K& j3 ?
    這個轉換主要做了以下改動:7 @' p6 T: O& Z# P+ n$ y; s, c1 ?+ v
    $ Y3 v8 R) A+ _
    路由結構:
    7 ?+ v2 U' ?4 A+ \. _8 z: ?' N* y! ], p6 D
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    2 a* c. C+ d9 |7 P1 t" Y, Y支援原有的 page/mode 參數結構8 A& G8 I. c. e- Q6 C' f
    通過路由規則自動匹配到對應的控制器方法
    : ^, P2 l* }0 K7 o1 L7 A& n: v1 ~: e: j, t6 K' W

    1 M/ T- l( k, {0 ~8 Y控制器結構:
    4 ?" Z' F! X; b3 ^1 a1 X9 j! c6 t& D, C3 s. d, e: @
    創建了主要的 LoginController 處理所有請求
    . w( Y% m7 Z! Z2 n( b保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    6 m+ D3 n/ K  c5 d% f1 m錯誤處理改用CI4的視圖系統
    6 {4 f* z0 ~, x5 Y" i7 p7 R- T( C$ S% G$ f

    0 F# V, r/ s0 y6 A* G2 s9 [& D# L類的組織:
    7 O) n+ [: p: [9 H5 F# v) R) J/ i" |+ l
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下. [9 h$ Q. O1 l/ c* q7 ]% W
    保持了原有的類繼承結構
    $ B( ~1 a$ B/ `9 w& m改用CI4的控制器基類和特性# d' g$ T% e1 B
    + v6 s. E' B$ H* M2 ~! c) z

    6 _% i7 L3 u' y* X7 Y改進的安全性:4 ?2 J  I5 E  J, t7 `1 h
    ' |% \5 l' Q3 e* O5 X$ `. L
    使用CI4內置的安全特性
    4 V% }; X6 q# X% J2 z/ A" ?# k1 o更嚴格的輸入過濾
    + C$ I) n, A9 \; |更好的錯誤處理機制; D# k" h9 r$ X" a" L4 ~
    ! l& [# ?/ Y3 W8 Q- k+ \
    1 W- Q1 `0 ]1 e! f* |0 V0 `& E# a

    . m9 ]- N/ o0 q要使用這個新結構,你需要:
    " U/ ~9 t3 C* x3 d; d# ?6 s6 H1 a+ t% y; \) }5 p
    將這些檔放在對應的CI4目錄結構中* o# p; ~$ T' P0 q
    確保創建相應的視圖文件
    : \- R3 @0 C+ L; i) p配置語言服務
    3 @& \5 ^- W. L4 R根據需要調整模組檢查邏輯2 j1 R0 o4 L7 q$ ^" K2 [- }

    * f# C" A- y- z& \需要注意的是,你可能還需要:/ T2 ^, t: z( j9 R% a5 Q

    . r; n  F, N+ c4 e/ S$ Z3 R2 K創建相應的視圖檔(在 app/Views/ 目錄下)
    - L( `2 Y+ z% J; q配置適當的中介軟體來處理會話( k  L1 E5 v% I% m" t
    實現具體的登錄邏輯
    3 q3 T. z+ \; m7 a
    7 u! F0 ^, h& G1 v/ k+ H+ \需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    & Z- ?# W4 A4 ^% m. f2 W- K% X  \5 b
    1. <?php
      # j( R/ ~; Z  X; y' [6 G
    2. // app/Config/Routes.php3 D/ Y: ?6 O( r+ |5 r
    3. namespace Config;
      # I1 I" D% z% q

    4. ! K% r! W; a, S: M1 g3 L  O4 L
    5. $routes = Services::routes();$ y. J( y( |9 M! c/ g

    6. 9 G' j3 a) F, c8 f
    7. // 添加自訂路由規則) M, W$ c: q7 K" h5 K) a
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      / _1 r4 l* C/ \
    9.     $routes->get('/', 'LoginController::index');
      4 m( x# w. n9 |
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');" b  b5 X- _+ Z; S% d& n
    11.     // 默認路由處理! D4 x' X; |9 K
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      - {. R  ]  f* f# S+ p! R
    13. });
      ) C0 D- }; `% k& C& {
    14. " Q4 F: q/ M5 V; E/ K' M
    15. // app/Controllers/Login/LoginController.php
        X% [4 B, r6 R
    16. namespace App\Controllers\Login;8 P2 P$ L# J. I8 _1 m5 j1 @
    17. + {% q5 g$ o# j
    18. use CodeIgniter\Controller;
      ' e& b0 h) v1 X  Z/ h
    19. use App\Controllers\Login\AbstractLoginPage;
      4 f: \. n. r; F* Q5 s
    20. & ]; O2 z- F1 z: d
    21. class LoginController extends Controller9 g( ?8 o# W1 n# m, x2 x# y
    22. {
      & S, g. z1 Z$ ]! _+ w, Z* A
    23.     protected $pageObj;9 c. I( @1 B/ Q5 x, t3 C
    24.     protected $LNG; // 語言物件
      + P1 x4 u1 x0 J8 t0 d/ }; ?7 B1 i8 c
    25. 8 w3 T. v. H" F; A' F, h) E, r
    26.     public function __construct()
      3 E- g) _" [. b: u; V: ^
    27.     {5 C2 o. p1 e7 S8 X' \3 {2 l
    28.         // 載入語言檔和其他必要的依賴
      ; X5 x' X: l; ^  u, H+ a
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務* ~2 t& \9 w* a* x
    30.     }
      : j# d7 m' L1 }0 E

    31. 7 z; W7 }3 ~1 p5 \2 z
    32.     public function index()
      ) }5 `2 _! Q2 n4 |0 T
    33.     {
      4 c8 P4 ^+ b7 d8 ~* l
    34.         return $this->handle('index', 'show');0 H& M, ]( ?1 _  S6 _
    35.     }- i! |" C( ~0 \  {! a
    36. & v. X# \' t# M4 f, G; `/ }
    37.     public function handle($page = 'index', $mode = 'show')* H" d6 _: m# a& w, e2 b
    38.     {$ q$ i' \/ S" v
    39.         // 安全過濾頁面名稱0 N# z2 s, V" m4 n- U! e+ y
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      9 s( E8 w( y: Q2 d, z  @
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';* l& w7 G5 y# s3 T1 a
    42.         + V4 u8 ?4 ^, J1 Q5 M
    43.         // 檢查類檔是否存在: ~" C+ }2 ~- R6 |4 p0 ^( s
    44.         if (!class_exists($pageClass)) {. O2 o0 x# f0 Z5 H; a
    45.             return $this->showError($this->LNG['page_doesnt_exist']);# A% g, X! H: H( ^) I
    46.         }
      7 B/ P% H( g! r. Z' r5 W1 M
    47. . P! l8 C" y) N' v' H) \
    48.         // 產生實體頁面類
      / Z7 M  C* F/ [8 Q
    49.         $this->pageObj = new $pageClass();5 b' P0 {. N6 B( d5 i5 U
    50.         9 g$ v4 @: P4 R8 [
    51.         // 檢查模組要求
      . D/ ^0 d  ]2 p: G5 ?# ]
    52.         $pageProps = get_class_vars($pageClass);
      # s; ]! R: {/ f. D/ _2 S
    53.         if (isset($pageProps['requireModule']) && - ~5 @' m; Y, F
    54.             $pageProps['requireModule'] !== 0 &&
      ( g5 z- j4 i+ t4 ]/ O7 a& P; J
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      7 I# X3 T5 z+ l8 \
    56.             return $this->showError($this->LNG['sys_module_inactive']);. }! T& ^# j- b+ u6 {
    57.         }7 g, _" v# X& z7 ^1 ^; k; X

    58. 5 B8 i* N4 [- E  H
    59.         // 檢查方法是否可調用0 U" l0 M5 H5 s+ E/ Q# V
    60.         if (!is_callable([$this->pageObj, $mode])) {! x# O: i9 ^5 |, w+ }, i- U
    61.             if (!isset($pageProps['defaultController']) ||
      7 y  D1 p( g5 V: d! u9 A1 n$ N1 }
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {2 b+ V9 D* B/ A2 |: H- g0 ^, p0 w; Y
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      % ~; n& s/ a& S7 K9 V! c8 Z% \
    64.             }4 r8 M0 }% @' A( _( y
    65.             $mode = $pageProps['defaultController'];! [* _1 o, p" C5 G3 {2 X3 G
    66.         }- {0 g7 [% e: c) k" \

    67. , i1 P' ]* n3 ?7 \4 |1 R. Y" L
    68.         // 調用相應的方法# I' ~3 [. f7 J( n+ Z6 _: ]- j' F3 t: A
    69.         return $this->pageObj->$mode();8 e& e" W( t) m: E  P% f( i
    70.     }
      8 m- m; O% r. c/ x3 u2 q6 h- Z
    71. " T/ E1 I0 a+ u. n+ U7 T3 i. U
    72.     protected function showError($message)7 R. a- d5 K4 t- c
    73.     {
      4 @" F+ I9 O) Q9 z4 h9 ^+ j2 C: H
    74.         return view('errors/custom_error', ['message' => $message]);5 f0 D3 K) [. E% t. j* T, z
    75.     }
      6 F5 P# F$ a8 [+ x- u" R* p, S8 z
    76. 1 ~( @& |8 \1 x  I+ C9 {
    77.     protected function isModuleAvailable($moduleId)
        Y& s8 w0 U4 L% V# U% t: m9 Q- B
    78.     {
      . q5 v5 u5 Z( w
    79.         // 實現模組可用性檢查邏輯
      ' b8 D; F# o. t  D+ H
    80.         return true; // 根據實際需求修改
      8 k) v8 x& b6 `6 ~0 @; M, _
    81.     }' i6 X- R) v; n
    82. }
      8 G1 {/ r8 K$ q$ I% ^0 J+ E

    83. 4 W4 q6 e- h/ z9 \9 A& Y
    84. // app/Controllers/Login/AbstractLoginPage.php. J" e  B$ E+ i5 f2 ^4 D9 Z# h- h
    85. namespace App\Controllers\Login;7 C' a: Z; q" S3 W4 v9 w

    86. # N0 U8 V2 W4 c- d1 R3 J
    87. use CodeIgniter\Controller;9 ]; b( D. N$ j: b
    88. 5 I7 S) a9 X$ U3 o; h8 w" {# J
    89. abstract class AbstractLoginPage extends Controller4 b7 X' |2 C- v, a- L$ x8 d3 ^
    90. {9 g- B) w* ^6 a$ F# C$ d
    91.     // 實現基礎登錄頁面功能$ D7 B# I* O. K: d
    92. }
      2 Q8 H5 T3 P( Y7 r+ Z: V
    93. / s1 T9 O# g5 ^6 {2 g7 W
    94. // app/Controllers/Login/ShowErrorPage.php
      9 F' k: t0 R; w, |$ v
    95. namespace App\Controllers\Login;
      & V9 L( u* @7 H

    96. % m! Y: Y' R" k: g' t5 f8 R, x
    97. class ShowErrorPage extends AbstractLoginPage
      3 p2 r+ z8 n, [. i
    98. {0 `. U5 t1 {# {' d
    99.     public static function printError($message)
      , u( \/ \: ?8 V8 K
    100.     {
      ( X) }* `7 R9 e! F; k
    101.         $controller = new LoginController();
      # @& ?/ f, s% W) v; g
    102.         return $controller->showError($message);
      : ?* h+ m: h$ _2 F
    103.     }$ V8 f( Q, k9 P* L
    104. }; v* c( z) W( Z: w. q+ f
    105. . Y0 y3 u* j+ m% j
    106. // app/Controllers/Login/ShowIndexPage.php' T9 Y. ~( j8 F4 o& b# L$ v; E6 A+ e
    107. namespace App\Controllers\Login;% Z1 C3 B4 {, E

    108. ' ^0 h; p- ]2 Y, a- C7 b& J
    109. class ShowIndexPage extends AbstractLoginPage
      7 \" w  r0 Q1 g: S
    110. {( d7 C5 |3 ^' {3 B  k8 U
    111.     public function show()* r# |9 c% U& \2 _  P# T7 o$ ~, A
    112.     {
      * A% g8 j/ [) D3 s2 B  v/ R
    113.         // 實現登錄頁面顯示邏輯
      - H0 G1 i9 t- h2 M6 ~! @+ S
    114.         return view('login/index');& x, h0 _# n7 v/ e* V3 v+ S
    115.     }
      " S7 I4 [8 M" W. g: o+ H* G  g+ h
    116. }8 P+ c5 b1 @* {* B# r# l! K
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-1-23 15:52 , Processed in 0.015650 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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