# 創建表單
在前面的章節中,我們已經為用戶創建了一個 `resource` 路由。
~~~php
// route.php
Route::resource('auth', 'user/auth');
~~~
所以我們只需要在對應的控制器上進行頁面輸出即可。
打開 `application\user\controller\Auth.php`:
~~~php
/**
* 顯示編輯資源表單頁.
*
* @param int $id
* @return \think\Response
*/
public function edit($id)
{
$user_id = Session::get('user.id');
if ($user_id !== $id) {
return redirect('user/auth/edit', ['id' => $user_id]);
}
$user = User::find($user_id);
$this->assign([
'user' => $user,
]);
return $this->fetch();
}
~~~~
可以看到 `edit` 方法代碼前三行中先檢驗了 id 是否是當然登入用戶的 id,如果不是,就跳轉到當然登入用戶的編輯頁面,需要注意的是,即使這樣進行了跳轉,也不是安全的。
然后進入 blade `resources\views\user\auth\read.blade.php`:
~~~html
<div class="panel-heading mb-3">
<h4>歡迎您 {{ $user->name }}</h4>
++++
<a class="btn btn-primary" href="{{ url('user/auth/edit', ['id' => session('user.id')]) }}">編輯資料</a>
++++
</div>
~~~~
這時候在用戶個人資料頁面就會出現 `編輯資料` 的按鈕了,不過此時點擊進去,會拋出模板文件不存在的錯誤,所以現在來創建模板。
新建 blade `resources\views\user\auth\edit.blade.php`:
~~~html
@extends('_layout.default')
@section('title', $user->name)
@section('content')
<div class="col-md-offset-2 col-md-8">
<div class="panel panel-default mt-5">
<div class="panel-heading mb-3">
<h4>編輯 {{ $user->name }} 的個人資料</h4>
</div>
@if(session('validate'))
<div class="alert alert-warning" role="alert">
{{ session('validate') }}
</div>
@endif
<div class="panel-body">
<form method="POST"
action="{{ url('update', ['id' => $user->id]) }}">
@php echo token() @endphp
<input type="hidden" name="_method" value="PUT" >
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">用戶名</span>
</div>
<input type="text"
class="form-control"
placeholder="{{ $user->name }}"
name="name">
</div>
<button type="submit"
class="btn btn-primary btn-block">更新</button>
</form>
</div>
</div>
</div>
@stop
~~~~
在上面這段代碼中,我們添加了一行 `<input type="hidden" name="_method" value="PUT" >`,其中,`value="PUT"` 表示偽裝請求類型。
因為我們是要更新用戶資料,所以對應控制器的 `update` 方法,可是在 HTML 標準里,FORM 只有 POST GET 兩種方法,所以采用 INPUT 里進行類型偽裝的方式,讓控制器識別出是更新的操作。
創建模板完成之后,刷新頁面,即可看見剛剛添加好的表單。
## 接收數據
打開控制器 `application\user\controller\Auth.php`:
~~~php
/**
* 保存更新的資源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
$name = $request->name;
$user_id = Session::get('user.id');
if ($user_id !== $id) {
return redirect('user/auth/edit', ['id' => $user_id])->with('validate', '非法操作');
}
User::where('id', $user_id)->update(['name' => $name]);
Session::set('user.name', $name);
return redirect('user/auth/edit', ['id' => $user_id])->with('validate', '修改成功');
}
~~~
這段代碼中,我們首先將 id 與登入用戶的 id 進行對比,以防止模擬表單請求來修改其他用戶。
其次,在數據庫更新賬戶名之后,使用 `session set` 重新設置用戶名,保證前端數據的一致性。
這時候,刷新頁面,在輸入框中隨意填寫一些字符,再點擊更新按鈕,頁面上就已經修改成功了。
## 驗證數據
雖然我們現在已經實現了整個更新用戶資料的操作邏輯,但是還不算完,由于前端無法對提交數據進行任何限制,所以在后端要進行二次校驗。
鍵入命令 `php think make:validate app\user\validate\UpdateUser`,并打開剛剛創建好的文件:
~~~php
protected $rule = [
'__token__' => 'token',
'name|名字' => 'require|max:50',
];
~~~
接著返回控制器 `application\user\controller\Auth.php`:
~~~php
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', '非法操作');
}
$requestData = $request->put();
$result = $this->validate($requestData, 'app\user\validate\UpdateUser');
if (true !== $result) {
return redirect('user/auth/edit', ['id' => $user_id])->with('validate', $result);
} else {
$name = $requestData['name'];
User::where('id', $user_id)->update(['name' => $name]);
Session::set('user.name', $name);
return redirect('user/auth/edit', ['id' => $user_id])->with('validate', '修改成功');
}
}
~~~
可以看到這段代碼增加了驗證數據的步驟,驗證唯一 id -> 驗證提交數據,最后再進行數據庫更新,這樣才能提高后端的安全可靠性。
返回前端頁面,嘗試不填寫任何數據就直接提交,就會看到名字不能為空的警告了,屆時,整個更新流程已經書寫完畢。
- 第一章. 基礎信息
- 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 小結