Laravel Tutorial

Bài 16: URL trong Laravel

Laravel cung cấp một số trình trợ giúp để hỗ trợ bạn trong việc tạo URL cho ứng dụng của bạn. Những trình trợ giúp này chủ yếu hữu ích khi tạo liên kết trong các template và API responses của bạn hoặc khi tạo redirect responses đến một phần khác trong ứng dụng của bạn.

1. Tạo URL

Cú phapr tạo URL trong Laravel

url($path, $parameters, $secure);T

rong đó:

  • $path là path mà bạn muốn generate.
  • $parameters là các param mà bạn muốn truyền vào URL. Tham số này có thể bỏ trống.
  • $secure là tham số quyết định protocol của URL là http hay https. Tham số này có thể bỏ trống.

Ví dụ:


url('home');
// http://example.com/home

url('home', ['page', 2]);
// http://example.com/home/page/2

url('home', ['page', 2], true);
// https://example.com/home/page/2

2. Truy cập URL hiện tại

Cú pháp

echo url()->current();

Trong trường hợp bạn muốn lấy ra URL bao gồm cả qurey string query string

echo url()->full();

Trong trường hợp bạn muốn lấy ra URL của request trước đó bao gồm cả query string

echo url()->previous();

Tất cả các cách trên nếu bạn không muốn sử dụng helper, thì có thể thay thế bằng URL (Illuminate\Support\Facades\URL) facades

echo URL::current();
echo URL::full();
echo URL::previous();

3. Route URL

Trong trường hợp route của bạn có sử dụng route name

Route::get('post', function () {
   //
})->name('post.index');

Các bạn có thể sử dụng hàm route để generate ra URL của route đó

echo route('post.index');
// http://example.com/post

Đối với route có parameter

Route::get('/post/{post}', function () {
   //
})->name('post.show');
echo route('post.show', ['post' => 1]);
// http://example.com/post/1

Trong trường hợp các param truyền vào hàm route không xuất hiện trong route đó thì những tham số đó sẽ được chuyển về dạng query string

Route::get('/post/{post}', function () {
   //
})->name('post.show');
echo route('post.show', ['post' => 1, 'search' => 'rocket']);
// http://example.com/post/1?search=rocket

4. Signed URL

Laravel cho phép chúng ta tạo ra một dạng URL kèm theo một tham số Laravel gọi nó là “signature“. Khi một route sử dụng chức năng này thì cần implement thêm middleware “signed“, để check, nếu như chũ ký sai thì Laravel sẽ trả về http status là 403

Ví dụ:

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

Route::get('home', function () {
   return 'home';
})->name('home')->middleware('signed');
echo URL::signedRoute('home');
//http://localhost:8000/home?signature=2a39f745526d6919a807889200c47185f02e1fd17735ddb5c500de4933e2fa0f

Trong trường hợp mà bạn không muốn sử dụng middleware “signed” mà vẫn muốn kiểm tra signature có đúng hay không. Bạn có thể sử dụng phương thức hasValidSignature trong Request

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

Route::get('home', function (Request $request) {
   if (! $request->hasValidSignature()) {
      abort(401);
   }
   return 'home';
})->name('home');
echo URL::signedRoute('home');
//http://localhost:8000/home?signature=2a39f745526d6919a807889200c47185f02e1fd17735ddb5c500de4933e2fa0f

Trong một số trường hợp bạn muốn tạo ra một signed URL chỉ tồn tại trong một khoảng thời gian nhất định nào đó. Bạn có thể sử dụng phương thức temporarySignedRoute với cú pháp:

URL::temporarySignedRoute($routeName, $timeToLive, $parameters);

Trong đó:

  • $routeName là tên của route các bạn muốn generate URL.
  • $timeToLive là thời gian sống của URL.
  • $parameters là các param mà bạn muốn truyền vào URL.

Ví dụ: Tạo ra temporarySignedRoute cho route home và thời gian sống mình sẽ xét là 2 tiếng

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

Route::get('home', function (Request $request) {
   if (! $request->hasValidSignature()) {
      abort(401);
   }
   return 'home';
})->name('home');
Route::get('/', function () {
   return URL::temporarySignedRoute('home', now()->addHours(2));
});

Kết quả: http://127.0.0.1:8000/home?expires=1610708830&signature=2010579f38999eca041cfb1b63c29355531ad0c318b19605f27ec8ccd68eeb65

5. Controller Action URL

Bạn cũng có thể tạo ra URL thông qua controller action bằng cách sử dụng hàm action

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

Khi cần truyền thêm tham số vào trong action

$url = action([UserController::class, 'profile'], ['id' => 1]);

6. Default Value

Khi muốn gán giá trị mặc định cho một parameter nào đó các bạn có thể sử dụng phương thức default

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\URL;

URL::defaults(['locale' => 'vi']);

Route::get('{locale}/about/', function (Request $request) {
   return 'about';
})->name('about');

Lấy kết quả

Route::get('/', function () {
   return route('about');
});
//http://localhost:8000/vi/about

 

Leave a Comment