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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14016 / 14016

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    1 w6 V# m: x2 o3 }2 V, A% XAI 就是站長的最佳幫手。/ Y7 }; _; a6 m+ X' ^, Z

    $ |5 _$ U$ @9 Y+ H  d& k1 w0 E; w% D
    這裡的「新架構」是指後端的架構會有大變化6 J; h9 T: e, t3 q0 h. C
    但前端的 UI 介面玩家不會感受出來有何不同) S% Q( F) k4 z( E4 g, }

    0 c/ Q: I! _/ ?, N! {6 N  P6 ]& I1 W2 i2 R( [
    為什麼站長要改成新的獨家架構?2 Y1 F1 _$ {* S; |+ V
    就一樣由AI模型來解釋清楚吧。0 {. f6 b, x% D

    ( n9 A9 R4 A, c+ N6 `( N) z" D* M$ V* l) g% }: q
    讓我分析一下使用純 PHP 和使用框架的優缺點:* z% A4 q+ j% M# g8 T4 `+ o' h
    純 PHP 的優點:
    6 `* |5 J" I( D3 w# J- g% \1.        性能較好 - 沒有框架的額外開銷
    . p( b' E& o: F" F' L/ ~2.        學習曲線低 - 只需要掌握 PHP 基礎知識8 L* e2 v* V; y- E
    3.        更靈活 - 可以完全按照自己的需求來設計架構  N/ l. i) E+ R. E7 S8 q# U7 ^
    4.        代碼量小 - 不包含不需要的功能模組
    * k2 l: {4 r1 A: J5.        適合小型項目
    ) J$ W/ t  ^% ~9 r& ?純 PHP 的缺點:
    . t# r7 T. w1 t1.        需要自己處理很多底層細節
    ) m5 B7 [7 q% p" p3 f" x2.        代碼複用性差
      y# W' z  H- S3.        缺乏統一的開發規範! v# [4 a1 F# W/ U$ i
    4.        安全性需要自行考慮和實現
    ; u2 d8 B- N3 Y' F" E4 I! t5.        開發效率相對較低
    ( T0 _9 [& t6 C/ ^6.        維護成本高
    8 |  N3 n2 w- N- W使用框架的優點:4 g4 b* {9 c- e; S4 L) s* b5 {
    1.        開發效率高 - 有現成的元件和工具1 `9 R2 W7 \' v  m
    2.        有完善的安全機制+ ]1 ]2 ?# {3 S7 Y
    3.        統一的編碼規範
    6 M( ~6 m2 d2 K- g7 b- v4.        易於維護, A+ ~! N% X1 v8 |* @
    5.        有活躍的社區支持) \  Y  g1 ~7 H# @- T$ d; R
    6.        適合團隊協作1 e$ \* b) E* T! O
    7.        自帶很多常用功能(ORM、緩存等)
    5 j. F2 J9 m. A2 p6 g( m; E9 U" `4 w使用框架的缺點:
      A! ?/ d' M9 M. L. \3 y1.        性能有一定損耗' v3 F  V( {2 S, s( B
    2.        學習成本較高3 E$ V( j5 J1 W* [* O
    3.        可能包含很多用不到的功能
    1 j1 M5 Y( L" ^, `- j8 l" A! Y4.        不夠靈活,需要遵循框架的規範5 ~) E5 ^* R0 F8 B
    5.        對小項目可能顯得過重( x' J4 g9 G5 U
    建議:& R+ g& }* V3 R* N/ K" z
    1.        小型項目或學習階段可以使用純 PHP
    ( J' x. n* x6 d. _! G! V2 b8 ?2.        中大型專案建議使用框架
    $ [7 b# `* a: o3.        選擇框架要根據專案需求和團隊情況
    4 Q6 N, F5 S8 x$ {4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇; _  X8 k2 H" y8 V
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。. L: p9 }8 I* e
    7 e9 i- `/ j) K( D6 j/ W$ b( S* s

    - h5 w9 d. E; m
    : G0 S7 N6 E* h  x$ _6 I( i& t我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    8 U! w- y" O' z1 @- v
    ( }, n- c' h/ {2 D* y( `* _, }這個轉換主要做了以下改動:1 V# r6 J" q1 d) b, i: v- I- c
    3 i, F/ X6 d; ^- T8 s6 P$ P2 I
    路由結構:
    8 j( [5 y; k+ w! \$ e# V. `$ @4 w! S/ F
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    7 D  y! R) V9 Q5 ]; m支援原有的 page/mode 參數結構
    . {" b2 g& b' z8 r" n8 R: p通過路由規則自動匹配到對應的控制器方法
    / }3 U8 g) b& [' ~) w# c  D# w, C# W

    . K* }1 a* o3 ^控制器結構:2 ^; N8 Y' F9 |! `' q* ]. l6 b
    0 F) g, |5 Q5 ^1 w  M) B
    創建了主要的 LoginController 處理所有請求+ l: y0 T5 C3 F8 L- d4 g1 w2 `
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範, e+ b/ {) M) S/ d* r' {& I' A; \4 P
    錯誤處理改用CI4的視圖系統
    , S1 L) V; q5 M  p% |
    ' e5 K, G" `) w% f3 i; C
    ! c, o8 T0 A' S" l# A- E類的組織:
    ( x; `, G  h/ s( w
    4 ^3 m* H) p4 z9 S/ s所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    2 Z) r% H. Q$ A3 K! s. B& f保持了原有的類繼承結構% a+ d) h7 W+ e1 k' _
    改用CI4的控制器基類和特性% K+ y5 P8 i$ v: Y+ v8 b4 ?& f5 q
    6 u3 t; m( ^: F

    7 r" f5 T! Z; X* c3 v9 v改進的安全性:3 m+ d9 e. P/ X; J- W6 K( V& @
    " R7 ]2 `+ ?  q/ M1 h
    使用CI4內置的安全特性$ Z8 q, Y7 p0 n9 d6 h" ^0 U( B
    更嚴格的輸入過濾- W& D& \* }' Q5 {$ G: X
    更好的錯誤處理機制: p) e; y( X! a( g( F  _

    8 Y- |7 u; s( b0 o. _3 T0 T- E  J4 r
      }. M% ?3 u+ D
    要使用這個新結構,你需要:
    8 o9 n% _3 i! ?0 o; v8 y1 h- ]8 h& Y- y! p" _
    將這些檔放在對應的CI4目錄結構中
    & j/ C; A6 W/ V8 u# A+ p7 _: Z8 `# l確保創建相應的視圖文件7 A; `' W* x2 |4 i
    配置語言服務
    . G9 G' F) v# c  ]9 R根據需要調整模組檢查邏輯
    ; V4 p- e( G9 R* \, t
    2 A( |5 C1 l2 z需要注意的是,你可能還需要:4 b. S( g5 m! x  A) M% ^( o

    2 J+ B0 D4 W) @9 R& Q1 C創建相應的視圖檔(在 app/Views/ 目錄下)
    ; _5 o* \1 [3 |% ?/ I1 ?4 M- }/ `% x配置適當的中介軟體來處理會話" s7 P4 ~" j3 q& c
    實現具體的登錄邏輯
      ~, O. g! J& l5 D0 s# z# o: N
    2 r! Z/ ^" k6 M2 c( Q( A需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?3 Y# s- |! c0 h5 v, T) R4 w4 D

    1 c8 [, V& r' a. n0 g
    1. <?php2 K6 R$ Y1 B8 E
    2. // app/Config/Routes.php2 x1 H; b+ Z3 }2 M9 T6 k' M( T
    3. namespace Config;8 R& Z  \, f" @) p. t6 ]. u

    4. # N# u- O6 }+ q! K8 A% ~; B: L8 T/ }
    5. $routes = Services::routes();, x) V+ C; I% Z5 l: r% M9 M
    6. 8 A* X  ^- k3 J% R+ k$ [6 L" d3 o) ^
    7. // 添加自訂路由規則, l% {+ x: Q) Q! w2 c4 }% l% R$ w
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      / x% ]* e$ ~5 B
    9.     $routes->get('/', 'LoginController::index');
      6 }/ Y# @8 h( j; L, Z
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      / J! _8 Y0 F7 P, v
    11.     // 默認路由處理) D! w) [( w9 L3 w8 m+ M: i
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      1 _$ I* Z: j, ^" Y
    13. });
      + M2 g+ B/ T/ y5 b. E* w

    14. 3 E5 t7 x  i6 l" I! s" G9 y
    15. // app/Controllers/Login/LoginController.php! y+ R3 n1 J% W! ~5 q
    16. namespace App\Controllers\Login;4 J4 a5 R9 y3 q- a" o" M+ H

    17. ! p8 M  n' \, f7 U' \
    18. use CodeIgniter\Controller;7 m7 ^! o2 x9 ?$ D- Y1 c
    19. use App\Controllers\Login\AbstractLoginPage;
      % n9 j, E/ s7 T, }

    20. # H) t1 m" D  |4 B
    21. class LoginController extends Controller0 N9 C8 i2 i8 k6 d
    22. {
      9 P  K/ _$ r  U& K
    23.     protected $pageObj;- I$ H% Z, r0 e
    24.     protected $LNG; // 語言物件
      , p, V+ _: }# r2 r4 B+ Z; M
    25. 6 m, k- O8 |7 d+ l4 \6 W' k$ E
    26.     public function __construct()
      3 X$ U3 _- p1 ]5 U9 k
    27.     {
      - r# F1 A; b' {( X1 P9 T+ w- _
    28.         // 載入語言檔和其他必要的依賴
      7 y5 l& C9 V- Y' z
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      9 m6 X- |" q+ i# G" P1 C8 f1 `
    30.     }
      ' v0 ~5 ]1 W' N
    31. 1 {! A% Y2 z0 [2 I: t# T% \
    32.     public function index()
      * X( c- D" R0 e- P1 {
    33.     {; i$ u! Y/ C) j6 H9 Z3 T
    34.         return $this->handle('index', 'show');
      9 A  T5 q' |+ F) L$ q; r
    35.     }2 v: V1 ~5 c& i' L$ F; C* \
    36. * J  n$ B2 g" ~+ W) D2 e2 |
    37.     public function handle($page = 'index', $mode = 'show'), {; J: G4 v  y3 U
    38.     {
      " t+ d( S( C  N  k, ]8 y: t
    39.         // 安全過濾頁面名稱
      + `4 T3 Q  y, i- H- t$ Z  Y4 d( `
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      % f- M1 Y1 O; S7 B/ {
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      6 X3 \( k0 v( t+ r9 a' Q
    42.           w, \  f( ~5 Y0 }' L# I# v" ^
    43.         // 檢查類檔是否存在
      " t) ?/ }8 [; E
    44.         if (!class_exists($pageClass)) {1 Y; t7 ^) d. C6 }3 O
    45.             return $this->showError($this->LNG['page_doesnt_exist']);& k# f  I3 ^1 s4 c" X* H
    46.         }
      0 \# n, D; U5 q! P# X

    47. % B+ x# c( Q0 y, g* n
    48.         // 產生實體頁面類
      5 f* n6 n- i. f  f0 n
    49.         $this->pageObj = new $pageClass();" ]! i. s5 F- c. {& J
    50.         1 c' e6 l% a6 p* G% B
    51.         // 檢查模組要求* l3 E7 v1 q% i0 o2 ?& o
    52.         $pageProps = get_class_vars($pageClass);
      " D/ \4 }4 w! l+ s: c
    53.         if (isset($pageProps['requireModule']) &&
      4 X; o  G! d3 @# @6 d6 r
    54.             $pageProps['requireModule'] !== 0 && 6 P- z3 w- u( t( h/ L
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      % j( d) Z* X7 b
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      3 Q! s! P* R3 P
    57.         }
      * @8 Q6 \! F/ S

    58.   Y$ G6 t, v4 K# Y9 V' _5 D- ^+ V- Z$ z
    59.         // 檢查方法是否可調用
      % _2 R. A! P: R; t9 w
    60.         if (!is_callable([$this->pageObj, $mode])) {7 x& [- R  Q3 H" s6 X* a( H
    61.             if (!isset($pageProps['defaultController']) ||
      - D/ f8 {4 J# L6 S5 C! o4 ^
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      ! B! Y1 T( x+ z
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);" n: T( s+ K5 p: J
    64.             }
      + N  D4 X6 B9 K" x6 C
    65.             $mode = $pageProps['defaultController'];
      ) I3 o2 ]; o3 x3 V4 N7 X* S* {
    66.         }3 H( S* k: l0 E% x& E. m
    67.   L! S0 x; G, {2 A; {
    68.         // 調用相應的方法
      6 `& O( X: v- s7 C
    69.         return $this->pageObj->$mode();7 r9 y% M, M" X8 Q5 W$ {
    70.     }
      " S! r# p4 ?0 C2 D- j

    71. $ Y+ v1 A& B5 K
    72.     protected function showError($message)  Q9 _" i5 P4 {' F' [& A
    73.     {
      . c4 X5 c+ X" B
    74.         return view('errors/custom_error', ['message' => $message]);
      " m9 b% S. }4 j2 r' L- S
    75.     }
      ! v& [7 t" m+ m% ~- j
    76. $ Y3 J! B1 u  a5 o
    77.     protected function isModuleAvailable($moduleId)
      . L$ o7 s( r: _
    78.     {
      $ |0 a6 d, x* m" y$ `5 V
    79.         // 實現模組可用性檢查邏輯, B- Q" v& \# I! [5 o
    80.         return true; // 根據實際需求修改
      7 N. e; r, o! z0 J
    81.     }
      8 p. x1 n% }& _/ @. D" D
    82. }
      6 [8 Q3 F3 ]7 D* _  K$ W4 N* U# u+ }
    83. # {4 l2 y' K% i/ m
    84. // app/Controllers/Login/AbstractLoginPage.php7 [5 ?( Z- b, j+ L* z
    85. namespace App\Controllers\Login;, ]: p- e6 @+ v; k  V: [

    86. ( s. @7 z4 p0 G4 h
    87. use CodeIgniter\Controller;
      ' D5 B% e9 i2 C

    88. 7 `. P$ \" n' q7 _
    89. abstract class AbstractLoginPage extends Controller/ j9 a9 i+ R$ M, l$ L, L. M
    90. {2 Y* e5 V7 e# a, a! d
    91.     // 實現基礎登錄頁面功能
      ! ~& r1 c3 A! }0 U
    92. }
      % Q, c1 \9 ^: e) ~0 M$ ~4 c
    93. $ Q9 |* o, E! d* D/ g
    94. // app/Controllers/Login/ShowErrorPage.php
      * t% }+ k! a  e5 _3 q; e" ?/ M
    95. namespace App\Controllers\Login;
      4 i, ?  A# q" y. T) b% g

    96. - c5 a, j4 D# ~
    97. class ShowErrorPage extends AbstractLoginPage' ]$ [7 Z8 I+ D* f# L
    98. {
      - b3 B3 ^/ g+ g' M6 N" q
    99.     public static function printError($message)9 _0 B$ H$ x* p0 I5 d$ O
    100.     {0 K: ?! k8 _! b5 W) o
    101.         $controller = new LoginController();* Z) R  L4 |# E% v
    102.         return $controller->showError($message);. s) p2 O) P& R1 E$ s; J
    103.     }5 H  h  D* L3 P3 X3 }
    104. }" n3 O4 W3 E. m/ q( P
    105. . {0 d: j8 `" A" o' `# R
    106. // app/Controllers/Login/ShowIndexPage.php
      ( Y$ [, C2 J. I3 }
    107. namespace App\Controllers\Login;
      ! D* y0 T+ ?7 P( o1 n8 R: u6 e
    108. ! s/ f( H* @, g  }0 g0 h7 N8 }
    109. class ShowIndexPage extends AbstractLoginPage
      ! e- W8 ?) h4 A
    110. {
        H9 I. ~* r5 R
    111.     public function show()
      : S  ^+ C# [' k$ P% v+ a
    112.     {
      - B; H: k/ I& z) D3 Q
    113.         // 實現登錄頁面顯示邏輯0 ]6 ~, J: f( @+ S; U
    114.         return view('login/index');: ]1 B; n0 p2 f: A/ r) g* G
    115.     }: p" S+ i2 Q) ~/ t& p: p
    116. }
      6 P. O8 m" v9 y' V9 E8 A! i% f4 @* B
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2025-7-15 09:55 , Processed in 0.016770 second(s), 9 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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