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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14977 / 14977

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致7 I) a8 N3 _$ {% Q. ]( A
    AI 就是站長的最佳幫手。
    ) C, Z1 P; r5 P8 {+ c; E' g# k. h( q& @/ j
    " ?4 R& V8 ~$ h6 b! s
    這裡的「新架構」是指後端的架構會有大變化9 K  B% P# s) l: H
    但前端的 UI 介面玩家不會感受出來有何不同# t$ {4 `  U0 r
    " l* x# v, W7 G' \4 z
    8 Z2 r- ~. U- N2 H% z; D. U. E2 `, r' R
    為什麼站長要改成新的獨家架構?: k9 J  u7 ^5 \% Y+ E, }9 t( r5 S
    就一樣由AI模型來解釋清楚吧。
    4 h5 e+ L# l- q& ]
    + Z% k# p3 T3 N4 ?' X7 A/ a( x" B! ~5 L9 Q
    讓我分析一下使用純 PHP 和使用框架的優缺點:
    ! N$ n' B- W9 q  ~% A5 r純 PHP 的優點:
    / ?" r5 h5 B) ~6 ]9 f3 h! l, d/ Y& `1.        性能較好 - 沒有框架的額外開銷
    ) ]7 m; O, Q7 u2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    . d) |& T/ J2 d) k- \3.        更靈活 - 可以完全按照自己的需求來設計架構
    ! P8 j) m& H+ o4.        代碼量小 - 不包含不需要的功能模組- ?" W! s6 q- H5 m1 A9 K$ l) [
    5.        適合小型項目
    $ v' \3 O# f, }純 PHP 的缺點:  Y; G" ?& Z: _  r' T  }, L6 `0 `
    1.        需要自己處理很多底層細節
    8 t2 D, b# M3 a: K! Q9 x0 Q2.        代碼複用性差/ V$ {4 M6 E3 R3 C
    3.        缺乏統一的開發規範
    # k4 P: b3 t' s% L3 j* `4.        安全性需要自行考慮和實現
    " t; {4 d% ~, |1 N5 ^3 x6 I2 e5.        開發效率相對較低5 {" V: U& ?3 c/ C! Y
    6.        維護成本高
    4 m: g6 M9 V  d; ~7 N使用框架的優點:: W% n, w5 L* N7 @8 m/ v# [8 I
    1.        開發效率高 - 有現成的元件和工具1 l- j; d4 ^3 K( }
    2.        有完善的安全機制
    4 k4 d$ }6 s. o4 N& ^' Z3.        統一的編碼規範6 w, c3 F$ l6 i# ?3 _1 |
    4.        易於維護2 X  k- W5 F3 M
    5.        有活躍的社區支持$ x! C* R. u- f$ @" h0 R% r7 f
    6.        適合團隊協作
    # l. Y; \- x6 z5 L4 S! S; S7.        自帶很多常用功能(ORM、緩存等)
      Y9 H# o. k' s. U使用框架的缺點:% s5 E) R( b/ H1 k" E
    1.        性能有一定損耗+ u8 g, \% T7 @, J- Y% J
    2.        學習成本較高2 R, G2 }) ?2 f7 {& o3 U! T# a
    3.        可能包含很多用不到的功能5 R- Y  \# Z* ]+ N& c$ F! g
    4.        不夠靈活,需要遵循框架的規範' b: R0 `( J6 t2 m
    5.        對小項目可能顯得過重
    " d9 w' k5 `* B建議:
    - x$ F* A8 d# s& \: {( n( a1.        小型項目或學習階段可以使用純 PHP1 D3 F) w; r& h1 d" R' x5 r# l
    2.        中大型專案建議使用框架
    4 B# w) U+ y/ e" |, [3.        選擇框架要根據專案需求和團隊情況
    * S6 Y% k5 X5 [3 v% N4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇. [; q0 o* {3 @/ B; n6 B( e
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    9 J$ u2 n5 h" U/ z
    1 R1 y" D3 B3 M' E4 P4 |5 y( T! d( T0 F  K% F  |2 o9 `
    ' m$ v; I# n# y& f- _  K% ~
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。; g1 c6 R* H9 u% a6 o
    , p9 y! i. P9 q( Q9 }- x7 m7 }# P) y
    這個轉換主要做了以下改動:
    " L: e4 z1 K) A! [# C, C8 Q) E$ Z# r' M5 ?- M1 r+ B
    路由結構:4 j% d# `' ^% _% f
    * t% X$ k5 ^3 c, |; M- U
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下/ Q7 e) I8 y% y6 o( J3 i& l; v# @' Q4 p# W
    支援原有的 page/mode 參數結構- u  H6 x3 `0 B- T
    通過路由規則自動匹配到對應的控制器方法
    / |, w* Z* D: P6 a5 O) Y' A* l" s% ~& ^) |. @5 C! a9 k

      R% Q# j0 k, @: h% q9 N控制器結構:
    9 H$ D& \( G; i8 E1 r! r5 o6 g! |/ h3 j9 `/ q& P
    創建了主要的 LoginController 處理所有請求
    2 D& A7 ]. ]! `+ s: Q保留了原有的頁面類結構,但改為符合CI4的命名空間規範$ Q3 f) x" c5 f# ?7 \& v$ X- q( v
    錯誤處理改用CI4的視圖系統
    / |$ x5 W$ ~7 m7 S, l+ A+ S- M
    2 A) K' u# W+ x
    $ e& _9 f) ?. F; R7 ?類的組織:
    * D2 Y4 }7 c9 E8 ~( _2 ^, N9 x. [( h. N1 C: A
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下8 k5 P% ]1 _1 Z" l
    保持了原有的類繼承結構& A+ U. H# A9 K. c' d4 [
    改用CI4的控制器基類和特性$ _7 x- A( z  q
    & B! ^) `: n1 f! {; T  n0 `3 h
    3 v1 Z3 z- X1 @
    改進的安全性:
    , d$ t! ?8 A; K+ R
    6 G9 `, t& @, Z使用CI4內置的安全特性$ g1 s9 h$ R  B
    更嚴格的輸入過濾2 u  j, r4 d* d( e, {7 A* ?
    更好的錯誤處理機制
    . c  N# @) i( o" H/ G" F0 B7 E4 a# O. h0 G+ \# G) {' M: v! H! U
    1 V6 Q9 _% |8 L
    7 F3 R: N0 i( c$ p) N
    要使用這個新結構,你需要:
    - F# b& ~- B$ N. V8 J
    0 Y' m8 G: M2 \) M: \3 V# y將這些檔放在對應的CI4目錄結構中
    5 x7 w$ b; ^9 Q/ ]! j確保創建相應的視圖文件
    : ^  Q0 U( m( o4 b配置語言服務: B( k$ y' u0 r  K% |3 l/ V9 l
    根據需要調整模組檢查邏輯4 B" M% b& u: m* R0 }- g3 p

      r9 _( u5 l& S4 ^- D- V- Q需要注意的是,你可能還需要:
    ' q4 {5 d% f8 {: P
    / E5 H- y- `1 x: P4 P# Y# S% W創建相應的視圖檔(在 app/Views/ 目錄下)" ^8 u! ?, z0 @: Y/ }7 [
    配置適當的中介軟體來處理會話* n( w4 B2 @4 e1 G3 V5 ]
    實現具體的登錄邏輯
    " ]" P+ S. W) T2 h4 k: a
    / D' g/ p9 K' O* S需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    " E( Y' Q4 j7 c# v- L2 Y5 _8 R% F# c7 P5 V( k7 ^
    1. <?php! M5 f& @9 p5 z- T9 b! ]8 ^
    2. // app/Config/Routes.php6 ]! w0 R' n( S
    3. namespace Config;
      : a# S, v& ]  m0 e2 Q. E- {( f! ]6 G

    4. ) K% q2 G' f+ j1 R
    5. $routes = Services::routes();
      . U( K- k/ h2 \3 I/ I0 r

    6.   s- P& N3 k# t
    7. // 添加自訂路由規則2 B% }& ?5 \. y% h) I4 {; z; q
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {# H1 @, F& `  J* ]* w1 C
    9.     $routes->get('/', 'LoginController::index');: g7 O+ j& F9 K! j1 [8 \3 A2 ?
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');4 Q5 n/ |% i6 Q- K% J5 G' r, c* X
    11.     // 默認路由處理
      + ~* C$ Z0 I- z; z8 U# O$ S& l
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      5 B1 t+ W2 t" `% B, x8 t
    13. });
      % X0 \* Z4 \% t# a3 q6 t- f1 J
    14. " |4 g6 z$ j  D* p+ E; Z8 N5 K
    15. // app/Controllers/Login/LoginController.php
      + n' M6 l1 O3 o: G- o7 @1 y% L3 l
    16. namespace App\Controllers\Login;
      ' N, S  Q  p; j. n) D1 D  J$ S
    17. 7 l- ]% c$ B7 I  K
    18. use CodeIgniter\Controller;
      + E. E5 i- F4 u8 b7 ]% B. _7 ^' \# q
    19. use App\Controllers\Login\AbstractLoginPage;
      + w/ c) a. g$ v# B  G5 c
    20. $ X5 P* @( a, y7 `! u  c! e8 D8 B
    21. class LoginController extends Controller
      * {# ^0 C, |. _1 M' n
    22. {
      ; o& u  P& z9 B9 G' V) f
    23.     protected $pageObj;
      ; [  y9 ^% e/ ]: \' d  O- R0 |
    24.     protected $LNG; // 語言物件$ E0 |0 C$ }3 C% x  t) g1 m
    25. . ]+ W7 a: g+ n& M8 O) n( t. a
    26.     public function __construct() 9 q" e& Y  u1 }5 q+ S
    27.     {3 i$ g! C6 B: r3 V
    28.         // 載入語言檔和其他必要的依賴8 B. B  [: K2 Q
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務; X2 E' l& m5 H  d& \5 t. ~
    30.     }
      . K' `7 m9 s1 {, @& f

    31. / ?* S! K% e( r7 h0 H+ ?6 `8 k9 k
    32.     public function index()" r" q+ n9 I9 d. l
    33.     {: G% X3 l0 m' X4 V
    34.         return $this->handle('index', 'show');
      . [! Q' l8 A0 }
    35.     }
      & ]& y$ {+ T( e3 K8 d# z

    36. . a0 t% |3 h# ~4 F6 X' q  [: Q
    37.     public function handle($page = 'index', $mode = 'show')& |7 C& l3 _- j, _+ Y' o# `% k0 K
    38.     {
      2 d. ~7 ~$ Q% B: C  @( T
    39.         // 安全過濾頁面名稱
      + y7 G; k; W- f
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);& B8 o1 p3 j8 v# y  h. Q( s6 {
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';
      - F( T: Z" ]5 d- J
    42.         
      . H* T' p& D+ f! R$ _6 v" h
    43.         // 檢查類檔是否存在
      4 p* r) d! Z( M- ^# `  x8 U
    44.         if (!class_exists($pageClass)) {
      , |. M9 L+ d" M( j! D
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      + H6 z& x, g  o( U- s
    46.         }
      ; [5 u1 N( E) t
    47. 6 f" S- o/ U3 [% q4 B
    48.         // 產生實體頁面類7 I  a' q4 v3 K9 \$ A  D, T, J$ E: P9 P
    49.         $this->pageObj = new $pageClass();
      ! D, R2 `- K# k2 D) K4 ~
    50.         4 u8 C) [/ ~9 S4 c4 q
    51.         // 檢查模組要求
      % A& r" ~* {9 F" s! Z& G
    52.         $pageProps = get_class_vars($pageClass);2 p! I; D5 R7 e6 ?
    53.         if (isset($pageProps['requireModule']) &&
      7 X% }* x7 w- _2 Y
    54.             $pageProps['requireModule'] !== 0 && 6 x& O% V. j- d3 p% l
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {! O/ d3 `2 I3 F) }9 X
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      4 |( ^8 F7 `& W4 H$ ]/ M2 v3 `, I
    57.         }
      8 ?9 T" T) y2 v: ^! `
    58. 9 {8 r9 K) Q+ d( l$ @" i: j
    59.         // 檢查方法是否可調用
      1 D, q  [5 M) v
    60.         if (!is_callable([$this->pageObj, $mode])) {1 m' D/ N; d5 [3 w! r; Z
    61.             if (!isset($pageProps['defaultController']) ||
      1 p- ]4 w  G+ C* j9 P
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {1 H4 V& H' L3 x: z. X
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
        j5 @$ c1 X$ c2 H$ J8 n; i
    64.             }- A! v* ~% {! E  ^! A5 w: A) j
    65.             $mode = $pageProps['defaultController'];- _! p/ B* l3 `1 ^6 W$ m* |. b
    66.         }
      ' V* z; ^" R0 M0 j
    67. ) T/ p' q# T' n, J
    68.         // 調用相應的方法
      0 R" i9 N. q# h! U( N
    69.         return $this->pageObj->$mode();: i1 m2 z1 F2 H) e% D& C
    70.     }0 e# |3 V4 V3 Q( T2 R/ R" C9 t

    71. 2 S, s1 b; t: f/ g- {6 Y7 q
    72.     protected function showError($message)& Y; j& ?% M; O2 m& y& {
    73.     {
      & D; J) l5 B+ h$ j2 p
    74.         return view('errors/custom_error', ['message' => $message]);
      + ^2 |+ ^$ w9 M: W0 t7 F8 B" P
    75.     }, l, D# A! v& M/ ?9 \

    76. 9 R/ e  U2 |8 C2 U. K
    77.     protected function isModuleAvailable($moduleId)
      ; s+ n+ W; m7 `. u8 i
    78.     {
      & V; m5 q: d- I" e- C3 E7 \
    79.         // 實現模組可用性檢查邏輯
      # E  m0 n( q2 T# ~* D" w) W* r4 B
    80.         return true; // 根據實際需求修改+ t/ i. g) }3 d8 f# _6 h5 G
    81.     }
      % d0 m' Z) D/ F* \3 m" o" X3 ]+ b
    82. }
      ! X1 @" I$ V0 V2 `3 c( s9 i
    83. 3 s& F, W. R$ w; l
    84. // app/Controllers/Login/AbstractLoginPage.php7 l6 |# [  u/ |6 ^0 U. D. `* O5 r
    85. namespace App\Controllers\Login;
      8 C7 L: k/ z& h3 a1 m- n
    86. 1 F7 h% m# T" k$ q1 z; P6 E
    87. use CodeIgniter\Controller;! E( L9 j' b& I8 Q

    88. 5 z5 G& L9 b& E& y7 j, B
    89. abstract class AbstractLoginPage extends Controller  M( B5 H/ ?% g; V
    90. {
      , u: j9 ?+ G- R( E9 K- [
    91.     // 實現基礎登錄頁面功能
      3 w' b  a; y! X
    92. }+ j: C% t$ i5 p8 N+ B) B- T
    93. 3 ^5 v" }2 `2 L, F& s( Y
    94. // app/Controllers/Login/ShowErrorPage.php& t: f. m3 R  z  d& F; w. g" R
    95. namespace App\Controllers\Login;* x. M3 |; c9 @$ {" x4 Q" |
    96. 8 P  B7 {4 @- p
    97. class ShowErrorPage extends AbstractLoginPage* h4 q. W; y! I9 i% Z! I+ v
    98. {
      * u6 y6 ?3 h3 U' Y6 n8 e7 H; p
    99.     public static function printError($message)
      & t" h" }7 U8 @% e0 W% H8 l
    100.     {7 {! N% F8 R' o) Q, x4 W
    101.         $controller = new LoginController();, I6 Q7 }- b: b/ J, z( g
    102.         return $controller->showError($message);
      $ c7 e, |. L, r3 N
    103.     }; z; F# i9 G" X, X$ }' o8 a- D
    104. }
      9 s* ~' j* ^: [: i6 q& i
    105. ) X! A# Z; z5 X$ a  _. N
    106. // app/Controllers/Login/ShowIndexPage.php
        K. c- V" U. A# [
    107. namespace App\Controllers\Login;
      ) p, e! a* w* O- A% J7 K/ c

    108. , A- m% k8 t  R
    109. class ShowIndexPage extends AbstractLoginPage
      / x9 r! C$ S+ |+ G2 v# p( E  T
    110. {
      8 [+ F# m* r0 B# J6 U5 g8 R
    111.     public function show()" ~/ G$ y5 `2 N, X! {* L; K7 K
    112.     {
      + J: r. I0 d: E! |% Y/ Y" f8 y
    113.         // 實現登錄頁面顯示邏輯5 }5 a" U$ X6 C
    114.         return view('login/index');; J4 c& A0 C4 `- M' M: x
    115.     }; g" p, S3 W9 @
    116. }
      + N1 W' M2 t/ l5 E# @
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-7-15 10:14 , Processed in 0.011291 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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