Вступление
Laravel предоставляет несколько помощников, которые помогут вам создать URL для вашего приложения. Это в основном полезно при создании ссылок в шаблонах и ответах API или при создании ответов перенаправления на другую часть вашего приложения.
Основы
Генерация основных URL
url
Помощник может быть использован для создания произвольной URL - адреса для вашего приложения. Сгенерированный URL будет автоматически использовать схему (HTTP или HTTPS) и хост из текущего запроса:
$post = App\Post::find(1);
echo url("/posts/{$post->id}");
// http://example.com/posts/1
Доступ к текущему URL
Если путь к url
помощнику не указан, возвращается экземпляр, позволяющий получить доступ к информации о текущем URL:Illuminate\Routing\UrlGenerator
// 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();
К каждому из этих методов можно также получить доступ через URL
фасад :
use Illuminate\Support\Facades\URL;
echo URL::current();
URL для именованных маршрутов
route
Помощник может быть использован для создания URL - адресов для именованных маршрутов. Именованные маршруты позволяют создавать URL-адреса без привязки к фактическому URL-адресу, определенному в маршруте. Поэтому, если URL-адрес маршрута изменяется, никаких изменений в ваших route
вызовах функций не требуется . Например, представьте, что ваше приложение содержит маршрут, определенный следующим образом:
Route::get('/post/{post}', function () {
//
})->name('post.show');
Чтобы сгенерировать URL для этого маршрута, вы можете использовать route
помощника следующим образом:
echo route('post.show', ['post' => 1]);
// http://example.com/post/1
Вы будете часто генерировать URL-адреса, используя первичный ключ моделей Eloquent . По этой причине вы можете передавать модели Eloquent в качестве значений параметров. route
Помощник будет автоматически извлечь первичный ключ модели:
echo route('post.show', ['post' => $post]);
route
Хелпер может также использоваться для генерации URL - адресов для маршрутов с несколькими параметрами:
Route::get('/post/{post}/comment/{comment}', function () {
//
})->name('comment.show');
echo route('comment.show', ['post' => 1, 'comment' => 3]);
// http://example.com/post/1/comment/3
Подписанные URL
Laravel позволяет легко создавать «подписанные» URL-адреса для именованных маршрутов. Эти URL имеют хэш «подписи», добавленный к строке запроса, что позволяет Laravel проверять, что URL не был изменен с момента его создания. Подписанные URL-адреса особенно полезны для маршрутов, которые являются общедоступными, но требуют уровня защиты от манипулирования URL-адресами.
Например, вы можете использовать подписанные URL-адреса для реализации общедоступной ссылки «отписаться», которая отправляется вашим клиентам по электронной почте. Чтобы создать подписанный URL для именованного маршрута, используйте signedRoute
метод URL
фасада:
use Illuminate\Support\Facades\URL;
return URL::signedRoute('unsubscribe', ['user' => 1]);
Если вы хотите создать временный URL-адрес подписанного маршрута, срок действия которого истекает, вы можете использовать temporarySignedRoute
метод:
use Illuminate\Support\Facades\URL;
return URL::temporarySignedRoute(
'unsubscribe', now()->addMinutes(30), ['user' => 1]
);
Проверка подписанных запросов маршрута
Чтобы убедиться, что входящий запрос имеет действительную подпись, вы должны вызвать hasValidSignature
метод для входящего Request
:
use Illuminate\Http\Request;
Route::get('/unsubscribe/{user}', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
})->name('unsubscribe');
В качестве альтернативы вы можете назначить промежуточное ПО для маршрута. Если его еще нет, вам следует назначить этому промежуточному ПО ключ в массиве вашего ядра HTTP :Illuminate\Routing\Middleware\ValidateSignature
routeMiddleware
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];
Как только вы зарегистрируете промежуточное программное обеспечение в своем ядре, вы можете прикрепить его к маршруту. Если входящий запрос не имеет правильной подписи, промежуточное программное обеспечение автоматически вернет 403
ответ об ошибке:
Route::post('/unsubscribe/{user}', function (Request $request) {
// ...
})->name('unsubscribe')->middleware('signed');
URL-адреса для действий контроллера
action
Функция генерирует URL - адрес для данного контроллера действий. Вам не нужно передавать полное пространство имен контроллера. Вместо этого передайте имя класса контроллера относительно пространства имен:App\Http\Controllers
$url = action('HomeController@index');
Вы также можете ссылаться на действия с синтаксисом «вызываемого» массива:
use App\Http\Controllers\HomeController;
$url = action([HomeController::class, 'index']);
Если метод контроллера принимает параметры маршрута, вы можете передать их в качестве второго аргумента функции:
$url = action('UserController@profile', ['id' => 1]);
Значения по умолчанию
В некоторых приложениях может потребоваться указать значения по умолчанию для всего запроса для определенных параметров URL. Например, представьте, что многие из ваших маршрутов определяют параметр:{locale}
Route::get('/{locale}/posts', function () {
//
})->name('post.index');
Обременительно всегда проходить locale
каждый раз, когда вы вызываете route
помощника. Таким образом, вы можете использовать метод для определения значения по умолчанию для этого параметра, которое всегда будет применяться во время текущего запроса. Возможно, вы захотите вызвать этот метод из промежуточного программного обеспечения маршрута, чтобы у вас был доступ к текущему запросу:URL::defaults
<?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);
}
}
После установки значения по умолчанию для locale
параметра вам больше не нужно передавать его значение при генерации URL-адресов через route
помощника.
0 комментариев