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

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

[複製連結]

等級:25 - 爐火純青

經驗值:0 / 246

魔法值:14936 / 14936

生命值:6%

升級   100%

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

    [LV.Master]伴壇終老

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

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

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

    ×
    宇宙戰記肯定會有自己的獨家架構,不會跟開源專案一致
    % e* p+ ~0 t2 p7 R. T0 d! v4 B; bAI 就是站長的最佳幫手。1 v  A" \2 J2 s1 S

    7 K; Z2 u4 h0 ?* T5 H$ _1 W. s5 i. i# t9 H! T
    這裡的「新架構」是指後端的架構會有大變化# H# `  ~, T; R, I# s" c+ n
    但前端的 UI 介面玩家不會感受出來有何不同
    6 U9 W1 s7 ]+ n; t
    5 Q/ }( h, h0 ~8 ^; ~
    ! A$ d7 j& a1 P; a) S; O9 K為什麼站長要改成新的獨家架構?! W, q+ n! [! J6 G
    就一樣由AI模型來解釋清楚吧。
    / z; m# y9 {5 A1 ?3 G( \4 b: @1 C+ a

    " R3 T! ^9 h4 z; V讓我分析一下使用純 PHP 和使用框架的優缺點:; D3 A/ D! e9 k! F: s# T3 z. m
    純 PHP 的優點:
    " e1 P- |5 y4 B1.        性能較好 - 沒有框架的額外開銷
    " O3 |7 R- c. C0 \' Y6 s2.        學習曲線低 - 只需要掌握 PHP 基礎知識
    : |3 F4 f) p7 d7 R' S* p! q! A3.        更靈活 - 可以完全按照自己的需求來設計架構  h/ P& K- h' H: L) a
    4.        代碼量小 - 不包含不需要的功能模組* [; j8 }: M4 {% p" o+ T
    5.        適合小型項目
    : {1 b* I* N+ p純 PHP 的缺點:! T. A& Y: z; X
    1.        需要自己處理很多底層細節
    & F, z7 _. v2 F$ e. n% C2.        代碼複用性差
    , a: A/ `8 m; [% f3.        缺乏統一的開發規範
    # ?6 G8 i& c( B, g% C% D* q4.        安全性需要自行考慮和實現: C) U9 m. E) C- \2 {
    5.        開發效率相對較低7 x0 @3 F& ^% D% H
    6.        維護成本高5 B) W  i+ c) u% d+ y# R! F0 U# a
    使用框架的優點:- ?+ r% d' N8 B# j- P- ?
    1.        開發效率高 - 有現成的元件和工具
    6 K2 `6 [! v1 e+ w- _2.        有完善的安全機制
    9 B" E: D; f6 @3.        統一的編碼規範
    & K% O5 R* [6 A& `; u" W4.        易於維護1 m! o# X6 b! C% M$ l. Q$ B! P9 ?
    5.        有活躍的社區支持
    0 p# N2 K; S# s7 d  U0 ?/ R" C6 `6.        適合團隊協作
    # h0 i1 ]) P& e6 q* k+ z7.        自帶很多常用功能(ORM、緩存等)
    + j: a9 ~# T& E0 s使用框架的缺點:
    8 F" |' u; Y( s# s; X# _/ z5 E+ k1.        性能有一定損耗$ C% W" {) F) ]/ c4 @9 j4 I
    2.        學習成本較高
    ; M) U" }, Y8 D2 T$ F3.        可能包含很多用不到的功能
    8 S3 e! M6 ^! X1 M$ E& D( k; f4.        不夠靈活,需要遵循框架的規範
    1 S: q. H2 B9 F2 Z4 }% T) ~5 c# @# A5 Q5.        對小項目可能顯得過重
    + K, n0 ^9 |2 Q* u' M/ C+ p- u建議:- s! m! o9 L0 ^* H! a/ l
    1.        小型項目或學習階段可以使用純 PHP( |: A- O+ ]( h+ N' L/ s
    2.        中大型專案建議使用框架& f* I" v' N' i5 ]. T$ O$ t3 U0 ^
    3.        選擇框架要根據專案需求和團隊情況
    7 L' z+ `& b& q& a6 k' y' X4.        主流的 PHP 框架如 Laravel、Symfony 都是不錯的選擇
    $ y: k5 k8 N) V+ Z4 h您打算開發什麼類型的專案?這樣我可以給出更具體的建議。5 g5 R0 i4 H* R, H$ g
    ( }% h0 [' v% }8 \  s% R

    ( \: @  I" Y, E4 c8 [6 p0 }+ L% L! |3 s# T2 t: J- h
    我來幫你將這個PHP程式轉換成CodeIgniter 4的路由結構。我們需要創建相應的控制器和路由配置。
    1 [% F6 a) _- |# k
    - D+ t5 D! |  q4 z. q2 p這個轉換主要做了以下改動:7 p2 y/ w1 ~8 g9 C
    # H4 K: J6 Q# r
    路由結構:
    + d* e. X) x6 J, Y+ }' a5 j; n+ T7 T5 a7 _" N
    使用CI4的路由組功能,將所有登錄相關路由組織在 login 首碼下* [5 J) f& G! Q4 N% P% x/ r/ S
    支援原有的 page/mode 參數結構
      z) o4 i7 M9 ^# Y1 L: {通過路由規則自動匹配到對應的控制器方法
    & w5 J  u" T1 O, A! }4 _& S5 Q# t9 Q4 Q- e: {6 L3 J4 |0 }% n; v% X

    % V1 H" ?! i( ?2 W0 E  u$ Z控制器結構:
    6 ]9 f5 z3 O' W6 b' F$ ~) s; b- {  L% d% O: y
    創建了主要的 LoginController 處理所有請求
    # M5 ^  b1 _& Z3 y% }, b保留了原有的頁面類結構,但改為符合CI4的命名空間規範, ]0 _9 C. l" P5 O
    錯誤處理改用CI4的視圖系統  y, o% u6 }5 @! h9 H7 C" n
    4 [. @- Z& W; E" k$ C

    % \; y0 {9 M$ a& ]/ l2 c. t& `類的組織:
    ' I) B9 g# Z; A$ X% g+ d( {7 ?- @4 o  n; t- u
    所有登錄相關的類都放在 App\Controllers\Login 命名空間下
    . Q( Z- c/ @9 {保持了原有的類繼承結構1 Y4 b/ {2 o  R* L
    改用CI4的控制器基類和特性1 f" ]: Q* E  _, v# n% l1 |0 f
    " T% t6 i7 x* t+ E" K3 K
    6 {% d$ c1 [) I+ K0 T3 A5 k9 Q
    改進的安全性:( ?2 I6 I( d( v+ v

    & c$ p; L6 h  E+ h  Q* O: ^使用CI4內置的安全特性
    6 b- }, b! g7 A# e8 J更嚴格的輸入過濾
    ; {6 }& ]( u) [* S  v更好的錯誤處理機制3 w. M  p' m1 ?/ G$ f, Q) c/ D
    , U$ Z- c1 o; B0 j) j

    4 f+ h4 z: V$ V& {0 F3 `* c* Z8 c7 t( }9 L4 K2 P3 K! M  g/ L4 j
    要使用這個新結構,你需要:  `4 y% B: `/ ?' F

    " z& C( Q) B8 W+ W; V& V將這些檔放在對應的CI4目錄結構中
    7 I; {* }% A- u# Z8 q! r確保創建相應的視圖文件
    # b5 ^- {$ G* g- h; A6 k: b配置語言服務
    / J5 w  P$ `* s2 J+ i根據需要調整模組檢查邏輯8 k6 t7 K  r( }0 Y, v) m) P
    " i# l2 t( f3 {9 R% j# D$ C; {" l8 w' |
    需要注意的是,你可能還需要:0 x0 R" }. n+ p# S: o( m# E) H
    ) Y1 ^; B) G' z% x& q0 Z
    創建相應的視圖檔(在 app/Views/ 目錄下)- X4 W, U+ s4 x* x2 S; ~
    配置適當的中介軟體來處理會話; T  ~% U: p7 q2 v3 Y
    實現具體的登錄邏輯
    9 O+ q4 {9 F1 O  v
    6 ?; c' @: V( Q0 V+ C) `6 q- t  {需要我詳細解釋某個部分嗎?或者需要針對特定功能進行更詳細的實現?( |3 o5 F6 g3 O9 V

    2 K- u; D0 k1 [( L. L. t# r8 @3 h
    1. <?php0 C6 o/ @/ N; G8 Z# Y* }
    2. // app/Config/Routes.php) A5 z) K3 h1 E" U5 i; ]
    3. namespace Config;" `7 K; g1 r6 J' Z  s

    4. ! ?9 i) X  G1 r; X) @& d- k, f
    5. $routes = Services::routes();
      % k/ l! g& Y$ H/ O* }, k6 V. r/ f
    6. / p) V; f* q. f3 b( X2 U
    7. // 添加自訂路由規則
      9 K- ?& d* F( Q9 q
    8. $routes->group('login', ['namespace' => 'App\Controllers\Login'], function($routes) {
      + O, E/ e  O- @1 c
    9.     $routes->get('/', 'LoginController::index');
      - g4 J$ M! ~  I+ a$ c# H% t
    10.     $routes->match(['get', 'post'], '(:segment)/(:segment)', 'LoginController::handle/$1/$2');
      8 a0 m" C9 j; A5 E& L# ?
    11.     // 默認路由處理1 H8 l5 I2 \$ E$ D2 [7 v  s
    12.     $routes->get('(:segment)', 'LoginController::handle/$1/show');
      ( |: _& ^6 J, t2 q& c
    13. });
      4 I4 P' Z- r& C) I

    14. 0 n, k0 v7 B8 `2 t9 v3 H* c
    15. // app/Controllers/Login/LoginController.php
      ! X( {1 s# U; Z; {" f9 I( h8 K  P
    16. namespace App\Controllers\Login;
      , ?. d: l1 n) p2 x( ]

    17. 2 s% b5 R# j* k" w! `
    18. use CodeIgniter\Controller;
      9 [) H7 y& v- }* C) b9 \; g
    19. use App\Controllers\Login\AbstractLoginPage;, q* ?. R, l& Y4 p& J# [
    20. $ l0 P& F- ?( Q+ s$ V
    21. class LoginController extends Controller& V1 U0 n8 ^$ Y6 k
    22. {7 ~2 q0 |# L& p7 i' t0 s. M
    23.     protected $pageObj;5 L( Q' N" J3 n" l$ N5 O! G
    24.     protected $LNG; // 語言物件
      2 i  b  K4 n0 V1 u+ b) @- r" `

    25. 1 o7 b. `; ]. z
    26.     public function __construct()
      % E" O! K: b* ~4 C# N6 K4 Y: n
    27.     {
      ( g" V; c6 |# q1 X  k; O6 {" i
    28.         // 載入語言檔和其他必要的依賴; |, f/ g5 |- M8 x
    29.         $this->LNG = service('Language'); // 假設你有一個語言服務
      ; @: x3 A0 v# G7 f8 v
    30.     }
      , x' L' |/ A) @9 R1 B

    31. # s& K! {0 k6 \. ], e; u
    32.     public function index(), ^5 ]1 ~2 f# n! Q7 B; t
    33.     {1 m  Q# L8 m8 ^2 Z5 M# x9 E6 s
    34.         return $this->handle('index', 'show');7 M+ i' C/ m& I( ~9 G& e9 c
    35.     }
      - [  V2 F9 H! k. V# r7 p) C1 T
    36. # w% x4 c( Z4 k6 @) r
    37.     public function handle($page = 'index', $mode = 'show')& O3 O% M' h& F+ Z+ w: V! F
    38.     {
      ! R" L( ?3 j& J# m' A; j, y
    39.         // 安全過濾頁面名稱2 {; }' S; b/ `  @$ ~
    40.         $page = preg_replace('/[^a-zA-Z0-9]/', '', $page);8 h7 b# W/ ?6 P: A+ b) ^% ~
    41.         $pageClass = 'App\\Controllers\\Login\\Show' . ucfirst($page) . 'Page';/ E! S; c+ A/ v7 B# m- ?% W! Y
    42.         4 i: I9 S; j% t  d5 V
    43.         // 檢查類檔是否存在
      * M$ H- O/ Q* w( c
    44.         if (!class_exists($pageClass)) {! X$ }. s" R7 g' p* `) p$ P/ N
    45.             return $this->showError($this->LNG['page_doesnt_exist']);! v2 x1 y# X* |+ y% ^/ |
    46.         }
      $ w8 P+ R, B) R) R9 q
    47. ' h% s: g# y2 q' z8 a
    48.         // 產生實體頁面類
      5 ^; L! {/ M- o2 W0 @9 ]/ J
    49.         $this->pageObj = new $pageClass();$ }3 {  N, l" O
    50.         
      - }0 j& Q5 V6 C1 o
    51.         // 檢查模組要求$ d6 n& V- @: e! x5 V6 c: E
    52.         $pageProps = get_class_vars($pageClass);8 m' C- I4 D: i/ G/ C  M
    53.         if (isset($pageProps['requireModule']) &&
      8 w' V' E9 H  Y/ h
    54.             $pageProps['requireModule'] !== 0 &&
      2 D* x- ?; F9 p& s
    55.             !$this->isModuleAvailable($pageProps['requireModule'])) {
      : }! u% n1 q  G6 g3 [: Y
    56.             return $this->showError($this->LNG['sys_module_inactive']);8 E, _' U4 g  [* w, y* Y
    57.         }
      & r  E( M2 F) q3 C

    58. % c; e: s5 J; K, J! W: d% n
    59.         // 檢查方法是否可調用
      & N1 q1 Q3 f2 u) ]  d
    60.         if (!is_callable([$this->pageObj, $mode])) {/ A2 [% V- F6 x2 K" k
    61.             if (!isset($pageProps['defaultController']) ||
      + E2 d2 k! I) s! W, C% C8 h% \
    62.                 !is_callable([$this->pageObj, $pageProps['defaultController']])) {
      1 |. g! v! F8 G6 V6 {
    63.                 return $this->showError($this->LNG['page_doesnt_exist']);
      # G  ~. T2 d% n0 v$ w3 ]
    64.             }* x4 ^4 Q: U/ ^
    65.             $mode = $pageProps['defaultController'];
      8 j& G0 V& b6 ^& d# @  f
    66.         }
      3 A1 ~; F  b. C" z1 ]! z9 @4 G* O
    67. , g; }4 Z) r1 N  s- Z
    68.         // 調用相應的方法$ `" _  [# o( C) ]! W
    69.         return $this->pageObj->$mode();( M8 a. R- r, |, |# A) b3 g9 q3 f4 U
    70.     }/ \- X: x3 Z: _/ q) v+ _
    71. 3 a5 V1 U9 l) _
    72.     protected function showError($message)! e4 \3 b% j0 r* Y% L
    73.     {
      ( r$ i& T+ s; F& p) N
    74.         return view('errors/custom_error', ['message' => $message]);: r" j9 M  X" g
    75.     }
      " V0 M/ U& O" u- b* `

    76. , B( B; V% y1 u' w6 j
    77.     protected function isModuleAvailable($moduleId)7 @! D1 M% l3 F7 X+ S
    78.     {
      - |4 c$ V6 X( O* r
    79.         // 實現模組可用性檢查邏輯  M  u/ p2 E5 p) R- f
    80.         return true; // 根據實際需求修改: x$ n6 ?$ M& E$ l& f- x
    81.     }  |# V& L4 I! T2 L
    82. }, P0 T+ j8 I) ^0 C) A7 z5 w+ F: w. Y
    83. 2 y& ]& ?6 i4 m8 L' R- ^# O% f  `9 o
    84. // app/Controllers/Login/AbstractLoginPage.php4 x' }0 T: o4 \3 N% {! u
    85. namespace App\Controllers\Login;
      / K: M6 ~$ R6 A- P. S( p" Z

    86. , `) E9 v' V# G+ @$ h! |: d  y
    87. use CodeIgniter\Controller;; X, e6 A" l: e; a  [* O
    88. $ `* U" c3 w% @0 |; ^. E
    89. abstract class AbstractLoginPage extends Controller
      + i* x8 k, K& S# U
    90. {3 n# U& r- R1 c
    91.     // 實現基礎登錄頁面功能  `$ b! x, z$ ?5 U% P. t6 x
    92. }
      6 n1 [4 r% C9 R1 A# n0 I4 c
    93. / N  G" q+ {+ C* s
    94. // app/Controllers/Login/ShowErrorPage.php
      * c  o  B1 x+ R: S7 _
    95. namespace App\Controllers\Login;, d1 r' B7 N6 e
    96. - L2 U; P8 U( S8 f
    97. class ShowErrorPage extends AbstractLoginPage
      - V* @/ H* m  P# R- G
    98. {
      . g* a1 |: i  s* Z/ w- J
    99.     public static function printError($message)9 r- v, ^. w$ X/ ^& p0 A5 X
    100.     {/ Y& F) |: c$ J
    101.         $controller = new LoginController();
      ( _. W& C& u- e; P" R
    102.         return $controller->showError($message);3 w( q8 v: p4 J5 W) C$ s# b
    103.     }5 ]8 s  s' Z) B! s0 b& E
    104. }& a9 Q0 }: Z) Y' _0 g. L

    105. / T1 K7 ^) I$ D: A7 w  X
    106. // app/Controllers/Login/ShowIndexPage.php2 {' L. w: e2 L# N# A* I) M3 `8 w% s. H
    107. namespace App\Controllers\Login;# A8 P8 ?' |8 ]& o2 _
    108. + _; [: K8 }% C; W* _6 R
    109. class ShowIndexPage extends AbstractLoginPage
      7 g9 P# i$ ~5 O2 J0 B1 i
    110. {. m7 t: S9 O" \# H0 c# ^
    111.     public function show()
      9 _: Q: w- M' C# [; y
    112.     {
      2 j$ }9 E! g9 S; m0 ]
    113.         // 實現登錄頁面顯示邏輯8 e* E! \, E. @% A5 z
    114.         return view('login/index');+ Y7 ^# `( H& ]: R7 i7 }2 h9 e1 b
    115.     }8 i' B5 b4 I" ^& I( [0 x; c( t! V
    116. }4 q) M, o  K" ]4 K, i+ a9 c
    複製程式碼

    文章的最近訪客

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

    本版積分規則

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

    GMT+8, 2026-6-30 07:29 , Processed in 0.012935 second(s), 10 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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