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

Accessing The Request trong Laravel

Khi lập trình web, thiết kế web bạn thường thấy để tối ưu web thì bạn cần xử lý các Request trong Laravel 1 cách tốt nhất. Để 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 Illuminate\Http\Request trong phương thức controller. Các request đến sẽ được tự động injected bởi :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

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}', '');

Bạn vẫn có thể type-hint Illuminate\Http\Request 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 App\Http\Controllers;

use Illuminate\Http\Request;

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 Illuminate\Http\Request trong route Closure. Service container sẽ tự động inject các request Closure khi nó được thực thi:

use Illuminate\Http\Request;

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

Request Path & Method

Đối tượng Illuminate\Http\Request 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 Symfony\Component\HttpFoundation\Request. 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 là gì?

Tiêu chuẩn của 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 Psr\Http\Message\ServerRequestInterface;

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

Input Trimming và Normalization

Theo mặc định, Laravel bao gồm TrimStringsConvertEmptyStringsToNull 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 App\Http\Kernel. 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 App\Http\Kernel của bạn.