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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15087 / 15087

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    ; I. P. D, r% ?AI 就是站長的最佳幫手。8 a2 ^$ W4 C2 R. ?4 M

    # g+ F1 L4 q% H1 y! o& c+ H# `+ I4 x0 T
    這裡的「新架構」是指後端的架構會有大變化2 T' b" j& U8 u! w6 r3 Z
    但前端的 UI 介面玩家不會感受出來有何不同3 F; a; C+ L1 z7 S" g

    " a: B+ Q* U; p+ s5 M
    7 r' [0 T2 [% f$ [5 n* a為什麼站長要改成新的獨家架構?
    : n; x/ J6 n7 j- A3 j4 I3 ]1 w% _就一樣由AI模型來解釋清楚吧。# Z6 ^9 W, K8 c

    1 s* c' G+ b3 ^2 b9 k% P' L" e) b8 ?
    ! V" u  K  o. u' A) I' K讓我分析一下使用純 PHP 和使用框架的優缺點:! v4 {* }5 S& f% D" H
    純 PHP 的優點:
    5 E' C4 b8 A& \9 p/ {$ O9 A( o* g1.        性能較好 - 沒有框架的額外開銷
    ' t0 w6 s8 ]5 g: s2.        學習曲線低 - 只需要掌握 PHP 基礎知識  c0 l" G: Z; I' U
    3.        更靈活 - 可以完全按照自己的需求來設計架構% h/ G% M0 ~; ~
    4.        代碼量小 - 不包含不需要的功能模組, s8 S' H+ G1 V6 r- E- y: A& [
    5.        適合小型項目
    1 S8 }( I( H( J/ I' N純 PHP 的缺點:
    & A+ [( R  y  O  J. Q1.        需要自己處理很多底層細節, c1 q7 X- j: T4 r% R% u" d
    2.        代碼複用性差" _* g) n- c2 C3 v8 _3 j6 p! G  A
    3.        缺乏統一的開發規範
    8 n) |( u8 {; |$ A% Y2 f4.        安全性需要自行考慮和實現
    + r: R1 P0 Z7 i( p; O5.        開發效率相對較低
      s0 [, t  m/ o0 e" O4 z( @4 {5 A6.        維護成本高
    & ~3 u7 q( J1 D/ a: c使用框架的優點:
    4 _/ P6 M" a  S( \- F/ I1.        開發效率高 - 有現成的元件和工具
    & J/ S0 Q( I2 d, `2.        有完善的安全機制
    . W2 a" u2 P+ X' V4 n# S3.        統一的編碼規範
    7 f. g" E# n- w. g7 L+ d0 y3 C( n4.        易於維護9 Y6 f( I) T, m3 x' T
    5.        有活躍的社區支持. F  N0 ~( v' `/ S: I0 B$ u8 ~
    6.        適合團隊協作
    ; [; L& e) m+ z) p" O9 v1 U5 i6 }  G7.        自帶很多常用功能(ORM、緩存等)4 f! b9 N% M7 V- z+ s" V7 f
    使用框架的缺點:( {/ W7 `  c5 ~4 P6 t
    1.        性能有一定損耗. M9 w, `4 ^# T5 ?. N5 B+ r/ Y
    2.        學習成本較高# @& h. F7 _( t5 B; r$ t
    3.        可能包含很多用不到的功能
    . Z2 g. |$ u7 s% S" V0 y4.        不夠靈活,需要遵循框架的規範+ ?( H7 ^+ Q& N
    5.        對小項目可能顯得過重! ^2 i5 x& h9 w" Z: V. u
    建議:
    1 h+ l* h6 P1 W8 q1.        小型項目或學習階段可以使用純 PHP
    ! K6 [) V. t7 G# Y: I: B2.        中大型專案建議使用框架
    ; [- ]# O; m+ [: x3.        選擇框架要根據專案需求和團隊情況
    : M' c+ x1 |5 J1 V8 \2 N+ h4 x4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇+ _  h/ r4 X8 |
    您打算開發什麼類型的專案?這樣我可以給出更具體的建議。4 I/ e1 O5 O, i- A$ I: C

    7 P7 H) s0 \& I+ a+ u% q2 f3 }7 _- V. G

      d) N$ q; Z4 f# U8 F$ |我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    & V! s+ C9 @% r; i$ m' g' }! |
    + u  A1 m5 g( `9 T" _這個轉換主要做了以下改動:
    & n9 p. c2 N) ^: G5 [& M8 X3 Y3 D7 d! ^  u
    路由結構:
    3 o. K% X1 C" d- d! o6 Q- w
    ! ^- e1 J) C4 e7 O5 v- S使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下# ?6 U% o" j$ J1 S6 t
    支援原有的 page/mode 參數結構
    / f* l1 C4 v7 |4 C6 x9 L2 R1 s) r通過路由規則自動匹配到對應的控制器方法
    ' a& v% {# i* o9 R; l3 ?( \7 y4 q
    , k% I# x8 [& V" F$ r8 p7 c
    控制器結構:
    5 F0 Z) x+ \" {- f; ]1 |0 o" r; h" P# D4 ]1 |0 a+ \
    創建了主要的 LoginController 處理所有請求0 D2 C2 z) P/ f% q2 g. Z# S
    保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    : Y, {& D* r& _* p5 X$ z  E7 p錯誤處理改用CI4的視圖系統
    5 H; ]  }# n) B+ V9 Q, ]# m3 \% ]7 E1 i- {- z" P

    5 w: |  v' l8 S6 ~, K3 s; G( @( ~類的組織:
    * B- ]# W1 [/ o  \$ u, [# s- N  s+ }' D
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下4 ~" q4 h/ Y& P2 Y- Z/ e: Z6 c4 d
    保持了原有的類繼承結構
    1 T# ]& H+ o  ]' L' _1 c- o改用CI4的控制器基類和特性* c5 j6 Y; t" {5 S" j! p. c

    ; K& P2 E/ y2 U; K1 G! F# R
    5 w/ \; _# e  A+ y# T( o* [改進的安全性:* g$ ?4 c. z, ~; f  t5 Y/ f

    / t/ H2 {/ m$ n使用CI4內置的安全特性  p6 Y- T# }3 {
    更嚴格的輸入過濾& d) A0 W# ^6 c0 v4 \6 H% N
    更好的錯誤處理機制
    / G3 y$ z6 \- e& E  `: p
    " g0 r$ R) B; r+ |$ w$ D4 m2 f: m2 \% K  W* H3 p! V

    + ?9 ], D( ^" H  a* @要使用這個新結構,你需要:4 e9 u0 Y8 B: ?8 ~* a
    8 `, j% S$ P8 |  F: k1 H
    將這些檔放在對應的CI4目錄結構中
    . d% x9 P9 X! I$ B確保創建相應的視圖文件
    " ]* ~8 e' h# F配置語言服務
    ; R- _, Y5 k/ O/ ]+ E根據需要調整模組檢查邏輯
    . v; L; W, H: J4 j4 K; W$ e
    " Y8 z+ ]( q; `需要注意的是,你可能還需要:
    , N$ [% u" V7 f1 n( K: Y: o0 W6 B& G# D
    創建相應的視圖檔(在 app/Views/ 目錄下)
    8 Q  s, `( \+ C& Q* @: {4 r配置適當的中介軟體來處理會話( b; u+ `4 P$ S$ ~; C" m* p  v
    實現具體的登錄邏輯
    ! {. K  {, o/ q
    1 ^  \( y+ |7 ]  g& m需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?. O3 O& B7 g! x. f

    $ b( P: O8 i/ Z8 r
    1. <?php
      ! b7 f7 s& n8 `- q" @
    2. // app/Config/Routes.php
      & q: G# \0 C. l  ~8 B
    3. namespace Config;5 Q" ]! L0 b# o4 t1 ?* ^

    4. 1 i9 I: J, b! M/ S
    5. $routes = Services::routes();
      : U& ~5 t7 B( m( K: V6 C" s' _

    6. 8 B8 c6 }5 @/ G0 `3 S4 V
    7. // 添加自訂路由規則
      + S. ]4 T' Z4 o- A! P: a& Q# _
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      , t; Q- o- }: L
    9.     $routes->get('/', 'LoginController::index');% P) @- x- R! t( H( l# d0 Q) d
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      * q% f+ f3 j9 S* C% X
    11.     // 默認路由處理( W5 O% f2 h  M+ X- _. W
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');5 r0 R) K1 E! T3 x
    13. });) `$ \3 k" c( U9 q9 b2 M) V: {6 Q

    14.   |" i( I/ G: S3 \# G5 j
    15. // app/Controllers/Login/LoginController.php) @4 o) `( q( ]. j9 f$ j6 }) G: I+ E# }
    16. namespace App\Controllers\Login;, X* E4 F* L; d) s' S

    17. , U4 |) J: Y- g: J
    18. use CodeIgniter\Controller;8 v) q: Y  ?4 `' D! ]& U
    19. use App\Controllers\Login\AbstractLoginPage;3 e: u# o* n1 t) Q
    20.   e$ q4 g/ q! Y' T* k9 \4 j
    21. class LoginController extends Controller
      , v7 W, J( @9 l
    22. {, P& c4 c& A. R( ~& y
    23.     protected $pageObj;4 a  Y6 Z3 |/ {$ c  O$ K
    24.     protected $LNG; // 語言物件
      $ o2 \6 r  H5 P

    25. 2 e2 V' I% U8 q
    26.     public function __construct() ! l2 k) t0 ?4 [& L
    27.     {
      1 Z* P2 s4 `) Z. R) H
    28.         // 載入語言檔和其他必要的依賴6 {% W8 O% z) w. d) F* r6 |! Y/ w
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      1 Q8 N5 Y( [9 ?
    30.     }7 o% d% ]5 `- c& V4 n

    31. 5 @; U- u8 T+ n0 H1 s, K4 Z, m, \
    32.     public function index()7 C# u% P5 J/ B% q0 l+ {
    33.     {
      5 s1 f; i+ ~% R) p- Y( U
    34.         return $this->handle('index', 'show');
      5 N  L) v! X! J+ h; J$ c) K
    35.     }
      2 v: Y- H. e& q' ]

    36. ! J2 H2 \' U0 J7 q- U7 a: f
    37.     public function handle($page = 'index', $mode = 'show'): c- Q; B+ R) t% G/ _( @6 F2 O
    38.     {9 b& _" A8 x! p
    39.         // 安全過濾頁面名稱
      5 w4 `0 T" v& Q& X
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      7 J7 `# L6 ^5 Y
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';4 K! d0 M4 k# Y0 G8 c8 f
    42.         
        \3 N3 G5 n# m- |" g& s
    43.         // 檢查類檔是否存在
      - U) I. q5 X. @' `3 h' J0 Y
    44.         if (!class_exists($pageClass)) {& ?. x4 ^) C1 Z; h# ~. M9 [
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      6 S8 H- z! E9 ~0 C3 |7 g
    46.         }$ H9 N6 O* d6 u4 @  {& b- G
    47. 8 i4 P# R+ r8 R" k/ S3 j
    48.         // 產生實體頁面類9 }) _+ ~# v' v& t
    49.         $this->pageObj = new $pageClass();
      - h! X& J6 G1 B" D+ J! z1 b0 G* g
    50.         ; m* e" T5 O/ R! {2 }7 \
    51.         // 檢查模組要求
      % Y" [1 [; {8 F/ ?9 u* t/ Q2 l. \
    52.         $pageProps = get_class_vars($pageClass);
      % c( h, ]- w8 X. L& h) J5 ~
    53.         if (isset($pageProps['requireModule']) &&
      # c9 v1 O1 M0 J2 w
    54.             $pageProps['requireModule'] !== 0 &&
      7 i9 R( I9 B; J$ }* E; J
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      * K+ I- u# ^4 f. I
    56.             return $this->showError($this->LNG['sys_module_inactive']);( n" j! _8 z- h8 y
    57.         }
      + n3 H- m; E8 Z9 [
    58. , M% h4 ~1 e& K/ l: d* C+ }' l
    59.         // 檢查方法是否可調用
        x! O* C6 K" `" u3 ^; f
    60.         if (!is_callable([$this->pageObj, $mode])) {
      1 \" I- q( O) e& {" A( N0 H
    61.             if (!isset($pageProps['defaultController']) ||
        X# N. \, g2 |9 c6 e' P8 d+ _4 N
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {& y+ t9 \' }1 G6 e' v0 m# t
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      * T( R* f9 N# Z. N* |4 [
    64.             }
      0 t( u9 j& o$ j' o; B) D
    65.             $mode = $pageProps['defaultController'];
      6 q+ @# V  |0 m2 k. i
    66.         }
      2 v) [6 w, Y$ u
    67. " h' U  g; a' T. _! h% h5 y# ~
    68.         // 調用相應的方法9 f' |2 W9 u( ?8 @) m0 V
    69.         return $this->pageObj->$mode();# K+ L$ t. D* R, o
    70.     }
      # V- l+ s4 q- O" y

    71. 3 _$ L7 W& f3 O7 M0 e
    72.     protected function showError($message)# g7 e% w3 B% C6 o) j) m: F
    73.     {
      , b8 ^1 U% y. E* b( l0 Q
    74.         return view('errors/custom_error', ['message' => $message]);
      : ^& ]% q# C7 L. U" H
    75.     }
      7 H+ N1 `2 P5 q$ G3 E: f: X& ]

    76. / T8 c) M+ w0 c2 E; N
    77.     protected function isModuleAvailable($moduleId)
      2 P. ^5 A' O/ \
    78.     {
      : Y- l. \3 @7 e0 }" ^- }9 l6 ~
    79.         // 實現模組可用性檢查邏輯
        L) u* z- p% C# Y" d
    80.         return true; // 根據實際需求修改: q1 f; N  T, F6 B8 P
    81.     }) J8 G& S; S  i; z. e4 b
    82. }1 Q9 r2 c, E+ v4 A: m5 N" n" Z
    83. & z' e$ J) [: W  y, I
    84. // app/Controllers/Login/AbstractLoginPage.php! l9 Z( F8 X% I3 q$ O  V
    85. namespace App\Controllers\Login;
      9 L4 ^! ?, [# R# _+ U* _
    86. 1 Z- e9 Q2 h+ l% @, K8 `* z% m& _0 y
    87. use CodeIgniter\Controller;0 T8 k1 ^8 ]( ]+ m' G5 e! Q& H

    88. / _& P1 ]. q$ z: C, L: S/ M
    89. abstract class AbstractLoginPage extends Controller- b- }, A* [3 D, _5 k
    90. {; d+ }" \# \1 Q/ Q
    91.     // 實現基礎登錄頁面功能3 X% x; m  q0 N3 C/ Y2 k1 I
    92. }
      : E) K8 V% F' f
    93. 0 l; o3 L# @  L7 c' H8 D7 H+ D
    94. // app/Controllers/Login/ShowErrorPage.php' }4 g% g5 `! A5 u6 e1 L( T% z8 H
    95. namespace App\Controllers\Login;  x8 a" r8 @9 `- d/ M4 G

    96. * K" T  S0 M- _4 b" T) F; ~1 n
    97. class ShowErrorPage extends AbstractLoginPage
      / _: u/ l* a& s, j. G' N  o! v6 q
    98. {2 e3 L6 b% R1 _* J- r2 p0 o
    99.     public static function printError($message)& m. n' y  ~' O. k! h& b
    100.     {6 L) \3 b) T( }
    101.         $controller = new LoginController();- r: u; P) U0 J2 s/ \3 G/ }
    102.         return $controller->showError($message);
      / B* L- [. C+ ^8 S% t
    103.     }& l* g& m" m/ {0 @1 E9 m5 j
    104. }% U1 [0 S. z' s' @: u/ [. `

    105. # I  m4 Y# E4 X% M1 I7 m
    106. // app/Controllers/Login/ShowIndexPage.php
      ; {7 Z: O- ?' [# Z* e" C5 L
    107. namespace App\Controllers\Login;' A, }6 J  ~! N) L

    108. # p' s! V7 J9 o% x
    109. class ShowIndexPage extends AbstractLoginPage
      / ^1 Z5 \+ g' e" v& o5 l
    110. {
      ' \/ f$ j* z, @# e  M& `
    111.     public function show()
      , ~7 b4 M8 ~* f$ S/ \9 _: H/ _
    112.     {) K. {- P6 X( q0 x
    113.         // 實現登錄頁面顯示邏輯0 b9 e: ^9 j/ x
    114.         return view('login/index');0 x2 I) _7 a& m) I0 S
    115.     }
      * z) Q5 V: T* p/ [$ G( J7 t5 e
    116. }
      2 `9 V8 D& k6 Y3 G
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-8-25 11:52 , Processed in 0.012897 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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