找回密碼
 立即註冊
點閱: 636|回覆: 0

[閒聊] AI 改版新架構記錄 [複製連結]

等級:25 - 爐火純青

經驗值:0 / 245

魔法值:14410 / 14410

生命值:5%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
      N7 D" |7 _5 q& a* QAI 就是站長的最佳幫手。
    7 v& R7 Y$ ?+ d6 G5 [: l/ }" H
    ' u7 f) j2 u( D2 F- [% S0 n0 a: Q6 l* e3 s: S
    這裡的「新架構」是指後端的架構會有大變化
    1 R) N2 V8 Z. M3 r/ X; ^但前端的 UI 介面玩家不會感受出來有何不同
    9 X2 \8 z! c9 b5 K0 z2 b& Z5 ]* i/ ?. a! x& d8 |- H, t4 r/ G7 c

    3 a, y$ j! t% T. j- {7 L( q% A/ U為什麼站長要改成新的獨家架構?" T* s, l% W1 Z
    就一樣由AI模型來解釋清楚吧。7 Z1 y7 H" |# B- T' n( r0 B
      ~/ S) N' i  x! T7 K! {
    ! j1 n! a: D& P" V$ N% Q8 F, v# v
    讓我分析一下使用純 PHP 和使用框架的優缺點:+ @  h9 _2 F$ p5 F
    純 PHP 的優點:" x9 z! H. v" o+ `7 Z' `/ A" q7 a
    1.        性能較好 - 沒有框架的額外開銷
    ) |. j& v# S& p. ?  `; w8 l2.        學習曲線低 - 只需要掌握 PHP 基礎知識) E/ Q" R; T' q# g
    3.        更靈活 - 可以完全按照自己的需求來設計架構# ?0 R7 T* Y1 s& t+ N; E# [
    4.        代碼量小 - 不包含不需要的功能模組
    . _: ^1 A- L1 @. B  ^( c. a; U5 W5.        適合小型項目
    * X3 w1 F% y& @+ \  |純 PHP 的缺點:" J! c3 T+ F$ C  K+ W& d: |' f
    1.        需要自己處理很多底層細節6 F5 X- Z* i/ k/ w
    2.        代碼複用性差
    5 g% Q' X" T  h3 ?( g: ~6 C; V3.        缺乏統一的開發規範' v6 b6 |" @0 Q1 g- l0 a4 J
    4.        安全性需要自行考慮和實現$ g: M( U, _$ w& j. ]& V: z
    5.        開發效率相對較低3 {7 L& Z# b1 r# k
    6.        維護成本高
    $ y! g9 v- z: z! c0 P使用框架的優點:$ p8 H) u. k# [5 ]$ |, d
    1.        開發效率高 - 有現成的元件和工具/ g* k4 w2 J1 }
    2.        有完善的安全機制4 ?* [! Q# I1 O: d
    3.        統一的編碼規範
    + h$ \' P7 e4 U9 ?- f/ f4.        易於維護
    5 z, \9 \( [' Q* f+ u2 x$ h5.        有活躍的社區支持) ?# {4 a, X6 J: b3 v  s
    6.        適合團隊協作: M* m* F6 R; Z3 M( h2 H' O
    7.        自帶很多常用功能(ORM、緩存等), V4 M, p* f8 I0 z0 V
    使用框架的缺點:% w1 I  ]' D5 T" C: B5 V
    1.        性能有一定損耗/ X# k  L6 b/ @  w5 J5 L
    2.        學習成本較高
    $ f8 L3 b; \/ [3.        可能包含很多用不到的功能
    ) q6 ^: m; B+ w4 s7 i- D1 J4.        不夠靈活,需要遵循框架的規範
    & K1 N* Z$ b4 {5.        對小項目可能顯得過重8 k# B8 D1 V: E" I% \0 {3 I, v9 y9 `7 ]) j
    建議:
    7 u) ]* ^/ z+ C3 n$ _0 s1.        小型項目或學習階段可以使用純 PHP
    ' X) _. s+ f, t/ S% _$ n9 h2.        中大型專案建議使用框架
    + `$ t& {' g3 D* _3.        選擇框架要根據專案需求和團隊情況; @+ Y5 B0 S" K6 T( c
    4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    9 |" p/ C1 H  s6 K您打算開發什麼類型的專案?這樣我可以給出更具體的建議。3 F0 _, z* [9 i
    $ ]4 r- e/ `$ j9 k
    & A; B- n4 t, M: l1 t8 D5 z
    . M. I: n2 X6 i0 C# K8 @" c5 K, V
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。5 L" i6 R9 d+ i
    8 P0 @2 o% Z/ ^! t, X& I5 _
    這個轉換主要做了以下改動:' \: o9 ?5 Q6 s1 {2 M4 M$ }6 Z

    : [( \  O) \" x8 w, [路由結構:% \. \& H2 ^( e* X$ y" b
    1 M* k% `6 l+ T* u  B* ]! x
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下
    * |) T/ H7 F5 z支援原有的 page/mode 參數結構3 Q! I; @/ }6 a! u3 U5 {
    通過路由規則自動匹配到對應的控制器方法
    # A7 L  {! b' g! r" A. |
    1 c2 t+ \2 t: `
    : b. @+ |! v6 t" a4 H控制器結構:+ W. H0 C$ p0 `6 b- }

    ; W' L( e4 \( y* F/ C. O3 O) W創建了主要的 LoginController 處理所有請求
    % P  K, Z, e, M, w' F& Y0 J保留了原有的頁面類結構,但改為符合CI4的命名空間規範
    0 P7 o3 H, b! x7 f# ]1 U錯誤處理改用CI4的視圖系統
    % `# @% U# t% `$ R' \7 \  k" d) N' V% k$ n: r

    1 s/ [7 [. n" R' z+ D% t類的組織:9 ?2 y9 l0 H7 t4 S$ t

    $ _, d% Y( d/ p  W$ F3 J( g所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    7 t! p: `1 o& N- i5 t- z保持了原有的類繼承結構
    & ?, E7 J6 o& \% b% D1 U9 w改用CI4的控制器基類和特性
    & K# c- p3 y  W1 ~5 W" \/ S
    ; B* B; I6 [! o. \* `" }
      g' Z) D- m8 \  ~$ s- O+ K改進的安全性:7 ?2 G1 T* }6 L( g$ a  m8 y

    # y, o3 E$ \' H, ?( X使用CI4內置的安全特性
    / R+ o# J( M. n) q$ `更嚴格的輸入過濾
    * u( T4 ]" ?; n' @6 ~更好的錯誤處理機制
    " g1 l  b' m# F7 M) c: x0 c. h6 ?
    , K6 z$ g! ?4 C3 P: L' X/ w9 i& k, ]! S* \
    1 l- q- S: @4 f5 Y9 }4 \
    要使用這個新結構,你需要:! R) C% p5 I; D7 r
    ( n# f, F  x4 e" p
    將這些檔放在對應的CI4目錄結構中# n5 t& t& F2 n3 ]$ ~* Y2 Y5 N
    確保創建相應的視圖文件, t  o! h/ K* g6 k) H# ?
    配置語言服務) y5 M5 d  h" ?
    根據需要調整模組檢查邏輯
    4 a& w6 q6 `( m# w% @- `0 C( [" N  M! `
    需要注意的是,你可能還需要:
    - n$ ]6 \' T2 S, G
    5 q7 e8 W% Z! s% H( r/ J創建相應的視圖檔(在 app/Views/ 目錄下)
    2 B# N; O' F, c2 c$ M# \+ A( G! D配置適當的中介軟體來處理會話2 r9 z1 x! Y3 q0 J* m
    實現具體的登錄邏輯
    , @% S' g1 e: Z, p. P& h
    & V% r$ h+ p* I" N需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?
    7 Z* n* s. k; L8 ~* v
    2 r: w4 i/ p5 |4 g4 O3 O8 K! {
    1. <?php/ h5 G, z4 r1 ~6 {6 e" }
    2. // app/Config/Routes.php$ J: F" i( e0 v% I
    3. namespace Config;
      + I: W9 w) W6 T. r5 Q+ m
    4. 8 q8 E6 K8 r: }+ I
    5. $routes = Services::routes();
      . i. C1 ~' x' Q- w
    6. 1 }; E. c9 z  y- q  ?  ?
    7. // 添加自訂路由規則
      ; l. F* |# @. [* w: P
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {4 O% d& O  a2 L0 H& i; K: I' z
    9.     $routes->get('/', 'LoginController::index');& q; v. Q% G" a. n! F; S+ }/ ]
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      9 \- m$ E8 b2 B! J- `, Q7 P" I1 C
    11.     // 默認路由處理
      ) t6 p6 I6 m' e8 L- b% Y: |
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      $ G6 ?& x8 n$ S* P& k- U. U1 _! R: O4 p. C
    13. });
      7 j" u+ Z" {: C: @( q0 G2 H
    14. 6 E3 i* F4 d/ B; n
    15. // app/Controllers/Login/LoginController.php
      1 q! w* Z8 j  M0 E# n
    16. namespace App\Controllers\Login;
      4 G  ~6 g0 p+ H/ ~: `" H! j0 m

    17. ! w% C$ g8 g, Y; F
    18. use CodeIgniter\Controller;
      8 x( x% a" I# D$ T4 R# N2 H
    19. use App\Controllers\Login\AbstractLoginPage;
      5 {) e; S' \9 q# e6 h# }

    20. 3 ^% ]. t6 i, z4 y  v1 q
    21. class LoginController extends Controller/ ]' [& }8 \/ @8 f- P9 e$ V! ?
    22. {$ o. [4 V4 h- L& ~7 H
    23.     protected $pageObj;. N  _* |6 L- }; N
    24.     protected $LNG; // 語言物件
      7 e- ~# Y3 `/ ?7 Q* w

    25. : R" j$ Y% U- X/ S/ L
    26.     public function __construct() ; w# s+ P% y: d: O3 E8 O( l+ o
    27.     {
      4 `$ y! Q. c; @  M5 y7 ]* C* N+ ]5 I
    28.         // 載入語言檔和其他必要的依賴) \& u- {. Z7 G! n
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      1 }2 o# V$ M+ N; |# K& A) K
    30.     }
      + R( V: j- ^3 I. b0 v4 W2 i

    31. ) _. N1 s2 `1 g& w7 s* q  [
    32.     public function index(), K0 \5 Q: K- C8 u- \) Z
    33.     {4 t, G: W, Z4 H/ L5 k
    34.         return $this->handle('index', 'show');. C1 Q* ]3 s, K8 |+ h
    35.     }* S" m+ N: ?/ d( E2 M5 _' z

    36. ! _: O8 h4 [6 e
    37.     public function handle($page = 'index', $mode = 'show')# \# n* i8 M0 d* G2 H% n
    38.     {! l- w0 ?0 U' _( C
    39.         // 安全過濾頁面名稱
      - a4 T( c: s" G
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);1 {3 R: S: I! H& ]" t  F
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';' |5 a) X4 K$ g- O+ `
    42.         
      $ [, @) d+ E& ]- o) p
    43.         // 檢查類檔是否存在
      , V  b4 M7 f: m/ H+ G
    44.         if (!class_exists($pageClass)) {
      ! \& z+ d: X( h+ `# a. y4 O* V
    45.             return $this->showError($this->LNG['page_doesnt_exist']);
      7 C2 w. K& m% N. k+ A; _$ R
    46.         }
      . [5 {$ T5 C# C/ |+ ?4 h# g3 H

    47. ! B9 t& L3 p5 ?
    48.         // 產生實體頁面類/ |! m* u8 O* r' D4 w  [
    49.         $this->pageObj = new $pageClass();1 K! L* u/ L6 }" ^# M
    50.         0 v+ Y; C& a* M
    51.         // 檢查模組要求# ]' V, M1 p% @" U
    52.         $pageProps = get_class_vars($pageClass);  S5 w! o5 f; ]# F0 ^
    53.         if (isset($pageProps['requireModule']) && ! W; q2 M5 Y/ Z$ K( B) k9 z. Y9 f. U
    54.             $pageProps['requireModule'] !== 0 && % l' p4 [1 C6 Y1 o
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      , |- e4 B' o8 z9 w% e. q0 M
    56.             return $this->showError($this->LNG['sys_module_inactive']);
      . y" h' [  N: \8 ~" r  u4 |7 {" G% i. q
    57.         }. l/ W7 t2 K2 ~1 C$ E
    58. ) w5 W6 z: z, A% f
    59.         // 檢查方法是否可調用# O. S+ U) R5 V. I
    60.         if (!is_callable([$this->pageObj, $mode])) {
      : h9 W  x9 H8 t# \: l# J# _8 I
    61.             if (!isset($pageProps['defaultController']) ||
      / m  S* y& q$ M7 J3 G, V
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      1 K, ~- L* y8 H$ t) F
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      4 C, t) S0 m( h
    64.             }
      ! k2 O+ l+ m: K0 c
    65.             $mode = $pageProps['defaultController'];
      1 E0 a1 l; u+ L" y9 |+ Z# ^
    66.         }
      , Q$ Y% I! v) B, c8 G0 V
    67. & F' q( D0 G$ {6 t. Z
    68.         // 調用相應的方法( n4 l! {4 G, m" G- T0 W1 n, Q
    69.         return $this->pageObj->$mode();; @) u) n4 g; ^3 \7 W
    70.     }
      , n# u- T+ P; ]4 B7 c  ~! h
    71. " O# q4 `; k% d) ?  Q; F
    72.     protected function showError($message)
      9 l. a% x! T& x; u
    73.     {
      9 g, K4 d$ `" ^* y& |
    74.         return view('errors/custom_error', ['message' => $message]);
      , v0 p! X; y" s, V, H0 D
    75.     }
      - F! w5 d& t' K- W4 e
    76. % q2 P+ x: {, Y6 \  u$ \1 [- `4 C% A
    77.     protected function isModuleAvailable($moduleId)
        n. X( x: Z) |8 B
    78.     {( Z+ V' H/ x- m$ {$ S" U
    79.         // 實現模組可用性檢查邏輯( I* K0 P5 v# p. r/ D
    80.         return true; // 根據實際需求修改  A# q+ ^' m$ L, l2 ^
    81.     }
      1 L  S6 M/ b! D2 ~1 s, G
    82. }
      7 {7 p6 S' U. R7 V' |( c1 h8 G

    83. 6 v* r, ?! V; c% |# u# b
    84. // app/Controllers/Login/AbstractLoginPage.php! K6 t; P8 [( t" x* p; C) f
    85. namespace App\Controllers\Login;, b: R1 Y, L* g- n. e. ]( c
    86. * [3 B3 G8 f& D9 y% n
    87. use CodeIgniter\Controller;. M% k7 p1 C2 Y0 J0 d+ F+ A
    88. - g' U7 m3 n- V2 a% `& o" b
    89. abstract class AbstractLoginPage extends Controller# t) k, ?  A- P+ t1 G. y
    90. {
      8 g! G' A- @) w+ Z" S$ N3 B; c8 R
    91.     // 實現基礎登錄頁面功能6 |, p, M: D8 ?" C! V
    92. }1 y. S! o2 [3 }" q; O* X* `

    93. # |. k: {+ G1 [2 B" ~1 l
    94. // app/Controllers/Login/ShowErrorPage.php$ N* K' ^8 k' W! a3 y
    95. namespace App\Controllers\Login;
      " z  L5 S3 g2 r

    96. 3 x# T# s! _$ L$ E3 p2 X+ N$ t
    97. class ShowErrorPage extends AbstractLoginPage
      % S0 c4 f0 c, V9 `8 [2 v8 c
    98. {
      , B8 a/ o$ z2 R' `) f
    99.     public static function printError($message)
      - p2 q+ |( l: f1 z
    100.     {8 ^6 N7 L% m1 [
    101.         $controller = new LoginController();  O! h# ?* \! V! {
    102.         return $controller->showError($message);9 |/ {+ C  u6 p9 B* z6 V# c% r
    103.     }
        W0 {& Y9 c6 w. ?  k, b# M: Z
    104. }
      : H9 c6 c7 x4 c7 v) ]& w
    105. & v2 {6 E( K4 f3 B6 z, V
    106. // app/Controllers/Login/ShowIndexPage.php. h& {5 }5 c+ H" j' l
    107. namespace App\Controllers\Login;! V% Z1 k9 y/ W  \

    108. 4 C0 a( c) E2 g0 x, g
    109. class ShowIndexPage extends AbstractLoginPage: G0 z4 e) r# u% b" S- j2 J
    110. {- u* Z$ T' K; j# y3 j
    111.     public function show()
      $ p: r4 [% q3 }  @7 G
    112.     {
      ) R) n* A# b1 U5 d& A2 f. u
    113.         // 實現登錄頁面顯示邏輯
      9 u" c3 C* c! [; B
    114.         return view('login/index');& w0 s+ Q( {5 O! i$ I' Z- s
    115.     }! ?+ k- k$ w" B, Q2 P
    116. }. o5 c. i6 `# ~1 u8 x# i! U
    複製程式碼

    文章的最近訪客

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

    本版積分規則

    Archiver|手機版|MyXNova (原 myxnova.com)

    GMT+8, 2025-12-12 12:26 , Processed in 0.016341 second(s), 8 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2014 Comsenz Inc. 界面設計: 我的XNova論壇

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