# 使用資源路由及控制器
修改路由路徑 `route\route.php`:
~~~~ php
~Route::get('/signup', 'user/auth/create');~
Route::resource('auth', 'user/auth');
~~~~
在 ThinkPHP 的資源路由解析中,以上語句表示注冊了一個名稱為 `auth` 的資源路由到 `user` 模塊的 `auth` 控制器,實際注冊的路徑就是 `application\user\controller\Auth.php`.
打開 `Auth` 控制器 `application\user\controller\Auth.php`,在之前的章節中我們已經使用 `Think` 命令行來創建了一個資源控制器,可以看到系統為我們自動生成了 7個 模塊,其中包括:
標識 | 請求類型 | 生成路由規則 | 對應操作方法(默認)
------------ | ------------- | ------------- | -------------
index | GET | auth | index
create | GET | auth/create | create
save | POST | auth | save
read | GET | auth/:id | read
edit | GET | auth/:id/edit | edit
update | PUT | auth/:id | update
delete | DELETE | auth/:id | delete
可以看到,我們在表單注冊頁面的 `URL`路徑是 `http://thinkphp.test/user/auth/create.html`.
在 6.2 章節中我們寫入的 HTML 代碼 `<form method="POST" action="{{ url('save') }}">` 其中 `url('save')` 就是對應上面路由規則的 `save` 方法,也就是在 `auth` 控制器中的 `public function save(Request $request)`.
在 `save` 方法下添加:
~~~~ php
public function save(Request $request)
{
dump($request->post());
}
~~~~
`$request` 是 ThinkPHP 提供的一個請求方法: http://www.hmoore.net/manual/thinkphp5_1/353985 ,用于獲取所有發送至當前控制器的方法/值.
而這一段 `save(Request $request)` 則是通過 `依賴注入` 將 `use think\Request;` 注入到此控制器.
## 依賴注入
> 依賴注入其實本質上是指對類的依賴通過構造器完成自動注入,例如在控制器架構方法和操作方法中一旦對參數進行對象類型約束則會自動觸發依賴注入,由于訪問控制器的參數都來自于 `URL` 請求,普通變量就是通過參數綁定自動獲取,對象變量則是通過依賴注入生成. http://www.hmoore.net/manual/thinkphp5_1/353958
依賴注入與控制反轉相輔相成,大多數面向對象的編程語言,在調用一個類時都需要先進行實例化 `$class = new class()` 生成一個對象,那么當我們在一個 `function` 中使用 `class()` 類的方法則需要:
~~~~ php
class x{
a = new b()
}
~~~~
如果要傳遞參數,則要改為:
~~~~ php
class x{
a = new b(param)
}
~~~~
如果我們有一個對 `class b` 的改動,那么我們在 `class x` 當中也需要對之修改,這就是 `x` 對 `b` 的依賴,例如現在 `class b` 將接收至少兩個參數,在 `class x` 當中我們就要修改為:
~~~~ php
class x{
a = new b(param1, param1)
}
~~~~
就要分別修改兩次,這樣的傳遞參數是高度耦合的,在一個中大型項目中這樣的依賴可能多大幾十個,如果一個依賴的構造改變,那么其余的幾十個也要隨之修改,這樣的工程繁瑣且易錯,程序也會極難維護,要解決這個問題,就出現了 `控制反轉` 的思想,把 `class b` 從 `class x` 中抽離出來,交給第三方的構造器去控制依賴,ThinkPHP 使用的是: http://www.hmoore.net/manual/thinkphp5_1/353958, 通過 `構造函數,工廠模式` 等方法,注入到 `class b`,這樣就進行了解耦.
## 提交表單
我們在 6.2 創建的表單上隨意填寫些字符,并提交,則會出現:
~~~~ array
array (size=5)
'__token__' => string '7831e09189d70586bd3145bb486ea556e1f9dd4b' (length=40)
'name' => string 'test' (length=4)
'email' => string 'test@test' (length=9)
'password' => string 'test' (length=4)
'password_confirmation' => string 'test' (length=4)
~~~~
可以看到, `$request` 方法已經能夠獲取到從前端應用發送過來的值,現在再修改控制器:
~~~~ php
public function save(Request $request)
{
dump($request->name);
}
~~~~
`$request->name` 就是獲取提交表單中 `<input type="text" class="form-control" name="name">` `name` 字段的值,也是上面打印出來的 `'name' => string 'test' (length=4)` 的值.
## 創建驗證器
在控制臺中鍵入 `php think make:validate user/Auth` 會創建 `application\user\validate\Auth.php`,打開此文件并鍵入:
~~~~ php
protected $rule = [
'__token__' => 'token',
'name|名字' => 'require|max:50',
'email|郵件' => 'require|email|unique:users|max:255',
'password|密碼' => 'require|confirm|min:6'
];
~~~~
在驗證規則中, `name|名字(驗證字段|別名)`,別名的作用是在驗證出錯之后會發送 `別名+錯誤信息`,在未設置別名之前,錯誤信息會輸出 `name 不能為空`,而設置之后則會輸出 `名字不能為空`.
`unique:users` 則是值在 users 表里唯一字段,不得重復, `confirm` 將會自動對比 `密碼(name="password")` `確認密碼(name="password_confirm")` 字段的值,更多內置的驗證規則請查看: http://www.hmoore.net/manual/thinkphp5_1/354107
## 設置驗證器
打開控制器 `application\user\controller\Auth.php` 并修改:
~~~~ php
public function save(Request $request)
{
$requestData = $request->post();
$result = $this->validate($requestData, 'app\user\validate\Auth');
if (true !== $result) {
dump($result);
} else {
dump($requestData);
}
}
~~~~
`validate($requestData, 'app\user\validate\Auth')` 的前部分表示傳入的值,后半部分表示要使用的驗證器.
現在在重新返回前端頁面進行嘗試提交不同的表單,則可以看到傳入值正確/錯誤而返回的不同提示/值.
- 第一章. 基礎信息
- 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 小結