Request Laravel Phần 1

Trong các bài trước chúng ta đã có nhắc đến khái niệm Request chắc hẳn nhiều bạn thắc mắc về nó phải không nào, vậy thì ngày hôm nay, chúng ta sẽ cùng nhau tìm hiểu về "Request", nói đúng hơn là  cách sử dụng, khai thác một HTTP request trong Laravel.

I. Truy cập request (Accessing the request)

Để có được object request hiện tại thông qua denpendency injection, bạn cần type-hint Illuminate\Http\Request class trên controller method. Object request sẽ tự động inject bởi service container.

{
    public function store(Request $request)
    {
        //
    }
}

1. Dependency injection & Route parameters

Như đã đề cập ở các bài trước, nếu trong method controller có nhận các dữ liệu từ tham số URI, thì chúng ta nên khai báo chúng sau các dependency class. Chẳng hạn bạn có route sau:

Route::put('user/{id}', 'UserController@update');

Bạn có thể inject Illuminate\Http\Request class và lấy dữ liệu tham số id theo cách sau:

{
    public function update(Request $request, $id)
    {
        //
    }
}

Như bạn thấy, ta sẽ ưu tiên inject dependency class trước các tham số trong route.

2. Truy cập request thông qua Route Closure (Accessing the request via route closure)

Nếu việc xử lý logic quá ngắn gọn, chúng ta có thể inject Iluminate\Http\Request tại file route như thế này:

use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
    //
});

II. Request path & Method

Illuminate\Http\Request cung cấp cho chúng ta rất nhiều method để kiểm tra HTTP request hiện tại. Dưới đây là một số các method quan trọng thường được sử dụng.

1. Lấy request path (Retrieving the request path)

Với method path sẽ trả về path của request hiện tại. Nếu request hiện tại có url là http://domain.com/foo/bar thì method path sẽ trả về foo/bar.

routes/web.php

use Illuminate\Http\Request;
Route::get('/foo/bar', function (Request $request) {
    return $request->path();
});

Chúng ta có thể dùng đoạn code trên để test.

Method is cho phép bạn xác thực rằng request path hiện tại khớp với pattern mà bạn đưa ra. Bạn có thể sử dụng ký tự * để làm đại diện cho các thành phần phía sau.

routes/web.php

use Illuminate\Http\Request;
Route::get('/admin/post', function (Request $request) {
    if ($request->is('admin/*')) {
        return 'Request path matches with "admin/*" pattern';
    }
});

Pattern ở đây chính là admin/*, nếu ta truy cập request path admin/post thì chắc chắn sẽ trùng khớp.

2. Lấy request URL (Retrieving the request URL)

Để có thể lấy được đầy đủ URL của request hiện tại, chúng ta có thể sử dụng method url hoặc fullUrl. Tuy nhiên method url sẽ trả về URL không chứa query string, còn method fullUrl sẽ trả về URL kèm với query string.

Để có thể hiểu hơn về sự khác biệt này, các bạn đăng ký route fallback như sau:

routes/web.php

use Illuminate\Http\Request;
Route::fallback(function (Request $request) {
    return dd([
        $request->url(),
        $request->fullUrl()
    ]);
});

Ở đây chúng mình đăng ký route fallback để có thể test với bất kỳ đường dẫn nào. Chúng mình truyền hai method url và fullUrl vào trong một mảng rồi sau đó dump ra trình duyệt để dễ dàng quan sát.

Các bạn nạp server và truy cập đường dẫn http://localhost:8000/post?id=1 chẳng hạn, đây là kết qua chúng ta thu nhận được:

3. Lấy request method (Retrieving the request method)

Để lấy request method chúng ta chỉ cần sử dụng phương thức method để lấy method HTTP hiện tại của request. Ngoài ra, chúng ta có thể kiểm tra method HTTP của request hiện tại bằng phương thức isMethod với tham số truyền vào là method HTTP bạn muốn khớp với method HTTP của request hiện tại.

routes/web.php

use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
    echo 'Current method HTTP: ' . $request->method() . '
';
    
    if ($request->isMethod('get')) {
        echo 'This is GET method HTTP';
    }
});

Kết quả như sau:

III. Chuẩn hóa input (Input normalization)

Mặc định thì Laravel đã kết nối hai middleware TrimStringsConvertEmptyStringsToNull trong ứng dụng. Các middleware này được liệt kê trong lớp App\Http\Kernel, cụ thể tại $middleware. Các middleware này có chức năng sẽ tự động trim tất cả các trường chứa chuỗi trên request, hơn thế nữa là chuyển đổi bất kỳ trường trống nào về giá trị null. Với nó, bạn sẽ không cần phải quá lo lắng về việc chuẩn hóa input trong route hay controller nữa.

Nếu bạn muốn vô hiệu hóa hai middleware này, bạn có thể xóa nó khỏi $middleware tại class App\Http\Kernel.

Lời kết:

Do phần sau hơi dài nên mình sẽ tách Request Laravel thành 2 phần cho các bạn dễ thực hành đỡ rối Hẹn các bạn ở bài Request Laravel Phần 2 nhé.

Bình luận