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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14968 / 14968

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致6 r& l5 s3 w+ f5 H) @6 b; w: }
    AI 就是站長的最佳幫手。
    - M+ O: o3 p7 L, b3 }
    - U/ j8 n  J$ A6 C3 I3 A7 d( x! v+ {1 S) Q( x! {+ I
    這裡的「新架構」是指後端的架構會有大變化4 q7 T7 g7 B5 X
    但前端的 UI 介面玩家不會感受出來有何不同2 ?1 r# l: C$ O# Y8 {) }
    9 J" M# C8 B- ^  i/ V: J; b

    9 V: z& `' q2 H- H9 V1 R/ }  N  E為什麼站長要改成新的獨家架構?9 E% k3 l3 k4 y
    就一樣由AI模型來解釋清楚吧。# j: l2 o5 D5 @, h  ^  P6 b2 @

    5 [- v7 Y& s: C  A4 K" g3 p8 ^* c- c1 D, G5 J  N
    讓我分析一下使用純 PHP 和使用框架的優缺點:6 t% [- u- _( X7 j
    純 PHP 的優點:
    + S' [3 f3 f) f' r: {1.        性能較好 - 沒有框架的額外開銷
    3 |8 g7 F0 u( B/ u% `, Q7 Y' z2.        學習曲線低 - 只需要掌握 PHP 基礎知識5 b- |# D& U1 p( E) {5 @
    3.        更靈活 - 可以完全按照自己的需求來設計架構
    2 \5 O% K6 \$ L' b+ n4.        代碼量小 - 不包含不需要的功能模組
    : H5 m0 u4 n" j0 W, V" s5.        適合小型項目
    : R- X4 u6 \- b" {4 i! R純 PHP 的缺點:1 Z3 @# M1 F* N) X0 z
    1.        需要自己處理很多底層細節/ w# ~5 A0 R1 o- j! ]
    2.        代碼複用性差
    ; v0 x1 N' k6 R% s1 n9 l/ V3.        缺乏統一的開發規範4 s/ t/ d! z; F" M$ j
    4.        安全性需要自行考慮和實現) s1 s! ^1 H/ [% h; r
    5.        開發效率相對較低
    2 ]) B) _! e; n( `6.        維護成本高2 `$ x& v! M* q# Z2 E
    使用框架的優點:& l) g: U6 p$ a. [0 M' i  M
    1.        開發效率高 - 有現成的元件和工具( z1 [+ Q5 k7 [* A3 V6 i
    2.        有完善的安全機制
      Q2 q: B" y! Y% R3 \: x3.        統一的編碼規範
    ' F1 e9 {- x# [5 v4.        易於維護
      q9 {1 i% s( B5.        有活躍的社區支持
    ; V; ]+ V# d- E; w" }6.        適合團隊協作
      Q0 C2 ~5 z4 E2 |7.        自帶很多常用功能(ORM、緩存等)
    6 Y7 k& V3 \+ k使用框架的缺點:3 ]4 E8 h! G4 g
    1.        性能有一定損耗/ y! R! D& k: v" J) T  K
    2.        學習成本較高+ Q$ V$ I( o2 b- g9 y0 J3 y( |) k! p
    3.        可能包含很多用不到的功能
    ' S0 H. r1 J) k. X' q4.        不夠靈活,需要遵循框架的規範
    & s. Q7 z* }& |  I4 O1 e2 B5.        對小項目可能顯得過重
    & z3 U: [, w4 E: U% g1 O5 h建議:
    0 }' n4 N: R$ L8 Q( i, B1.        小型項目或學習階段可以使用純 PHP
    $ F; j; d& w* _) v4 Q2.        中大型專案建議使用框架
    3 V2 {/ B. k% d- c3.        選擇框架要根據專案需求和團隊情況: ^( ~/ L/ ^0 |" W
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇; G. s7 ~2 O2 {4 u* B0 X% D# n
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    + P  D7 c/ S; I2 W5 c
    5 T& [0 _' d5 O+ \9 O, A- A& Q! i# G6 Q

    ; j! ~1 S8 ^) y我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。: `8 s+ {4 k' q

    , C6 Q8 B: }0 t, N6 Y8 t* o這個轉換主要做了以下改動:9 B: x4 p& v' c' P- ?1 t; B4 i

    . I( w! b6 \* H, H1 N$ m* [8 _路由結構:
    3 \1 v$ @  k/ S# V' ?
    . x% s1 ?; ^* ]2 u# h1 p4 R$ R2 w使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下0 W+ ]. J9 X& a7 i, z6 P
    支援原有的 page/mode 參數結構
    7 `7 ^7 V( v$ N. y, L通過路由規則自動匹配到對應的控制器方法6 J7 ~3 H# k( ^8 s$ Z

    5 z3 ?' t& }+ `6 g% V$ q* E" b7 @9 B' s4 J+ g3 Q) n1 W1 x6 e% m( a
    控制器結構:7 q4 Z' r. X! C/ H' Z& B& y

    % U+ h  e2 y. C% ^創建了主要的 LoginController 處理所有請求4 x$ i+ c, R9 A  z# I4 e7 O# o& d" q
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範# |* h5 g# h+ K4 ^# l7 Y
    錯誤處理改用CI4的視圖系統0 J6 G7 A/ A( l
    1 a7 `! w1 o0 S( }2 W6 b* }
    - d, Y9 S; n8 B1 V! i( m
    類的組織:: L. |. y( {& ]( O
    " m0 c& e: L4 F! a, ^5 c
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下7 [3 o% \  t5 G7 l/ a) g5 y1 \
    保持了原有的類繼承結構
    , u1 l3 X$ H' ~改用CI4的控制器基類和特性
    " w! O; D, I) d3 i4 Q7 t+ w: y) B
    1 A" }( {; ~# U" N' `
    改進的安全性:% N2 l  S3 }9 `7 k$ Z( q
    6 c' F0 H1 g/ F* L/ t
    使用CI4內置的安全特性, S6 y& L0 L. m! r6 ^# z; }6 B
    更嚴格的輸入過濾
    * @: _; m7 B) h更好的錯誤處理機制
    - X0 h- I. e/ \( F+ `+ }: b: S/ E! C9 X8 W8 L
    ) b, N7 a! c, M0 R, R

    # c. e$ y9 i8 L" P0 a- b& B要使用這個新結構,你需要:" p6 _; f9 E# D" I
    ! A* _" r: X0 p/ V* X  N% ]
    將這些檔放在對應的CI4目錄結構中! y0 i3 R& e* Q9 R$ {* g! {+ ~. k
    確保創建相應的視圖文件
    5 w  Z8 p9 p* d) `+ o: }8 E配置語言服務
    1 J6 {; k7 Z" z2 l- _( u3 ^0 w根據需要調整模組檢查邏輯
    : D& m6 X  ?5 R
    " R7 [- \+ p4 }0 b; d需要注意的是,你可能還需要:
    # Z" j) V1 L9 q0 c" h, H+ N7 _0 K5 H2 O. u+ e) y; T
    創建相應的視圖檔(在 app/Views/ 目錄下)
    ) ?) |: S! U' [. T配置適當的中介軟體來處理會話
    5 \. m" [: Q! K3 T1 x1 A7 ]; K實現具體的登錄邏輯- D4 u) S8 ~* ^2 u" x/ `8 v- @
    3 ~" n$ t  W+ U2 x! ?4 o
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?& g4 r: Q! f% L1 ]
    & X# X% N4 M" W
    1. <?php, q" L  N: k! C1 m: ?2 e! i; P& F
    2. // app/Config/Routes.php
      5 `7 s0 a7 C6 M. O: e6 O
    3. namespace Config;
      5 M& Y3 G) q9 w. R6 H( z

    4. 7 t. l0 h' `' ~( ?5 Q7 ]" u
    5. $routes = Services::routes();5 a6 G5 {% W0 W: h7 Y2 M
    6. + h& E/ l7 J. ?# r
    7. // 添加自訂路由規則
      ) V6 C1 G: }, [2 U+ v* U2 O  |
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {+ Q$ S( J0 j3 p: P
    9.     $routes->get('/', 'LoginController::index');7 G2 Z8 E; c% d" X/ u1 B
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');3 S/ h3 P8 |: B$ ]* S- h' O; N# T
    11.     // 默認路由處理# `* D5 m! z! X, E
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');! `; E$ Y: k" |# j0 {
    13. });- g0 Z- P) q" B; R0 t# k' ?4 H! A% b

    14. 0 `) }; s; m0 M( p
    15. // app/Controllers/Login/LoginController.php2 Y! Z% b1 `9 ^5 z4 u( R; L' w
    16. namespace App\Controllers\Login;
      ; i9 {# i6 L) U& O
    17. 3 l/ h+ [+ i) X1 x3 G7 w
    18. use CodeIgniter\Controller;* s/ k! F+ r1 q) L
    19. use App\Controllers\Login\AbstractLoginPage;
      * g' S% u5 @+ f
    20. ! Y, ]! K& _' l6 N3 T
    21. class LoginController extends Controller
      ; F- `/ n/ ]5 V9 G& d
    22. {
      8 ^; W5 f0 E! J$ L
    23.     protected $pageObj;! M+ d3 L- k9 C: G5 b# Q/ E+ i
    24.     protected $LNG; // 語言物件
      * M  r  V. Z. }( e

    25. * r3 r: o5 d) W+ q. v
    26.     public function __construct()
      2 `6 e: L  z$ y3 j1 A0 Q& T
    27.     {' k9 x8 d5 E) [- S
    28.         // 載入語言檔和其他必要的依賴( m/ n2 K) ~5 P4 [) W
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務! f3 t1 V  X& a, U) U, O
    30.     }* O4 N# d5 Q7 J# |
    31. 2 X9 k$ n$ G: j8 H( Z0 F" p
    32.     public function index()
      6 Q% i6 G, l' @3 r5 z
    33.     {
      ) ~" k/ ]3 O' R( z) }/ D9 O
    34.         return $this->handle('index', 'show');
      0 Y6 H5 k1 L5 w1 b! `
    35.     }% ~: X; w* ]! h4 l, K5 L4 X
    36. ( W% e8 O% h- X
    37.     public function handle($page = 'index', $mode = 'show'); N$ [" h3 g5 H6 R
    38.     {7 W% ^! O# ]; P1 ^
    39.         // 安全過濾頁面名稱
      9 i: u. Y. b/ ^$ X# ]. s
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      , V& @4 `& P4 ]" X* D7 |# n
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      7 o% n. K) ~) b0 ]6 o
    42.         
      $ a9 R  Q  q) Q8 }0 r, k
    43.         // 檢查類檔是否存在& [% i  W; W# S8 K% {: N) M5 D
    44.         if (!class_exists($pageClass)) {
      : _  O  y3 R* _3 {. ]
    45.             return $this->showError($this->LNG['page_doesnt_exist']);9 C  \: P/ B8 k9 h6 r
    46.         }- [6 O* n" s' S! U) m7 H3 w

    47. # o$ u" l' H* J* V% |7 v% m
    48.         // 產生實體頁面類
      3 j5 Q) j# D$ C4 W, Z) k3 a3 B1 i
    49.         $this->pageObj = new $pageClass();
      7 q% T8 S$ k4 S
    50.         
      4 W2 ]/ E$ e" {2 [
    51.         // 檢查模組要求
      5 [0 a2 y# L2 e; [. L' F: j4 J$ p
    52.         $pageProps = get_class_vars($pageClass);9 n: u) M& a$ l
    53.         if (isset($pageProps['requireModule']) &&   P. p0 s5 K0 Q; T
    54.             $pageProps['requireModule'] !== 0 && : K- n& Y1 T  V! |+ {# w
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {% L* G$ x2 H# \$ {
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      6 [# j" u6 [6 n* A' `' ^9 j& d7 c
    57.         }0 O3 g5 x, R  {% \. d; U
    58. 9 j. E# q2 i0 W: h( S$ G
    59.         // 檢查方法是否可調用
      ; e" _9 ]0 G+ |* f0 S2 S2 u5 Y
    60.         if (!is_callable([$this->pageObj, $mode])) {. o5 v& N7 Q( B. V. Z0 E, d" @2 \: [
    61.             if (!isset($pageProps['defaultController']) || 8 S4 c- u1 X' q4 ]
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {/ r9 _  N6 ]1 g* B% L5 d
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      5 X0 j7 `" [6 C* Y6 h
    64.             }
      $ \9 ]. R$ C/ `% I+ E
    65.             $mode = $pageProps['defaultController'];
      6 K1 w+ [0 k! [) J) x
    66.         }4 {# Q: o9 |" N) t9 ?, Y; n* U
    67. ( L( b1 M- O4 Y
    68.         // 調用相應的方法
      0 r' A' q' T1 d0 f9 R) X
    69.         return $this->pageObj->$mode();( s( c+ c7 W3 r. r* T
    70.     }# K; R$ j! F. @# T  q, {

    71. . v( `' O5 v! }! Z9 c
    72.     protected function showError($message)
        q3 z/ _4 C/ d
    73.     {9 b, Q' Z1 J) }& y
    74.         return view('errors/custom_error', ['message' => $message]);0 M! ?1 R' y- y/ v# w
    75.     }, z0 r% w7 {8 r0 l# j' B
    76. 4 `+ {9 ]; U1 \& w' f% U
    77.     protected function isModuleAvailable($moduleId)$ K# M9 p7 K9 s" ^3 P! ~
    78.     {1 L* D6 D' s) z; z. a6 Z7 \/ m
    79.         // 實現模組可用性檢查邏輯  r) y1 A9 n8 o/ P1 \2 X4 p
    80.         return true; // 根據實際需求修改
      $ y  A3 i/ t5 \# ?! _, D
    81.     }
      - e* s3 K2 o  c, X7 n, T2 e# V
    82. }
      " p4 q# `  {' e9 D- G* X- B7 Z

    83. 6 B5 p% @, W3 d$ _
    84. // app/Controllers/Login/AbstractLoginPage.php
      # w1 j2 }8 |% F- z, D
    85. namespace App\Controllers\Login;# h( M* R* I* J9 @; M

    86. : Z- p3 }! p8 ?0 h5 }
    87. use CodeIgniter\Controller;7 v. Q5 w; A7 j) ?* m' A7 }& R( N

    88.   I# P$ s  l7 t' L' `
    89. abstract class AbstractLoginPage extends Controller
      " Z' a+ j2 c) p: U+ \
    90. {
      : r$ G8 }4 f& V9 W2 ~; h+ m
    91.     // 實現基礎登錄頁面功能
      ; C+ R- \( P1 l) j
    92. }# F% c5 ?4 c$ d* d7 y# T

    93. / L; m3 J0 f5 i2 C
    94. // app/Controllers/Login/ShowErrorPage.php/ A8 v. n- z' B+ P
    95. namespace App\Controllers\Login;
      7 x- i( E3 Q/ _2 W$ ~" R8 F1 r& P' I

    96. : ]% o; Z9 d1 C4 A. {7 |
    97. class ShowErrorPage extends AbstractLoginPage. x$ |" N6 z, Z* K- c- ?' G
    98. {
      - c! B- [& r1 S/ s5 T9 a7 Q3 u5 x
    99.     public static function printError($message)
      % I: ~% F7 D. q( o. V& G: B
    100.     {
      , n& t5 Y" b2 ]) ^
    101.         $controller = new LoginController();
      9 F% K' @. Y) q3 a- n
    102.         return $controller->showError($message);* l. w) c" q* Y" O, }& K1 |5 Y
    103.     }
      4 }  |, u( t# ]  J% f4 P
    104. }' z- `( _% r0 b: O2 T) x

    105. ! a" x! J- M6 p! t1 T) U' g6 Y: W5 `0 a
    106. // app/Controllers/Login/ShowIndexPage.php1 s3 S! F( J* {8 Y& S3 ^
    107. namespace App\Controllers\Login;
      9 }$ X. t' W1 q4 T7 ^& p4 F( u

    108. . Y4 R- a! j! D: H  w
    109. class ShowIndexPage extends AbstractLoginPage9 f- v: ~0 \3 Y
    110. {
      ( D5 d+ `& t5 \4 Y! g! K# z) t& ~
    111.     public function show()$ S" \/ E9 a5 h1 |
    112.     {3 y2 C" I! \6 x, }# x
    113.         // 實現登錄頁面顯示邏輯1 u2 _5 Y" O4 g. [/ h: A' ~
    114.         return view('login/index');
      & U! G' Y: h3 Z1 c1 j2 p
    115.     }
      . i( n5 r# f# C' q) V9 ?( [' I( i
    116. }
      7 W- d2 V% G8 Y
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-7-12 08:05 , Processed in 0.010859 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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