Маршрутизация в Laravel 8.x
Маршрутизация в Laravel 8.x

Маршрутизация в Laravel 8.x



Базовая маршрутизация

Базовая маршрутизация

Самые основные маршруты Laravel принимают URI и прерывания, обеспечивая очень простой и выразительный метод определения маршрутов и поведения без сложных файлов конфигурации маршрутизации:

use Illuminate\Support\Facades\Route;

Route::get('/greeting', function () {
    return 'Hello World';
});

Файлы маршрута по умолчанию

Все маршруты Laravel определены в ваших файлах маршрутов, которые находятся в каталоге routes. Эти файлы автоматически загружаются вашим приложением App\Providers\RouteServiceProvider. Файл routes/web.php определяет маршруты для вашего веб-интерфейса. Этим маршрутам назначается web группа промежуточного программного обеспечения [middleware group], которая обеспечивает такие функции, как состояние сеанса и защита CSRF. Маршруты в routes/api.php не имеют состояния и им назначена api [middleware group] группы промежуточного программного обеспечения.

Для большинства приложений вы начнете с определения маршрутов в файле routes/web.php. К маршрутам, определенным в routes/web.php, можно получить доступ, введя URL-адрес определенного маршрута в вашем браузере. Например, вы можете получить доступ к следующему маршруту, перейдя на http://example.com/user в своем браузере:

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

Маршруты, определенные в файле routes/api.php, вложены в группу маршрутов с помощью RouteServiceProvider. Внутри этой группы автоматически применяется префикс URI /api, поэтому вам не нужно вручную применять его к каждому маршруту в файле. Вы можете изменить префикс и другие параметры группы маршрутов, изменив свой класс RouteServiceProvider.

Доступные методы маршрутизатора

Маршрутизатор позволяет регистрировать маршруты, отвечающие на любое HTTP-обращение:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Иногда вам может потребоваться зарегистрировать маршрут, который отвечает на несколько HTTP-запросов. Вы можете сделать это, используя метод match. Или вы даже можете зарегистрировать маршрут, который отвечает на все HTTP-команды, используя метод any:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('/', function () {
    //
});

Внедрение зависимости

Вы можете указать любые зависимости, требуемые для вашего маршрута, в сигнатуре обратного вызова вашего маршрута. Объявленные зависимости будут автоматически разрешены и введены в обратный вызов сервисным контейнером Laravel. Например, вы можете указать класс Illuminate\Http\Request, чтобы текущий HTTP-запрос автоматически вставлялся в обратный вызов вашего маршрута:

use Illuminate\Http\Request;

Route::get('/users', function (Request $request) {
    // ...
});

CSRF защита

Помните, что любые HTML-формы, указывающие на маршруты POST, PUT, PATCH или DELETE, которые определены в файле web маршрутов, должны включать поле токена CSRF. В противном случае запрос будет отклонен. Вы можете прочитать больше о защите CSRF в документации CSRF:

<form method="POST" action="/profile">
    @csrf
    ...
</form>

Перенаправление маршрутов

Если вы определяете маршрут, который перенаправляет на другой URI, вы можете использовать метод Route :: redirect. Этот метод предоставляет удобный ярлык, так что вам не нужно определять полный маршрут или контроллер для выполнения простого перенаправления:

Route::redirect('/here', '/there');

По умолчанию Route::redirect возвращает код состояния 302. Вы можете настроить код состояния, используя необязательный третий параметр:

Route::redirect('/here', '/there', 301);

Или вы можете использовать метод Route::permanentRedirect, чтобы вернуть код состояния 301:

Route::permanentRedirect('/here', '/there');

При использовании параметров маршрута в маршрутах перенаправления следующие параметры зарезервированы Laravel и не могут использоваться: destination и status.

Отображение маршрутов

Если ваш маршрут должен возвращать только представление, вы можете использовать метод Route::view. Как и метод redirect, этот метод предоставляет простой ярлык, поэтому вам не нужно определять полный маршрут или контроллер. Метод view принимает URI в качестве первого аргумента и имя представления в качестве второго аргумента. Кроме того, вы можете предоставить массив данных для передачи в представление в качестве необязательного третьего аргумента:

Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

При использовании параметров маршрута в маршрутах представления следующие параметры зарезервированы Laravel и не могут быть использованы: view, data, status и headers.

Параметры маршрута

Обязательные параметры

Иногда вам нужно будет захватить сегменты URI в вашем маршруте. Например, вам может потребоваться захватить идентификатор пользователя из URL-адреса. Вы можете сделать это, указав параметры маршрута:

Route::get('/user/{id}', function ($id) {
    return 'User '.$id;
});

Вы можете определить столько параметров маршрута, сколько требуется для вашего маршрута:

Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

Параметры маршрута всегда заключаются в фигурные скобки {} и должны состоять из буквенных символов. Подчеркивание (_) также допускается в именах параметров маршрута. Параметры маршрута вводятся в обратные вызовы маршрута / контроллеры в зависимости от их порядка - имена аргументов обратного вызова маршрута / контроллера не имеют значения.

Параметры и внедрение зависимостей

Если ваш маршрут имеет зависимости, которые вы хотели бы, чтобы сервисный контейнер Laravel автоматически вставлял в обратный вызов вашего маршрута, вы должны указать свои параметры маршрута после ваших зависимостей:

use Illuminate\Http\Request;

Route::get('/user/{id}', function (Request $request, $id) {
    return 'User '.$id;
});

Дополнительные параметры

Иногда может потребоваться указать параметр маршрута, который не всегда может присутствовать в URI. Вы можете сделать это, поместив ? отметив его после имени параметра. Не забудьте присвоить соответствующей переменной маршрута значение по умолчанию:

Route::get('/user/{name?}', function ($name = null) {
    return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
    return $name;
});

Ограничения регулярного выражения

Вы можете ограничить формат параметров вашего маршрута, используя метод where в экземпляре маршрута. Метод where принимает имя параметра и регулярное выражение, определяющее, как параметр должен быть ограничен:

Route::get('/user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

Для удобства в некоторых часто используемых шаблонах регулярных выражений есть вспомогательные методы, которые позволяют быстро добавлять ограничения шаблона к вашим маршрутам:

Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function ($name) {
    //
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function ($id) {
    //
})->whereUuid('id');

Если входящий запрос не соответствует ограничениям шаблона маршрута, будет возвращен ответ HTTP 404.

Глобальные ограничения

Если вы хотите, чтобы параметр маршрута всегда ограничивался данным регулярным выражением, вы можете использовать метод pattern. Вы должны определить эти шаблоны в методе boot вашего класса App\Providers\RouteServiceProvider:

/**
 * Определите привязки модели маршрута, фильтры шаблонов и т.д.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');
}

Как только шаблон определен, он автоматически применяется ко всем маршрутам, использующим это имя параметра:

Route::get('/user/{id}', function ($id) {
    // Выполняется, только если {id} числовой ...
});

Различение прямых и обратных слэшей

Компонент маршрутизации Laravel позволяет всем символам, кроме /, присутствовать в значениях параметров маршрута. Вы должны явно разрешить / быть частью вашего маршрута, используя регулярное выражение условия where:

Route::get('/search/{search}', function ($search) {
    return $search;
})->where('search', '.*');

Применяемые слэши поддерживаются только в пределах последнего сегмента маршрута.

Именованные маршруты

Именованные маршруты позволяют удобно генерировать URL-адреса или перенаправления для определенных маршрутов. Вы можете указать имя для маршрута, связав метод name с определением маршрута:

Route::get('/user/profile', function () {
    //
})->name('profile');

Вы также можете указать имена маршрутов для действий контроллера:

Route::get(
    '/user/profile',
    [UserProfileController::class, 'show']
)->name('profile');

Имена маршрутов всегда должны быть уникальными.

Создание URL для именованных маршрутов

После того, как вы назначили имя данному маршруту, вы можете использовать имя маршрута при генерации URL-адресов или перенаправлений через вспомогательные функции route и redirect Laravel:

// Создание URL...
$url = route('profile');
// Создание перенаправления...
return redirect()->route('profile');

Если именованный маршрут определяет параметры, вы можете передать параметры в качестве второго аргумента функции route. Указанные параметры будут автоматически вставлены в сгенерированный URL в их правильных местах:

Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

Если вы передадите дополнительные параметры в массиве, эти пары ключ / значение будут автоматически добавлены в сгенерированную строку запроса URL:

Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1, 'photos' => 'yes']);

// /user/1/profile?photos=yes

Иногда вам может потребоваться указать значения по умолчанию для всего запроса для параметров URL, таких как текущий языковой стандарт. Для этого вы можете использовать метод URL::defaults.

Проверка текущего маршрута

Если вы хотите определить, был ли текущий запрос направлен на заданный именованный маршрут, вы можете использовать метод named в экземпляре маршрута. Например, вы можете проверить имя текущего маршрута из маршрута [middleware] промежуточного программного обеспечения:

/**
 * Обрабатывать входящий запрос.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }

    return $next($request);
}

Группы маршрутов

Группы маршрутов позволяют вам совместно использовать атрибуты маршрута, такие как промежуточное программное обеспечение [middleware], по большому количеству маршрутов без необходимости определять эти атрибуты для каждого отдельного маршрута.

Вложенные группы пытаются разумно «объединить» атрибуты со своей родительской группой. Промежуточное ПО [middleware] и where-условия объединяются, а имена и префиксы добавляются. Разделители пространства имен и слэш в префиксах URI автоматически добавляются там, где это необходимо.

ПО промежуточного слоя [Middleware]

Чтобы назначить промежуточное программное обеспечение для всех маршрутов в группе, вы можете использовать метод middleware перед определением группы. Промежуточное ПО выполняется в том порядке, в котором они перечислены в массиве:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Использует первое и второе промежуточное ПО...
    });

    Route::get('/user/profile', function () {
        // Использует первое и второе промежуточное ПО...
    });
});

Маршрутизация поддоменов

Группы маршрутов также могут использоваться для управления маршрутизацией поддоменов. Поддоменам могут быть назначены параметры маршрута так же, как и URI маршрута, что позволяет вам захватывать часть поддомена для использования в вашем маршруте или контроллере. Поддомен можно указать, вызвав метод domain перед определением группы:

Route::domain('{account}.example.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Чтобы обеспечить доступность маршрутов поддоменов, вы должны зарегистрировать маршруты поддоменов перед регистрацией маршрутов корневого домена. Это предотвратит перезапись маршрутами корневого домена маршрутов поддоменов, имеющих одинаковый путь URI.

Префиксы маршрутов

Метод prefix может использоваться для префикса каждого маршрута в группе с заданным URI. Например, вы можете добавить к префиксу admin для всех URI маршрутов в группе:

Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // Соответствует "/admin/users" URL
    });
});

Префиксы имени маршрута

Метод name может использоваться для префикса каждого имени маршрута в группе, заданной строкой. Например, вы можете захотеть добавить ко всем именам сгруппированных маршрутов префикс admin. Данная строка имеет префикс к имени маршрута точно в том виде, в котором он указан, поэтому мы обязательно поставим в конце . символ в префиксе:

Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // Маршруту присвоено имя "admin.users"...
    })->name('users');
});

Привязка модели маршрута

При введении ID модели в действие маршрута или контроллера вы часто будете запрашивать базу данных, чтобы получить модель, соответствующую этому ID. Привязка модели маршрута Laravel обеспечивает удобный способ автоматического внедрения экземпляров модели непосредственно в ваши маршруты. Например, вместо того, чтобы вводить ID пользователя, вы можете внедрить весь экземпляр модели User, который соответствует данному ID.

Неявная привязка

Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, чьи имена переменных с указанием типа соответствуют имени сегмента маршрута. Например:

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    return $user->email;
});

Поскольку тип переменной $user соответствует модели App\Models\User Eloquent, а имя переменной соответствует сегменту URI {user}, Laravel автоматически внедрит экземпляр модели, ID которого совпадает с соответствующим значением из URI запроса. Если соответствующий экземпляр модели не найден в базе данных, автоматически будет сгенерирован HTTP-ответ 404.

Конечно, неявная привязка также возможна при использовании методов контроллера. Снова обратите внимание, что сегмент URI {user} соответствует переменной $user в контроллере, которая содержит подсказку типа App\Models\User:

use App\Http\Controllers\UserController;
use App\Models\User;

// Определение маршрута...
Route::get('/users/{user}', [UserController::class, 'show']);

// Определение метода контроллера...
public function show(User $user)
{
    return view('user.profile', ['user' => $user]);
}

Настройка ключа

Иногда вы можете захотеть разрешить модели Eloquent, используя столбец, отличный от id. Для этого вы можете указать столбец в определении параметра маршрута:

use App\Models\Post;

Route::get('/posts/{post:slug}', function (Post $post) {
    return $post;
});

Если вы хотите, чтобы привязка модели всегда использовала столбец базы данных, отличный от id, при получении данного класса модели, вы можете переопределить метод getRouteKeyName в модели Eloquent:

/**
 * Получение ключа маршрута для модели.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

Пользовательские ключи и область действия

При неявном связывании нескольких моделей Eloquent в одном определении маршрута вы можете захотеть ограничить вторую модель Eloquent так, чтобы она была дочерней по отношению к предыдущей модели Eloquent. Например, рассмотрим это определение маршрута, которое извлекает сообщение в блоге по слагу для определенного пользователя:

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

При использовании настраиваемой неявной привязки с ключом в качестве параметра вложенного маршрута Laravel автоматически задает область запроса для получения вложенной модели своим родителем, используя соглашения, чтобы угадать имя отношения в родительском элементе. В этом случае предполагается, что модель User имеет отношение с именем posts (форма множественного числа от имени параметра маршрута), которое можно использовать для получения модели Post.

Явная привязка

Вам не обязательно использовать неявное разрешение модели на основе соглашений Laravel, чтобы использовать привязку модели. Вы также можете явно определить, как параметры маршрута соответствуют моделям. Чтобы зарегистрировать явную привязку, используйте метод model маршрутизатора, чтобы указать класс для данного параметра. Вы должны определить свои явные привязки модели в начале метода boot вашего класса RouteServiceProvider:

use App\Models\User;
use Illuminate\Support\Facades\Route;

/**
 * Определите привязки модели маршрута, фильтры шаблонов и т.д.
 *
 * @return void
 */
public function boot()
{
    Route::model('user', User::class);

    // ...
}

Затем определите маршрут, содержащий параметр {user}:

use App\Models\User;

Route::get('/users/{user}', function (User $user) {
    //
});

Поскольку мы связали все параметры {user} с моделью App\Models\User, экземпляр этого класса будет вставлен в маршрут. Так, например, запрос к users/1 будет внедрять экземпляр User из базы данных с идентификатором 1.

Если соответствующий экземпляр модели не найден в базе данных, автоматически будет сгенерирован ответ HTTP 404.

Настройка логики разрешения

Если вы хотите определить свою собственную логику разрешения привязки модели, вы можете использовать метод Route::bind. Замыкание, которое вы передаете методу bind, получит значение сегмента URI и должно вернуть экземпляр класса, который должен быть введен в маршрут. Опять же, эта настройка должна выполняться в методе boot вашего приложения RouteServiceProvider:

use App\Models\User;
use Illuminate\Support\Facades\Route;

/**
 * Определите привязки модели маршрута, фильтры шаблонов и т.д.
 *
 * @return void
 */
public function boot()
{
    Route::bind('user', function ($value) {
        return User::where('name', $value)->firstOrFail();
    });

    // ...
}

В качестве альтернативы вы можете переопределить метод resolveRouteBinding в своей модели Eloquent. Этот метод получит значение сегмента URI и должен вернуть экземпляр класса, который должен быть введен в маршрут:

/**
 * Получите модель для привязанного значения.
 *
 * @param  mixed  $value
 * @param  string|null  $field
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value, $field = null)
{
    return $this->where('name', $value)->firstOrFail();
}

Если в маршруте используется неявная область действия привязки, для разрешения дочерней привязки родительской модели будет использоваться метод resolveChildRouteBinding:

/**
 * Получите дочернюю модель для связанного значения.
 *
 * @param  string  $childType
 * @param  mixed  $value
 * @param  string|null  $field
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveChildRouteBinding($childType, $value, $field)
{
    return parent::resolveChildRouteBinding($childType, $value, $field);
}

Резервные маршруты

Используя метод Route::fallback, вы можете определить маршрут, который будет выполняться, когда ни один другой маршрут не соответствует входящему запросу. Как правило, необработанные запросы автоматически отображают страницу «404» через обработчик исключений вашего приложения. Однако, поскольку вы обычно определяете fallback маршрут в файле routes/web.php, все промежуточное ПО [middleware] в группе промежуточного программного обеспечения web будет применяться к этому маршруту. При необходимости вы можете добавить дополнительное ПО промежуточного слоя к этому маршруту:

Route::fallback(function () {
    //
});

Резервный маршрут всегда должен быть последним маршрутом, зарегистрированным вашим приложением.

Ограничение скорости

Определение ограничителей скорости

Laravel включает мощные и настраиваемые службы ограничения скорости, которые вы можете использовать для ограничения объема трафика для данного маршрута или группы маршрутов. Для начала вы должны определить конфигурации ограничителя скорости, которые соответствуют потребностям вашего приложения. Как правило, это следует делать в методе configureRateLimiting класса App\Providers\RouteServiceProvider вашего приложения.

Ограничители скорости определяются с помощью метода for фасада RateLimiter. Метод for принимает имя ограничителя скорости и закрытие, которое возвращает конфигурацию ограничения, которая должна применяться к маршрутам, назначенным ограничителю скорости. Конфигурация ограничений - это экземпляры класса Illuminate\Cache\RateLimiting\Limit. Этот класс содержит полезные методы построения, чтобы вы могли быстро определить свой лимит. Имя ограничителя скорости может быть любой строкой по вашему желанию:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

/**
 * Настройте ограничители скорости для приложения.
 *
 * @return void
 */
protected function configureRateLimiting()
{
    RateLimiter::for('global', function (Request $request) {
        return Limit::perMinute(1000);
    });
}

Если входящий запрос превышает указанный предел скорости, Laravel автоматически вернет ответ с кодом состояния HTTP 429. Если вы хотите определить свой собственный ответ, который должен возвращаться ограничением скорости, вы можете использовать метод response:

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000)->response(function () {
        return response('Пользовательский ответ...', 429);
    });
});

Поскольку обратные вызовы ограничителя скорости получают экземпляр входящего HTTP-запроса, вы можете динамически создать соответствующее ограничение скорости на основе входящего запроса или аутентифицированного пользователя:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

Сегментация ограничений скорости

Иногда вы можете захотеть сегментировать ограничения скорости на какое-то произвольное значение. Например, вы можете разрешить пользователям получать доступ к заданному маршруту 100 раз в минуту на каждый IP-адрес. Для этого вы можете использовать метод by при создании ограничения скорости:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

Множественные ограничения скорости

При необходимости вы можете вернуть массив ограничений скорости для данной конфигурации ограничителя скорости. Каждое ограничение скорости будет оцениваться для маршрута в зависимости от порядка, в котором они размещены в массиве:

RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(500),
        Limit::perMinute(3)->by($request->input('email')),
    ];
});

Привязывание ограничителей скорости к маршрутам

Ограничители скорости могут быть присоединены к маршрутам или группам маршрутов с помощью промежуточного программного обеспечения throttle.  Throttle middleware принимает имя ограничителя скорости, которое вы хотите назначить маршруту:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

Регулирование с помощью Redis

Обычно throttle middleware сопоставляется с классом Illuminate\Routing\Middleware\ThrottleRequests. Это сопоставление определено в HTTP-ядре вашего приложения (App\Http\Kernel). Однако, если вы используете Redis в качестве драйвера кеша вашего приложения, вы можете изменить это сопоставление, чтобы использовать класс Illuminate\Routing\Middleware\ThrottleRequestsWithRedis. Этот класс более эффективен при управлении ограничением скорости с помощью Redis:

'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,

Спуфинг метода формы

HTML-формы не поддерживают действия PUT, PATCH или DELETE. Итак, при определении маршрутов PUT, PATCH или DELETE, вызываемых из HTML-формы, вам нужно будет добавить в форму скрытое поле _method. Значение, отправленное с полем _method, будет использоваться в качестве метода HTTP-запроса:

<form action="/example" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Для удобства вы можете использовать @method директиву Blade для создания поля ввода _method:

<form action="/example" method="POST">
    @method('PUT')
    @csrf
</form>

Доступ к текущему маршруту

Вы можете использовать методы current, currentRouteName и currentRouteAction фасада Route для доступа к информации о маршруте, обрабатывающем входящий запрос:

use Illuminate\Support\Facades\Route;

$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string

Вы можете обратиться к документации API как для базового класса фасада Route, так и для экземпляра Route, чтобы просмотреть все методы, доступные в классах маршрутизатора и маршрута.

Совместное использование ресурсов между источниками (CORS)

Laravel может автоматически отвечать на HTTP-запросы CORS OPTIONS со значениями, которые вы настраиваете. Все параметры CORS можно настроить в файле конфигурации вашего приложения config/cors.php. Запросы OPTIONS будут автоматически обрабатываться промежуточным программным обеспечением HandleCors, которое по умолчанию включено в ваш глобальный стек middleware. Ваш глобальный стек middleware находится в HTTP-ядре вашего приложения (App\Http\Kernel).

Для получения дополнительной информации о заголовках CORS и CORS обратитесь к веб-документации MDN по CORS.

Кэширование маршрута

При развертывании вашего приложения в режиме production вы должны воспользоваться кешем маршрутов Laravel. Использование кеша маршрутов значительно сократит время, необходимое для регистрации всех маршрутов вашего приложения. Чтобы сгенерировать кеш маршрута, выполните Artisan-команду route:cache:

php artisan route:cache

После выполнения этой команды ваш кешированный файл маршрутов будет загружаться при каждом запросе. Помните, что если вы добавляете какие-либо новые маршруты, вам нужно будет сгенерировать новый кеш маршрутов. Из-за этого вы должны запускать команду route:cache только во время развертывания вашего проекта в режиме production.

Вы можете использовать команду route:clear для очистки кеша маршрута:

php artisan route:clear

Перевод:
https://laravel.com/docs/8.x/routing

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню