Laravel cung cấp một số helper để hỗ trợ bạn tạo URL cho application của bạn. Tất nhiên, những điều này chủ yếu hữu ích khi tạo link trong các template và API response hoặc khi tạo response chuyển hướng đến một phần khác trong application của bạn.
Helper url
có thể được sử dụng để tạo các URL tùy biến cho application của bạn. URL được tạo ra sẽ tự động sử dụng scheme (HTTP hoặc HTTPS) và host từ request hiện tại:
$post = App\Post::find(1);
echo url("/posts/{$post->id}");
// http://example.com/posts/1
Nếu như không có đường dẫn nào được truyền vào cho helper url
, thì một instance Illuminate\Routing\UrlGenerator
sẽ được trả về, cho phép bạn truy cập vào thông tin về URL hiện tại:
// Get the current URL without the query string...
echo url()->current();
// Get the current URL including the query string...
echo url()->full();
// Get the full URL for the previous request...
echo url()->previous();
Các phương thức này cũng có thể được truy cập thông qua facade URL
:
use Illuminate\Support\Facades\URL;
echo URL::current();
Helper route
có thể được sử dụng để tạo URL tới một route đã được đặt tên. Các route đã được đặt tên cho phép bạn tạo URL mà không cần phải biết URL thực tế đang được định nghĩa như thế nào. Do đó, nếu URL của route có thay đổi, thì bạn cũng không cần phải thực hiện thay đổi gì cho các lệnh gọi hàm route
của bạn. Ví dụ: hãy tưởng tượng application của bạn chứa một route đang được định nghĩa như sau:
Route::get('/post/{post}', function () {
//
})->name('post.show');
Để tạo URL tới route này, bạn có thể sử dụng helper route
như sau:
echo route('post.show', ['post' => 1]);
// http://example.com/post/1
Bạn thường sẽ phải tạo URL bằng primary key của Eloquent models. Vì lý do đó, bạn có thể truyền trực tiếp các model Eloquent làm giá trị tham số. Helper route
sẽ tự động lấy primary key trong model đó ra:
echo route('post.show', ['post' => $post]);
Hàm action
giúp tạo ra một URL cho một controller action. Bạn không cần phải truyền toàn bộ namespace của controller đó vào. Mà thay vào đó, chỉ cần truyền tên class của controller mà được liên kết với namespace App\Http\Controllers
:
$url = action('HomeController@index');
Nếu phương thức controller yêu cầu truyền một route parameter, bạn có thể truyền chúng làm tham số thứ hai cho hàm như sau:
$url = action('UserController@profile', ['id' => 1]);
Đối với một số application, bạn có thể muốn định nghĩa các giá trị mặc định cho các tham số URL trong toàn bộ request. Ví dụ: hãy tưởng tượng nhiều route của bạn định nghĩa tham số {locale}
:
Route::get('/{locale}/posts', function () {
//
})->name('post.index');
Sẽ thật là cồng kềnh khi luôn luôn phải truyền một tham số locale
mỗi khi bạn gọi helper route
. Vì vậy, bạn có thể sử dụng phương thức URL::defaults
để định nghĩa một giá trị mặc định cho tham số này và lúc nào cũng được áp dụng trong request hiện tại. Bạn có thể muốn gọi phương thức này từ route middleware để bạn có quyền truy cập vào request hiện tại:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\URL;
class SetDefaultLocaleForUrls
{
public function handle($request, Closure $next)
{
URL::defaults(['locale' => $request->user()->locale]);
return $next($request);
}
}
Khi giá trị mặc định cho tham số locale
đã được cài đặt, bạn sẽ không cần phải truyền giá trị của nó khi tạo URL thông qua helper route
.
entry