Tìm hiểu Laravel từ số 0 (P6)
Ở phần trước tôi đã đi đến nội dung tạo Form. Trong bài này tôi sẽ đi tiếp đến các phần nội dung sau : Form validation Formrequest Error message Scope View Partial Controller Tôi sẽ đi bước đầu tiên với controller để validate dữ liệu được nhập vào Form đã tạo. Đó là phải chỉnh sửa ...
Ở phần trước tôi đã đi đến nội dung tạo Form. Trong bài này tôi sẽ đi tiếp đến các phần nội dung sau :
- Form validation
- Formrequest
- Error message
- Scope
- View Partial
Controller
Tôi sẽ đi bước đầu tiên với controller để validate dữ liệu được nhập vào Form đã tạo. Đó là phải chỉnh sửa phương thức store() như sau :
<?php namespace AppHttpControllers; // app/Http/Controllers/ArticlesController.php use AppArticle; use AppHttpControllersController; use IlluminateHttpRequest; // ①' class ArticlesController extends Controller { // ... public function store(Request $request) { // ① $rules = [ // ② 'title' => 'required|min:3', 'body' => 'required', 'published_at' => 'required|date', ]; $this->validate($request, $rules); // ③ Article::create($request->all()); return redirect('articles'); } }
Phần ① tôi đã thay đổi cách lấy request. Lần trước tôi sử dụng facade Request để access vào request nhưng ở đây đã đổi thành lấy ra instance của lớp IlluminateHttpRequest từ đối số của phương thức store(). Đây là cách hoạt động rất hay của Laravel controller, khi mà ta chỉ cần ghi vào tên lớp vào đối số của phương thức thì tự động instance của lớp sẽ được sinh ra.
Phần ② là chỗ thiết lập những rule validate dữ liệu. Chúng ta có thể lập được rất nhiều rule nhưng trong bài này tôi chỉ đưa vào vài ví dụ như đoạn code trên. Chi tiết hơn bạn có thể xem tại : http://laravel.com/docs/5.1/validation#available-validation-rules
Phần ③ tôi đang thực hiện phương thức validate() của Controller. Ở đây nếu như có lỗi thì Laravel có cơ chế tự động giúp ta được redirect trở về màn hình trước đó.
View
Xong phần xử lý bên Controller thì việc còn lại sẽ là hiển thị những lỗi bắt được lên View. Nếu như có nhiều lỗi thì ta sẽ nhận được mảng chứa chúng nên tôi sẽ dùng foreach để duyệt rồi hiển thị chúng ra màn hình.
// resources/views/articles/create.blade.php @extends('layout') @section('content') <h1>Write a New Article</h1> <hr/> {{-- Tôi thêm phần hiển thị lỗi --}} @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif {!! Form::open() !!} ... {!
Việc thiết lập đã hoàn tất, bạn có thể truy cập vào http://localhost:8000/articles/create nhưng không nhập gì cả mà ấn nút Add Article, nếu error message hiển thị là xong.
Bước trên tôi đã thiết lập xong validate Form, giờ tôi sẽ dùng 1 chức năng là Formrequest để refactor phần đó.
Tạo Formrequest
Tôi sử dụng artisan để tạo ra FormRequest dùng cho Article.
php artisan make:request ArticleRequest
Và file app/Http/Requests/ArticleRequest.php sẽ được tạo ra với nội dung như sau :
<?php // app/Http/Requests/ArticleRequest.php namespace AppHttpRequests; use AppHttpRequestsRequest; class ArticleRequest extends Request { public function authorize() { return false; } public function rules() { return [ // ]; } }
Sửa ARTICLEREQUEST.PHP
Tôi tiến hành sửa nội dung thành :
<?php namespace AppHttpRequests; use AppHttpRequestsRequest; class ArticleRequest extends Request { public function authorize() { return true; // ① } public function rules() { return [ // ② 'title' => 'required|min:3', 'body' => 'required', 'published_at' => 'required|date', ]; } }
Phần ① tôi sẽ thiết lập quyền hạn đối với request bằng phương thức authorize(). Ví dụ nhưng user đang login hiện tại mà ko có quyền thì sẽ trả về false. Nhưng bây giờ thì ai cũng có thể tạo được dữ liệu Article nên sẽ trả về true.
Phần ② trả về validation rule bằng phương thức rules().
Controller
Tiếp theo tôi sẽ đi sửa để trên phương thức store() của ArticlesController sẽ sử dụng ArticleRequest.
<?php namespace AppHttpControllers; // app/Http/Controllers/ArticlesController.php use AppArticle; use AppHttpControllersController; use AppHttpRequestsArticleRequest; // ①' class ArticlesController extends Controller { // ... public function store(ArticleRequest $request) { // ① // đoạn validate ở đây giờ ko cần nữa Article::create($request->all()); return redirect('articles'); } }
Phần ① như bạn thấy là tôi đã đổi từ IlluminateHttpRequest sang dùng AppHttpRequestsArticleRequest. Chỉ cần thiết lập như vậy là bạn đã có thể không cần đến validate đã thiết lập ở bước đầu tiên nữa nhưng kết quả vẫn sẽ tương tự. Controller lúc này đã trở lên sạch sẽ hơn rồi