# HTTP 請求
這裏會介紹如何在 Laravel 5 驗證 HTTP 請求的資料
### 建立新的請求驗證
如果我們有文章(Article)的模型,我們在每次請求過程中想要驗證傳入的資料,我們可以使用系列指令建立要驗證的請求:
~~~
$ php artisan make:request CreateArticleRequest
~~~
請求驗證的檔案會被建立在 `app\Http\Requests` 目錄下,建立的檔案內容如下
~~~
<?php namespace App\Http\Requests;
// app\Http\Requests\CreateArticleRequest.php
use App\Http\Requests\Request;
class CreateArticleRequest extends Request {
/**
* Determine if the user is authorized to make this request.
* 驗證使用者是否要登入狀態
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
* 驗證請求的資料規則
*
* @return array
*/
public function rules()
{
return [
// 使用 | 設定驗證規則
'title' => 'required|min:3',
'body' => 'required|min:30',
// 使用陣列設定驗證規則
'published_at' => [
'required',
'date',
],
];
}
}
~~~
在驗證請求的 CreateArticleRequest 中的 rules() 函式,除了僅回傳驗證規則外,你也可以判斷不同的狀況去加入不同的規則再回傳,像是:
~~~
<?php namespace App\Http\Requests;
// app\Http\Requests\CreateArticleRequest.php
use App\Http\Requests\Request;
class CreateArticleRequest extends Request {
public function rules()
{
$rules = [
// 使用 | 設定驗證規則
'title' => 'required|min:3',
'body' => 'required|min:30',
// 使用陣列設定驗證規則
'published_at' => [
'required',
'date',
],
];
// 其他條件判斷
if ($condition) {
$rules['something_else'] = 'required';
}
return $rules;
}
}
~~~
### 指定 Controller 函式處理指定的請求驗證
在我們使用 Controller 去處理請求時,我們可以再傳入變數內設定要怎麼處理請求:
~~~
class ArticleController extends Controller {
// 新增文章
public function store(App\Http\Requests\CreateArticleRequest $request)
{
Article::create(Request:all());
// OR
// Article::create($request->all());
return redirect('articles');
}
}
~~~
這樣設定之後,所有的 HTTP 請求的 Input 資料都會經過 `App\Http\Requests\CreateArticleRequest` 驗證,如果有經過驗證才會繼續執行後面的新增文章動作,否則的話則會丟出驗證錯誤的物件到原頁面。
### 驗證錯誤訊息
這裏要注意到,視圖(View)的每一頁 Laravel 都會將驗證錯誤物件(Illuminate\Support\ViewErrorBag)包成 `$errors` 變數,所以你可以在每一頁去印出 `$errors` 值,`$errors` 變數儲存的是任何資料驗證錯誤的結果
**判斷是否有任何的錯誤並顯示錯誤訊息**
~~~
// 任一 blade 視圖(View)皆可以接收此錯誤變數
@if($errors->any())
// 有錯誤訊息
<ul>
$foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
~~~
### 使用 Controller 內建的 validate 驗證請求的資料
除了建立驗證 Request 物件,也可以直接使用 Controller 內建的 validate 去驗證請求
如果不想要使用內建處理 HttpResponseException 的例外,你也可以自己 try catch 並自己處理例外狀況
~~~
class ArticleController extends Controller {
// 新增文章
public function store(Requests $request)
{
try {
$this->validate($request, [
'title' => 'required|min:3',
'body' => 'required|min:30',
'published_at' => 'required|date',
]);
} catch (Exception $e) {
// 自己處理例外狀況
}
Article::create(Request:all());
// OR
// Article::create($request->all());
return redirect('articles');
}
}
~~~
### 參考資料
- [Form Requests and Controller Validation - Laracasts](https://laracasts.com/series/laravel-5-fundamentals/episodes/12)
- 介紹
- 環境
- .env 檔案
- 資料庫
- Migration (遷移)
- Eloquent Model (模型)
- 設定
- 關聯
- 魔術函式
- 使用 Eloquent
- 常見問題
- 無法取得查詢 Log
- 使用大量資料的方式新增時無法新增
- 使用中繼模型繼承 Eloquent 模型造成無法使用大量資料新增
- PostgreSQL
- 安裝 PostgreSQL ODBC driver
- HTTP
- 請求
- 中介層 (Middleware)
- 視圖 (View)
- 服務
- 認證登入(Auth)
- 郵件(Mail)
- 使用 Gmail 寄信
- 使用 Mailgun 寄信
- 隊列(Queue)
- database
- 非同步(async)
- 輔助方法 (Helpers)
- 自定義輔助方法
- 單元測試 (Unit Test)
- Post CSRF 錯誤
- 錯誤與日誌
- 在單元測試顯示例外
- 日誌記錄層級
- 日誌巨集
- 加密
- 雜湊
- Elixir
- 使用 Elixir 合併 CSS 與 JS
- 設計模式
- 服務容器
- PSR
- Model 模型
- 學習資源
- 套件
- Debug
- Artisan tail
- 工具
- Carbon
- 設計模式
- 其他常見問題
- Call to undefined method getCachedCompilePath()
- 變更專案目錄名稱導致 View 無法讀取
- Laravel 5.1 目錄結構異動
- 學習資源
- 官方
- 社群
- 會議議程
- 工作
- 文件
- 文章
- 套件
- 服務工具
- 教學影片
- 教學網站
- 編輯開發
- 主機
- 成功案例