Версія фреймворка: 8.x

Генерація URL-адрес

Вступ

Laravel надає кілька помічників, які допоможуть вам створити URL-адреси для вашої програми. Вони в основному корисні при побудові посилань у ваших шаблонах та відповідях API або при генерації переадресаційних відповідей на іншу частину вашої програми.

Основи

Створення базових URL-адрес

urlhelper може використовуватися для створення довільних URL-адрес для вашої програми. Створена URL-адреса автоматично використовуватиме схему (HTTP або HTTPS) та хост із поточного запиту:

$post = App\Models\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

Доступ до поточної URL-адреси

Якщо шлях доurlпомічник, анIlluminate\Routing\UrlGeneratorповертається екземпляр, що дозволяє отримати доступ до інформації про поточну URL-адресу:

// 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-адреси для іменованих маршрутів

routehelper може використовуватися для генерації URL-адрес до названих маршрутів. Іменовані маршрути дозволяють створювати URL-адреси без прив’язки до фактичної URL-адреси, визначеної на маршруті. Отже, якщо URL-адреса маршруту змінюється, ніяких змін у вашій вносити не потрібноroute function calls. For example, imagine your application contains a route defined like the following:

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

Щоб сформувати URL-адресу цього маршруту, ви можете використовуватиrouteпомічник ось так:

echo route('post.show', ['post' => 1]);

// http://example.com/post/1

Будь-які додаткові параметри масиву, які не відповідають параметрам визначення маршруту, будуть додані до рядка запиту URL-адреси:

echo route('post.show', ['post' => 1, 'search' => 'rocket']);

// http://example.com/post/1?search=rocket

Ви часто створюватимете URL-адреси за допомогою первинного ключаКрасномовні моделі. З цієї причини ви можете передавати моделі Eloquent як значення параметрів.route helper will automatically extract the model's primary key:

echo route('post.show', ['post' => $post]);

routehelper також може використовуватися для генерації 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');

Крім того, ви можете призначитиIlluminate\Routing\Middleware\ValidateSignatureMiddlware до маршруту. Якщо його ще немає, слід призначити цьому проміжному програмному забезпеченню ключ у вашому ядрі HTTProuteMiddlewareмасив:

/**
 * 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,
];

Після реєстрації проміжного програмного забезпечення у своєму ядрі ви можете додати його до маршруту. Якщо вхідний запит не має дійсного підпису, Middlware автоматично поверне a403відповідь на помилку:

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

URL-адреси для дій контролера

actionфункція генерує URL-адресу для даної дії контролера:

use App\Http\Controllers\HomeController;

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

Якщо метод контролера приймає параметри маршруту, ви можете передати їх як другий аргумент функції:

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

Значення за замовчуванням

У деяких програмах, можливо, ви захочете вказати значення за замовчуванням для певних параметрів URL-адрес. Наприклад, уявіть, що багато ваших маршрутів визначають a{locale}параметр:

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

Завжди здаватиlocaleкожного разу, коли ви телефонуєте наrouteпомічник. Отже, ви можете використовуватиURL::defaultsметод для визначення значення за замовчуванням для цього параметра, яке завжди застосовуватиметься під час поточного запиту. Можливо, ви захочете викликати цей метод ізмаршрут проміжного програмного забезпечення so that you have access to the current request:

<?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помічник.

URL за замовчуванням та пріоритет проміжного програмного забезпечення

Встановлення значень за замовчуванням URL може перешкодити обробці Laravel неявних прив'язок моделі. Тому вам слідрозставити пріоритети на Middlwareщо встановлює за замовчуванням URL-адреси, які будуть виконуватися перед власними LaravelSubstituteBindingsMiddlware. Ви можете досягти цього, переконавшись, що ваше Middlware відбувається доSubstituteBindingsMiddlware в$middlewarePriorityвластивість ядра HTTP вашої програми.

$middlewarePriorityвластивість визначається в основіIlluminate\Foundation\Http\Kernelклас. Ви можете скопіювати його визначення з цього класу та перезаписати його в ядро ​​HTTP програми, щоб змінити його:

/**
 * The priority-sorted list of middleware.
 *
 * This forces non-global middleware to always be in the given order.
 *
 * @var array
 */
protected $middlewarePriority = [
    // ...
     \App\Http\Middleware\SetDefaultLocaleForUrls::class,
     \Illuminate\Routing\Middleware\SubstituteBindings::class,
     // ...
];