Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài viết bạn đang xem là tài liệu của Laravel 5x (Giờ đã ngừng support). Bạn có thể xem tài liệu của Laravel mới nhất và đầy đủ tại đây.

Bài 18: Form Request trong Larvel

-Sau khi đã giới thiệu với các bạn về modelcontroller,.. thì tiếp đến ở bài này mình sẽ giới thiệu về Form Request một thứ không thể thiếu trong một framwwork.

-Và để bắt đầu chúng ta cần tạo cho nó một view.

1,Tạo View.

-Đầu tiên mình sẽ tạo ra một view FormRequest.blade.php có nội dung như sau:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Test form</title>
    <link rel="stylesheet" href="">
</head>
<body>
    <form action="{{ url('handle-form') }}" method="POST" role="form">
        <legend>Test submit form</legend>
        {{ csrf_field()}}
        <div class="form-group">
            <label for="">label</label>
            <input type="text" name="name" class="form-control" id="" placeholder="Input field">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
</body>
</html>

-Ở đây mình có tạo ra một form có một trường name input, một button submit và một action {{ url('handle-form') }} (action này nó sẽ có chức năng gọi đến đường dẫn yourdomain.com/handle-form ).

Chú ý: đối với Laravel khi xử lý form thì bắt buộc phải có csrf_token (tránh tấn công xss) nếu không thì sẽ không thực hiện được submit form được. Để tạo csrf_token cho form chúng ta có 2 cách sau:

  • Dùng: {{ csrf_field() }}
  • Dùng: <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> hoặc <input type="hidden" name="_token" value="{{ csrf_token() }} ?>"> đối với blade template.

2,Tạo controller.

-Tiếp theo mình lại tạo thêm một handleController để xử lý Reuqest.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HandleController extends Controller
{
    public function getForm(){
        return view('FormRequest');
    }
    
    public function handleRequest(Request $request){
        // nhan het du lieu co trong form
        return $request->all();
    }
}

-Ở trên mình có tạo ra 2 function:

  • getForm: để hiển thị view form-request.blade.php ở trên.
  • handleRequest: để xử lý nhận dữ liệu của form.

=>Chú ý:  Để nhận dữ liệu từ form được thì chúng ta cần phải truyền vào hàm nhận một lớp Request.(Nói ở phần dưới).

3,Tạo Route.

-Sau khi đã tạo xong View vào Controller giờ mình sẽ tạo tiếp 2 Route để hiện view và xử lý dữ liệu.

Route::get('get-form',['uses'=> 'HandleController@getForm']);
Route::post('handle-form',['uses'=> 'HandleController@handleRequest']);

//Hoặc ngắn gọn hơn như sau

Route::get('get-form', 'HandleController@getForm');
Route::post('handle-form', 'HandleController@handleRequest');

-Cái này thì mình không giải thích nữa nhé (ai không hiểu xem lại route ).

4,Các hàm xử lý request.

-Trong Laravel hỗ trợ chúng ta rất mạnh về xử lý nhận dữ liệu từ form. Nên trong bài này mình sẽ không thể nêu hết các phương thức, thuộc tính mà Laravel hỗ trợ được, mình sẽ nêu ra các phương thức, thuộc tính hay dùng thôi.

Lấy hết dữ liệu của form.

-Để hết dữ liệu của form gửi lên thì Laravel. thì mọi người sử dụng phương thức all().

VD: đối với view trên mọi người sẽ nhận như sau.

public function handleRequest(Request $request)
{
    // nhan het du lieu co trong form
    return $request->all();
}

Lấy dữ liệu theo name định sẵn.

-Để lấy dữ liệu của name định sẵn các bạn sử dụng cú pháp:

$request->input('inputname');

Hoặc

$request->inputname;

Hoặc:

$request->get('inputname');

 

  • Chú thích: inputName là name của input các bạn đặt ở form.

VD: Mình sẽ lấy giá trị của name='name' ở trong view trên như sau:

public function handleRequest(Request $request)
{
    return $request->get('name');
}

Lấy dữ liệu của nhiều name.

Cú Pháp:

public function handleRequest(Request $request)
{
    return $request->get('name');
}

-Hàm này cho phép lấy giá trị của nhiều name và trả về dữ liệu mảng.

Kiểm tra phương thức gửi của form.

-Laravel có cung cấp luôn cho chúng ta hàm kiểm kiểu submit của form là GET,POST,.. Cú pháp xử lý như sau:

public function handleRequest(Request $request)
{
    return $request->isMethod('post');
}

-phương thức này trả về kiểu giá trị boolean (true,false);

Lấy path của form.

-Cú Pháp:

public function handleRequest(Request $request)
{
    return $request->path();
}

-Hàm này cho phép chúng ta lấy đường dẫn tới form.

VD: http://domain.com/form/submit/

Giới hạn đường dẫn gửi form.

Cú Pháp:

public function handleRequest(Request $request){
    return $request->is('something');
}

-Hàm này có tác dụng giới hạn các url được chấp nhận gửi form.

VD: chỉ muốn nhận dữ liệu từ đường dẫn có path bắt đầu bằng admin

public function handleRequest(Request $request)
{
    if ($request->is('admin/*')) {
        // code
    }
}

Sử dụng collections trong form.

-Với sự hỗ trợ mạnh mẽ của Laravel thì các bạn cũng có thể sử dụng collection trong Form Request.

VD:

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

3, Lời kết.

-Phần trên mình đã giới thiệu với mọi người về Form Request trong Laravel rồi, tuy nó chỉ là lý thuyết nhưng nó sẽ là nền tảng cho bạn khi làm việc với Laravel về sau.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

7 Comments

Hay qua!

Le Tuan

6 năm trước

ok

Le Tuan

6 năm trước

Viết thì có tâm một chút.

Không rõ làm sao chạy được View: FormRequest.blade.php trong khi cả Routing và Controller không hề đề cập tới ^^

getForm thì show ra: view('test'); mà chạy được: FormRequest.blade.php ????

Lạy.

Rảnh rổi

5 năm trước

Cú pháp input('name1','name2')

Cái này em dùng nó không ra mảng đâu ạ.

Theo như em tìm hiểu thì input chỉ nhận 1 giá trị của thằng đầu tiên ạ, name2 giống như giá trị mặc định của name1, nếu name1 là null hoặc không tồn tại thì nó hiển thị name2 ạ.

Anh xác nhận lại giúp em với ạ, vì em đã code thử nhưng không ra mảng giống như anh nói ạ.

Em cảm ơn anh.

MaiNT

5 năm trước

Xin lỗi bạn, đoạn này mình viết nhầm.

Vũ Thanh Tài

5 năm trước

Cảm ơn bạn đã feedback nhé!

Vũ Thanh Tài

5 năm trước

  • Dùng:

Minh

2 năm trước

Bình luận

Captcha