<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 優雅的權限 我們在上一節的開發當中,使用了大量重復的權限檢驗方法,例如 `$user_id = Session::get('user.id');`, 可是每次使用都要進行復制一遍,長期下來代碼將會變成又長又臭的面條,改一發而動全身,這樣的代碼可維護性大大降低,所以我們需要把這些代碼抽離,進行解耦。 ## 權限架構 我們前面的章節已經創建過了用戶是否登入的中間件 `application\http\middleware\Auth.php`,所以現在只需要判斷當前操作用戶是否與登入用戶一致就行了。 設計的權限架構如下所示: 策略方法進行一致性對比 -> 將行為注冊至鉤子 -> 控制器驗證輸出 創建文件 `application\behavior\UserPolicy.php`: ~~~php <?php namespace app\behavior; use think\facade\Session; class UserPolicy { public function run($params) { return (int) Session::get('user.id') === (int) $params ? true : false; } } ~~~ 這段代碼中,`run` 方法表示默認執行的邏輯操作,可以看到 return 的下一行判斷:如果當前用戶未登入或一致性不符,就會拋出 false。 請注意,在前面章節中所講述過 PHP 的全等判斷標準,事實上是要求“類型,值”一致,如果你這樣寫: ~~~php Session::get('user.id') === $params // Session::get('user.id') 類型為 string // $params 類型為 int // return false ~~~ 所以在做全等(三個等號)判斷時,一定要注意這點。 接下來,我們將在中間件內使用鉤子調用策略,鍵入命令 `php think make:middleware UserAuthorize` 并打開創建好的中間件文件: `application\http\middleware\UserAuthorize.php` ~~~php <?php namespace app\http\middleware; use think\facade\Hook; class UserAuthorize { public function handle($request, \Closure $next) { // 注冊 UserPolicy 策略,傳入請求的 ID 值,再根據上面的代碼進行判斷 $result = Hook::exec('app\\behavior\\UserPolicy', $request->id); return $result ? $next($request) : redirect('user/session/create')->with('validate', '非法操作'); } } ~~~ 接著打開之前創建好的兩個控制器: `application\user\controller\Auth.php` `application\user\controller\Session.php` 將里面的中間件名稱 `Auth` 更名為 `UserAuthorize` ~~~php 'Auth' => [ 'except' => [ 'create', 'save' ] ], //更改后 'UserAuthorize' => [ 'except' => [ 'create', 'save' ] ], ~~~ 然后刪除之前判斷用戶一致的多余代碼 `application\user\controller\Auth.php` ~~~php public function edit($id) { // 刪除 $user_id = Session::get('user.id'); if ($user_id !== $id) { return redirect('user/auth/edit', ['id' => $user_id]); } public function update(Request $request, $id) { // 刪除 $user_id = Session::get('user.id'); if ($user_id !== $id) { return redirect('user/auth/edit', ['id' => $user_id])->with('validate', '非法操作'); } ~~~ 然后在當前頁面下按下 ctrl+f,并在第一行鍵入 $user_id,第二行鍵入 $id,之后點擊如下圖所示的按鈕進行全局替換: [![eEC3Hx.png](https://s2.ax1x.com/2019/07/24/eEC3Hx.png)](https://imgchr.com/i/eEC3Hx) 本小節所寫內容都是為了避免“面條式代碼”,所謂“面條式代碼”就是將一行代碼多處復制使用,在后續維護中如果需要修改某一項功能,則需要找到所有被復制的代碼一一修改,這樣不僅毫無觀賞性,并且會對后續開發造成極大困擾。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看