12/08/2018, 15:46

Laravel: Tìm hiểu về HTTP Requests (Phần 1)

Accessing The Request Để lấy một instance của HTTP request hiện tại thông qua dependency injection, bạn nên type-hint vào class ```IlluminateHttpRequest``` trong phương thức controller. Các request đến sẽ được tự động injected bởi [service container](https://laravel.com/docs/5.4/container): ...

Accessing The Request


Để lấy một instance của HTTP request hiện tại thông qua dependency injection, bạn nên type-hint vào class ```IlluminateHttpRequest``` trong phương thức controller. Các request đến sẽ được tự động injected bởi [service container](https://laravel.com/docs/5.4/container):
<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

Dependency Injection & Route Parameters

Nếu phương thức controller của bạn cũng mong đợi input từ tham số route thì bạn nên liệt kê danh sách tham số route vào sau các dependencies khác của bạn. Ví dụ, nếu route của bạn định nghĩa như sau:

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

Bạn vẫn có thể type-hint IlluminateHttpRequest và truy cập vào tham số route id bằng cách định nghĩa phương thức trong controller như sau:

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    /**
     * Update the specified user.
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

Accessing The Request Via Route Closures

Bạn cũng có thể type-hint class IlluminateHttpRequest trong route Closure. Service container sẽ tự động inject các request Closure khi nó được thực thi:

use IlluminateHttpRequest;

Route::get('/', function (Request $request) {
    //
});

Request Path & Method

Đối tượng IlluminateHttpRequest cung cập một số phương thức để kiểm tra HTTP request cho ứng dụng của bạn và kế thừa class SymfonyComponentHttpFoundationRequest. Chúng ta sẽ thảo luận một số phương thức quan trọng dưới đây.

Retrieving The Request Path

Phương thức path trả về thông tin đường dẫn của request. Vì vậy, Nếu request gửi đến là http://domain.com/foo/bar, phương thức path sẽ trả về foo/bar:

$uri = $request->path();

Phương thức is sẽ cho phép bạn xác nhận những request gửi đến có đường dẫn phù hợp với pattern hay không. Bạn có thể sử dụng ký tự * khi sử dụng phương thức này:

if ($request->is('admin/*')) {
    //
}

Retrieving The Request URL

Để lấy đầy đủ URL cho request gửi đến, bạn có thể sử dụng phương thức url hoặc fullUrl. Phương thức url sẽ trả về URL không có query string, trong khi phương thức fullUrl bao gồm cả query string:

// Without Query String...
$url = $request->url();

// With Query String...
$url = $request->fullUrl();

Retrieving The Request Method

Phương thức method sẽ trả về phương thức HTTP tương ứng với request. Bạn có thể sử dụng phương thức isMethod để xác thực phương thức HTTP khớp với string:

$method = $request->method();

if ($request->isMethod('post')) {
    //
}

PSR-7 Requests


Tiêu chuẩn của [PSR-7 standard](http://www.php-fig.org/psr/psr-7/) quy định interfaces cho HTTP messages, bao gồm cả requests và responses. Nếu bạn muốn lấy một instance của PSR-7 request thay vì một request Laravel, đầu tiên bạn sẽ cần cài đặt một vài thư viện. Laravel sử dụng component Symfony HTTP Message Bridge để chuyển đổi requests và responses của Laravel thành PSR-7:
composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

Khi bạn đã cài thư viện trên, bạn có thể lấy được PSR-7 request bằng cách type-hinting request interface trên route Closure hoặc phương thức controller:

use PsrHttpMessageServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    //
});

Input Trimming & Normalization


Theo mặc định, Laravel bao gồm ```TrimStrings``` và ```ConvertEmptyStringsToNull``` middleware trong global middleware stack của ứng dụng của bạn. Các middleware này được liệt kê trong ngăn xếp bởi lớp ```AppHttpKernel```. Các trình trung gian này sẽ tự động cắt tất cả các trường chuỗi đến theo yêu cầu, cũng như chuyển đổi bất kỳ trường chuỗi rỗng thành ```null```. Điều này cho phép bạn không phải lo lắng về những mối quan tâm bình thường hóa trong các route và controller của bạn.

Nếu bạn muốn vô hiệu hóa hành vi này, bạn có thể loại bỏ hai middleware khỏi middleware stack của ứng dụng bằng cách loại bỏ chúng khỏi thuộc tính $middleware của class AppHttpKernel của bạn.

0