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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:15050 / 15050

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致% |6 K$ f6 b% j7 y
    AI 就是站長的最佳幫手。
    , E2 P/ |; P6 a+ E6 A! l, M% `4 s; O
    $ F9 t+ u1 T* q- j% S! b
    這裡的「新架構」是指後端的架構會有大變化
    ' G; W3 U0 D0 d但前端的 UI 介面玩家不會感受出來有何不同& F7 L! Y$ u% U- G' e* {

    / [; ]1 ^( L  @5 H; q) W7 {2 G0 R: U" O" q
    為什麼站長要改成新的獨家架構?3 m4 G; T3 F+ L& y
    就一樣由AI模型來解釋清楚吧。7 |. Z0 ^7 n. x, i" e1 v% a

    ( k( |2 c- b$ F! \; a' Q2 P' A) D8 Z; D, Z/ h9 T
    讓我分析一下使用純 PHP 和使用框架的優缺點:( Y7 c7 h1 `. ]3 C2 o& Z
    純 PHP 的優點:% \9 {. Y$ k* m; V8 ~
    1.        性能較好 - 沒有框架的額外開銷: \( W5 A$ }! L% r7 A4 `
    2.        學習曲線低 - 只需要掌握 PHP 基礎知識- C( {7 X  R$ K# f4 X% c
    3.        更靈活 - 可以完全按照自己的需求來設計架構5 F1 n! o- y1 d7 H6 K
    4.        代碼量小 - 不包含不需要的功能模組
    ; o+ x3 {5 }' Z+ `# v5.        適合小型項目( ^7 `; Z; Y6 Q7 i( O8 S, B& S0 o
    純 PHP 的缺點:2 v+ L- S2 L. ^5 w( _
    1.        需要自己處理很多底層細節- ~, h0 T# ?' `' `3 ]; ~  @& K
    2.        代碼複用性差
    ; X7 H: A4 X  v9 i# s  W0 O# q3.        缺乏統一的開發規範
    2 Z  a, e0 A. m7 p" H0 ?4.        安全性需要自行考慮和實現+ O* T8 y1 Z! F1 @( p8 s* |4 e' e
    5.        開發效率相對較低5 t( `+ g# W; a- I# S7 F
    6.        維護成本高
    ) x4 ], w9 N% ?2 D9 l" O0 P7 U使用框架的優點:
      C4 F. z' a" ]$ I( ?/ @1.        開發效率高 - 有現成的元件和工具1 X( A5 E; n3 W8 ^% T# w
    2.        有完善的安全機制8 C, g7 f5 t1 n
    3.        統一的編碼規範; O  G  k  r- o( G9 J& g( }
    4.        易於維護
    9 k, f3 p3 }! j/ ?! C5.        有活躍的社區支持
    - f6 @! W( q: P6 L6.        適合團隊協作
    2 W* S! u7 @3 a. K$ [( J3 G' q7.        自帶很多常用功能(ORM、緩存等)9 B5 ]; X- e6 C* ~+ W* W0 @- E: o
    使用框架的缺點:& U# U& D" b" Y
    1.        性能有一定損耗$ Q& U- N$ d9 P2 F+ Y, Q! i
    2.        學習成本較高
    7 N" b6 ]4 D. b( w, i+ n3.        可能包含很多用不到的功能& o4 \& M: U- S, ~* @. _
    4.        不夠靈活,需要遵循框架的規範! r0 J6 U6 n* o
    5.        對小項目可能顯得過重. H1 b7 h- d  I9 S" K
    建議:* a1 q  x* G% X
    1.        小型項目或學習階段可以使用純 PHP
    8 s9 h; I1 z' [, u) G/ j3 }- z2.        中大型專案建議使用框架) c8 N+ D; x1 m% p0 r/ D/ z
    3.        選擇框架要根據專案需求和團隊情況
    * T. _, o: B3 s: T( w: ?3 _) U4 p4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    + ]/ R: E! K9 g. [0 N您打算開發什麼類型的專案?這樣我可以給出更具體的建議。
    6 J" j4 _7 L, s. A
    ) f# Q4 z) j9 A& B7 e' o+ X9 Z: C1 o# R

    5 d" z5 K3 N8 M  i6 o我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。4 p% z7 @1 B- L$ Y
    2 t. B' X. Z% y$ ~7 R9 i* X, y
    這個轉換主要做了以下改動:! B2 H$ B8 X/ F4 D% G
    2 P: ?- {$ _0 C! y, }+ ^
    路由結構:
    # E( ^  V+ V0 I# ^7 c9 @" J4 Y  N; B1 V$ i# P2 Y
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    ; e, ?8 K* A7 }  q支援原有的 page/mode 參數結構
    7 F% O/ {# g( }1 s1 Q$ e通過路由規則自動匹配到對應的控制器方法8 L$ e' S" I* q8 A, D" x

    7 G! [  }# J9 C& F4 B0 N6 ?. T( r  ^0 I0 ^3 M
    控制器結構:& S: Y% n2 k$ o& h- t
    5 \' i3 A! m4 P0 l/ v
    創建了主要的 LoginController 處理所有請求
    ! n! ]. d9 ~( B) h2 L) h保留了原有的頁面類結構,但改為符合CI4的命名空間規範
      [1 h  p0 I; c) [錯誤處理改用CI4的視圖系統
    , m. }* I* y6 I9 ?3 w9 a5 ^) v
    1 P, F- ~3 T- V5 A/ N( \" v* [# L* @4 V# I
    類的組織:( |6 B& e! y; s. e( A+ D
    - {, D0 M5 c2 X
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    . x# j1 j, C6 K# i) w1 [保持了原有的類繼承結構
    % X& j9 ~  Y1 u6 l9 M: O& k改用CI4的控制器基類和特性2 n6 e. I2 l2 \7 x2 V
    7 _) [0 M* |; {! p: x& a, S

    : |" q' s. D* g7 t改進的安全性:+ x. d) }: _6 o1 s1 r! V7 T
    7 @/ i0 K7 L3 E9 u7 d4 }7 l
    使用CI4內置的安全特性" n9 S8 @9 O* O( {1 D% L- _, O
    更嚴格的輸入過濾. s/ C% i) B- q6 K3 d2 L1 i
    更好的錯誤處理機制
    2 S. f+ J' x. R( w4 Q
    , A0 x0 z: ^3 A7 T4 M1 y) m9 z
    / _% r6 h9 M( C0 v6 f/ X* i5 X. {: L+ U3 {- o' b# b
    要使用這個新結構,你需要:( U' O8 Z" @" q5 Y, D& B

    * F& _: D# y* O1 U) t" o1 i3 I5 Y將這些檔放在對應的CI4目錄結構中
    ' w1 k) c, @; z確保創建相應的視圖文件
    9 }- u" P% Q! N( v! o& B配置語言服務/ g0 m- w! G: {- f" D. j: \$ X. Y
    根據需要調整模組檢查邏輯. O; `7 h5 D5 i3 ?( N7 L1 K9 C

    9 Z$ ^0 q5 Z! i+ ~需要注意的是,你可能還需要:
    6 I; r9 [, H8 X+ m9 r' A" ]- ]5 r0 X( i* Y& [* I' T  _
    創建相應的視圖檔(在 app/Views/ 目錄下)
    7 }/ ^0 g4 o" b1 `2 ?* j* _配置適當的中介軟體來處理會話
    5 Q) \3 g7 d; p實現具體的登錄邏輯
    2 o6 X  w3 ^; z% v5 S) q. x" T; P9 `! S  ^2 l2 \0 w
    需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?* {6 f2 k3 H7 U6 Y
      A; |" X. Y2 @) e# H( x' S, M
    1. <?php8 g) d$ e3 f, |" b% ?
    2. // app/Config/Routes.php
      : {4 Z5 Z7 D' {
    3. namespace Config;
      $ R" a  m. {% B, {# e
    4. : ]% z3 [* B: `8 W  Y- B
    5. $routes = Services::routes();9 M; O3 N% h' M# |$ e

    6. 4 F8 v" }; B- b. u
    7. // 添加自訂路由規則
      2 \+ R$ d  c. @( [* h6 ?. L
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {7 w; H3 R4 R' R9 I) v# h* |
    9.     $routes->get('/', 'LoginController::index');$ e/ r( m5 b, {" p5 B
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');+ x: ?8 F, e$ t# ^, |) B
    11.     // 默認路由處理/ t- d3 Z5 E) w% W* K
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');( g; y4 `: a+ v* R$ N# K+ `
    13. });
      $ o* s9 J+ ?! p' N

    14. 2 r9 h  e1 o" o+ @
    15. // app/Controllers/Login/LoginController.php
      " h* o, M4 c. Q, j0 Q" ]5 h3 z
    16. namespace App\Controllers\Login;* k* q2 w, m0 `0 n. E. V2 F

    17. ( c6 t- n' E* G7 F
    18. use CodeIgniter\Controller;) b. b  O: M, Q$ R/ B1 J  P
    19. use App\Controllers\Login\AbstractLoginPage;
      % I: P( c/ L3 K8 L3 [6 D7 R, L5 c& {
    20. " E* f2 c& v$ k3 Z" @
    21. class LoginController extends Controller8 R, h  O% h; s% `& o
    22. {8 M0 t' Q! C: H# a9 k  i- P+ U
    23.     protected $pageObj;/ `, Z7 A! ]' N- C" |
    24.     protected $LNG; // 語言物件
      5 `& Z9 p  o! Z& ]! f4 z/ B

    25. + Z2 O2 D1 G# i) m; `
    26.     public function __construct() ( [8 R  J" u  Q; h* p
    27.     {
      0 o( S: K6 z3 Y( V9 g  l
    28.         // 載入語言檔和其他必要的依賴
      % C8 ~/ N# ]0 Z5 U
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務# b& z. }: c% k& e( a, w: _; T
    30.     }
      * Y4 w4 E* a/ b! }, O' L3 u+ A

    31. & u: u) E# ]% }% q  J
    32.     public function index()
      : x0 R9 F1 W4 O
    33.     {$ c% r! i$ O& [; @6 B. v
    34.         return $this->handle('index', 'show');9 p9 Y6 k8 E! y/ ~  A# O( h
    35.     }
      ' D1 V* Z, Z# F' S0 j6 J

    36. % f3 r) P# o; l( p
    37.     public function handle($page = 'index', $mode = 'show')" b" g8 h% W# c" F8 v% W
    38.     {
      6 j5 y  S) u, f' x6 k. P/ C0 t$ D
    39.         // 安全過濾頁面名稱
      : Q" Z/ u- o& E! T1 L
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);
      + Y$ c" R. _- m- U1 ~" X
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';2 W# s: H; h& `  `0 p! q7 k
    42.         
      ' P" `5 [3 K+ e* X7 e
    43.         // 檢查類檔是否存在- E7 P5 w4 s: \+ D, y7 S, [
    44.         if (!class_exists($pageClass)) {# w4 V, }, l3 M: w1 }
    45.             return $this->showError($this->LNG['page_doesnt_exist']);5 G! k% ^9 h1 L* o5 ~' U% x! |8 m
    46.         }
      2 ^! A' m  T) Q- H  C
    47. " ]/ _! }: D' m, v* F
    48.         // 產生實體頁面類
      ! E7 F. I* |( B* a0 I6 T" x
    49.         $this->pageObj = new $pageClass();
      6 X; @/ _4 s) j( [( E& |4 ]* L
    50.         
      " [) y7 h& d/ f* O
    51.         // 檢查模組要求
      5 {3 Y) |3 E0 p7 Z6 w7 U% r
    52.         $pageProps = get_class_vars($pageClass);
      4 {, V: w4 b0 w- |# g2 z) \5 ?
    53.         if (isset($pageProps['requireModule']) && 7 ?9 ~. [( K& u# `9 B
    54.             $pageProps['requireModule'] !== 0 &&
      ; z# k- t4 Q6 x7 y' U% @6 ^" `
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      / J8 y# E2 F( d9 |' h
    56.             return $this->showError($this->LNG['sys_module_inactive']);  W; z( B6 Q/ Z6 Z/ [
    57.         }+ L# a: y" C1 ~8 r
    58. # G3 W9 j: c8 o' J
    59.         // 檢查方法是否可調用/ L, X+ p4 {& L' }; e' Q  v! z" w
    60.         if (!is_callable([$this->pageObj, $mode])) {
      7 y$ S# K/ b% c. d( R( p5 n6 b0 e! ^
    61.             if (!isset($pageProps['defaultController']) ||
      7 G3 r! _) K2 T! d% t1 E
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {3 S- K: b! e5 k) b
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      9 j5 ~% M/ l, l* h- w7 R
    64.             }. w. ^& o5 Q' {, p. u/ m( ?
    65.             $mode = $pageProps['defaultController'];
      " f$ X* _, }0 Y. N' c2 C
    66.         }
      7 S0 l$ c0 G1 C, Q
    67. . F! C  t) a7 Q  z( t
    68.         // 調用相應的方法7 @3 p  J8 G  f4 _
    69.         return $this->pageObj->$mode();# ~1 ~9 E1 z. f' d2 E8 p  u
    70.     }) _9 u# j8 Q* Q8 L: [
    71. 3 \+ [/ b; r* ]- q, T
    72.     protected function showError($message)( n) y) w# C1 F% J. X
    73.     {; v5 N; z' i, ?# C
    74.         return view('errors/custom_error', ['message' => $message]);
      , w1 |1 _7 R8 r; c: |8 ~5 s  n
    75.     }
      7 Q: S' [- T: ~8 l  }7 n
    76. 5 o) @2 p# p/ P* Z
    77.     protected function isModuleAvailable($moduleId)
      - l* y5 |( m% w
    78.     {9 V; w5 l* G8 M8 [. E5 z% |2 Y& K, x
    79.         // 實現模組可用性檢查邏輯
      3 P# x3 C$ o6 H/ U, x
    80.         return true; // 根據實際需求修改! S4 S- j- I! E0 k) Z- d0 w% K
    81.     }1 q" F8 _4 x) w( D. O
    82. }: Z, K2 h; z/ w, _: [; W
    83. $ {/ l: ?* G# }- z8 |. Y' |
    84. // app/Controllers/Login/AbstractLoginPage.php
      ( J, h$ [5 S' }: c2 o/ Q* Q4 B5 C
    85. namespace App\Controllers\Login;& n0 I* t- x" F! }' o) i

    86. : y" ^* [# w% f" u
    87. use CodeIgniter\Controller;
      ) H* v2 g2 s7 ~2 i1 q! ?1 \

    88. 1 O* O% o: u" Y  A
    89. abstract class AbstractLoginPage extends Controller9 r5 s. d0 ~4 F- @2 K- s- L0 e
    90. {! u% |$ U1 P$ a& q
    91.     // 實現基礎登錄頁面功能% f$ b1 B7 f9 y, u* E
    92. }+ Y5 V; r: c% `' B8 H

    93. / l6 f0 X! }! W9 K; c$ E; h7 ?9 o* O
    94. // app/Controllers/Login/ShowErrorPage.php# H* `1 n3 H- w% ~4 y
    95. namespace App\Controllers\Login;
      2 o/ Z; Y1 A0 O' J

    96. . m' u9 ^4 |8 ]" Z* \! e
    97. class ShowErrorPage extends AbstractLoginPage. c+ B9 T  z% Z! I
    98. {
      6 k# g& ^- t( t
    99.     public static function printError($message)
      / ?: z* U0 J- \
    100.     {
      ; B- ^' I: M3 d) u
    101.         $controller = new LoginController();" v9 l' ^/ ]& C( D0 k
    102.         return $controller->showError($message);9 L& h; u( v& ~1 V1 J1 K* Y
    103.     }
        L. w- D" t( o' u2 z# t" n
    104. }. k1 Q0 C) x, [7 l' r

    105. ' o6 X1 ?, Z% ?$ q$ ^0 i! L, |
    106. // app/Controllers/Login/ShowIndexPage.php" l5 a. p9 P* ]2 q" ~9 t
    107. namespace App\Controllers\Login;- W% y" q- m4 S( T/ ^

    108. 7 e; T/ l# V! `7 A% V
    109. class ShowIndexPage extends AbstractLoginPage
      0 ~; ]' H: H9 W! Q7 {
    110. {
      8 s  A" P1 F2 I$ A! K
    111.     public function show()
      ' W" e( i+ N  V% y
    112.     {
      - I- a! M5 ?5 @0 |; ]
    113.         // 實現登錄頁面顯示邏輯+ a, R# I- L$ u& v9 O2 _- p
    114.         return view('login/index');1 K1 g7 J+ A. R' T, [2 H- O+ b
    115.     }
      6 E- l8 R; d9 d' Z0 W7 }/ b
    116. }1 k& j$ r$ ?9 C2 d; O+ }& C- [
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-8-11 11:33 , Processed in 0.015034 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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