# 升級框架
請運行 `composer update` 升級框架至最新的安全版本.
## 中間件攔截
在上一章因為中間件失效,我們采用了最原始也是最啰嗦的方法判斷用戶狀態,升級版本之后則可以正常使用中間件.
之前判斷的方式:
~~~~ php
if (SessionFacade::has('user'))
~~~~
現在創建一個新的中間件,鍵入命令:
~~~~ shell
php think make:middleware Auth
~~~~
打開新建好的中間件文件 `application/http/middleware/Auth.php` 并寫入:
~~~~ php
public function handle($request, \Closure $next)
{
return $next($request);
}
~~~~
`return $next($request);` 表示返回一個 `response` 對象,可以理解為進行下一步的操作.
如果我們想往控制器內傳參,則只需要編寫:
~~~~ php
public function handle($request, \Closure $next)
{
$request->hello = 'ThinkPHP';
return $next($request);
}
~~~~
然后在控制器內調用:
~~~~ php
public function index(Request $request)
{
return $request->hello; // ThinkPHP
}
~~~~
當然了,本節是要管理用戶的狀態,所以請刪除前面的代碼,并寫入:
~~~~ php
if (session('?user')) {
return $next($request);
} else {
redirect('user/session/create')->with('validate', '請先登錄');
}
~~~~
上面代碼是標準的流程控制語句,你也可以寫成三元運算的方式:
~~~~ php
return
session('?user')
? $next($request)
: redirect('user/session/create')->with('validate', '請先登錄');
~~~~
這兩段代碼作用相同,以讀者喜好為準.
請注意,`session()` 方法是 ThinkPHP 框架的助手函數,詳細文檔請查看: http://www.hmoore.net/manual/thinkphp5_1/354117
在本段代碼中,`session('?user') 與 Session::has('user')` 等效,`session('user') 與 Session::get('user')` 等效
## 使用中間件
打開 `application/user/controller/Session.php`:
~~~~ php
class Session extends Controller
{
protected $middleware = [
'Auth' => [
'except' => [
'create',
'save'
]
],
];
~~~~
`protected $middleware` 則是初始化一個中間件,而 `except` 方法表示,當前控制器下有哪些方法是不使用中間件的.
然后看到 `public function create()` 并修改為:
~~~~ php
public function create()
{
return $this->fetch();
}
~~~~
可以對比之前的代碼,我們刪除了`如果用戶登錄則自動跳轉` 以及 `token` 輸出,后續操作下面再進行說明.
再看到 `public function delete($id)` 修改:
~~~~ php
public function delete($id)
{
session('user', null);
return redirect('user/session/create')->with('validate', '您已退出');
}
~~~~
可以看到,使用中間件之后,代碼干凈了很多.
再打開 `application/user/controller/Auth.php`:
~~~~ php
class Auth extends Controller
{
protected $middleware = [
'Auth' => [
'except' => [
'create',
'save'
]
],
];
public function create()
{
return $this->fetch();
}
public function read($id)
{
$user = User::find($id);
$this->assign([
'user' => $user,
]);
return $this->fetch();
}
~~~~
基本的中間件已經使用了,但是現在不管訪問什么鏈接,都會跳出 `未定義變量: token ` 的錯誤,現在來編寫前端頁面 `resources/views/_layout/header.blade.php`:
~~~~ html
<div class="dropdown-menu"
aria-labelledby="dropdownMenuButton">
<a class="dropdown-item"
href="{{ url('user/auth/read', ['id' => session('user.id')]) }}">個人主頁</a>
<a class="dropdown-item">
<form action="{{ url('user/session/delete', ['id' => session('user.id')]) }}"
method="POST">
@php echo token() @endphp
<button class="btn btn-block"
type="submit"
name="button">退出</button>
</form>
</a>
</div>
~~~~
可以看到,我們將原先的:
`<input type="hidden" name="__token__" value="{{ $token }}" />`
修改為了:
`@php echo token() @endphp`
`token()` 方法是框架自帶的 `token` 生成方式.
同樣的,全局查找:
`<input type="hidden" name="__token__" value="{{ $token }}" />`
并且替換為:
`@php echo token() @endphp`
現在 token 輸出的問題解決了,還有一項,在用戶以及登錄的情況下,進入登錄/注冊頁面都會顯示輸入框,我們再來進行優化
打開 `resources/views/user/session/create.blade.php` 和 `resources/views/user/auth/create.blade.php`:
~~~~ html
......
@if(session('validate'))
<div class="alert alert-warning" role="alert">
{{ session('validate') }}
</div>
@endif
@if(session('user'))
<div class="alert alert-success" role="alert">
您已登入賬戶: {{ session('user')->name }}
</div>
@endif
~~~~
現在,在登錄的狀態下訪問 `http://thinkphp.test/user/session/create.html` 看到綠色的已登錄提示框.
- 第一章. 基礎信息
- 1.1 序言
- 1.2 關于作者
- 1.3 本書源碼
- 1.4 反饋糾錯
- 1.5 安全指南
- 1.6 捐助作者
- 第二章. 開發環境布置
- 2.1 編輯器選用
- 2.2 命令行工具
- 2.3 開發環境搭建
- 2.4 瀏覽器選擇
- 2.5 第一個應用
- 2.6 Git 工作流
- 第三章. 構建頁面
- 3.1 章節說明
- 3.2 靜態頁面
- 3.3 Think 命令
- 3.4 小結
- 第四章. 優化頁面
- 4.1 章節說明
- 4.2 樣式美化
- 4.3 局部視圖
- 4.4 路由鏈接
- 4.5 用戶注冊頁面
- 4.6 集中視圖
- 4.7 小結
- 第五章. 用戶模型
- 5.1 章節說明
- 5.2 數據庫遷移
- 5.3 查看數據表
- 5.4 模型文件
- 5.5 小結
- 第六章. 用戶注冊
- 6.1 章節說明
- 6.2 注冊表單
- 6.3 用戶數據驗證
- 6.4 注冊失敗錯誤信息
- 6.5 注冊成功
- 6.6 小結
- 第七章. 會話管理
- 7.1 章節說明
- 7.2 會話
- 7.3 用戶登錄
- 7.4 退出
- 7.5 小結
- 第八章. 用戶 CRUD
- 8.1 章節說明
- 8.2 重構代碼
- 8.3 更新用戶
- 8.4 權限系統
- 8.5 列出所有用戶
- 8.6 刪除用戶
- 8.7 訪客模式
- 8.8 優化前端
- 8.9 小結
- 第九章. 微博 CRUD
- 9.1 章節說明
- 9.2 微博模型
- 9.3 顯示微博
- 9.4 發布微博
- 9.5 微博數據流
- 9.6 刪除微博
- 9.7 小結