Вступление

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\ValidateSignaturerouteMiddleware

/**
 * 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помощника.