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 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 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.