Как исключить middleware в определённых роутах Laravel

Источник: «How to Exclude Middleware in Specific Laravel Routes»
Middleware в Laravel играет важную роль в перехвате HTTP-запросов, поступающих в приложение, для применения пользовательской логики, прежде чем будет выполнен какой-либо фактический код приложения. Однако существуют сценарии, в которых вам может потребоваться исключить определённые маршруты или методы из обработки middleware.

В этой статье мы рассмотрим различные методы исключения middleware для определённых маршрутов или методов контроллера в Laravel. Мы рассмотрим настройку добавления middleware в файлы маршрутов и контроллеры.

Обратите внимание, что в Laravel 11+ синтаксис использования middleware контроллера изменился. Примеры в этой статье будут охватывать как новый, так и старый синтаксис. Синтаксис добавления middleware в файлы маршрутов, такие как web.php и api.php, остался неизменным по сравнению с Laravel 10 и младше.

Метод 1: Исключение Middleware в маршрутах с помощью withoutMiddleware()

Можно исключить некоторые маршруты из использования middleware, применив withoutMiddleware к маршрутам в web.php или api.php.

В следующем примере используем группу для назначения middleware web и auth, а маршрут /public/profile сделаем исключением и удалим из него middleware:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

// Применение группы Middleware к маршрутам
Route::group(['middleware' => ['web', 'auth']], function () {
// Маршруты с middleware `web` и `auth`
Route::get('/dashboard', [UserController::class, 'dashboard']);

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

// Маршрут без middleware `auth` (но всё ещё с `web`)
Route::get('/public-profile', [UserController::class, 'publicProfile'])
->withoutMiddleware('auth');
});

Метод 2: Исключение Middleware в контроллере с помощью except()

Чтобы исключить middleware для определённых маршрутов в контроллере, можно использовать except() при применении middleware в коде контроллера.

Чтобы использовать except в контроллере middleware в Laravel 11+, используйте следующий код:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{
/**
* В Laravel 11+ определение middleware контроллера осуществляется в статической функции middleware()
*/

public static function middleware(): array
{
return [
'auth',
new Middleware('auth', except: ['showPublicProfile']),
];
}

public function index() {}
public function show() {}
public function showPublicProfile() {}
}

Для использования except в контроллерах middleware в Laravel 10 и более ранних версиях используйте следующий код:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class UserController extends Controller
{
/**
* В Laravel 10 и более ранних версиях middleware контроллера задаётся в методе __construct
*/

public function __construct()
{
$this->middleware('auth')->except(['showPublicProfile']);
}

public function index() {}
public function show() {}
public function showPublicProfile() {}
}

В этих примерах middleware auth применяется ко всем методам в UserController, кроме метода showPublicProfile.

Метод 3: Исключение Middleware в контроллере с помощью only()

Вы можете использовать метод only(), чтобы явно указать, к каким маршрутам должно применяться определённое middleware.

Чтобы использовать only в middleware контроллера в Laravel 11, используйте следующий код:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{
/**
* В Laravel 11+ middleware контроллера определяется в статической функции middleware()
*/

public static function middleware(): array
{
return [
'auth',
new Middleware('auth', only: ['index', 'show']),
];
}

public function index() {}
public function show() {}
public function showPublicProfile() {}
}

Следующая реализация UserController демонстрирует это:

<?php

namespace App\Http\Controllers;

class UserController extends Controller
{
/**
* В Laravel 10 и более ранних версиях middleware контроллера задаётся в методе __construct
*/

public function __construct()
{
$this->middleware('auth')->only(['index', 'show']);
}

public function index() {}
public function show() {}
public function showPublicProfile() {}
}

В этих примерах middleware auth будет применяться только к методам index и show.

Можно ли одновременно использовать except и only в middleware контроллера

Вы можете использовать except и only одновременно. Следующий код демонстрирует, как это сделать:

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{

public static function middleware(): array
{
return [
'auth',
new Middleware('log', only: ['index']),
new Middleware('subscribed', except: ['store']),
];
}

public function index() {}
public function store() {}
}

Заключение

В Laravel исключение middleware для определённых маршрутов или методов обеспечивает гибкость в обработке запросов. Используя такие методы, как except, only или withoutMiddleware, можно настроить поведение middleware специфично для разных частей приложения.

Не стесняйтесь использовать эти исключения для получения более тонкого контроля над middleware в ваших проектах.

Ссылки

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

Предыдущая Статья

Как заставить веб-компоненты общаться (часть 2)

Следующая Статья

Зачем использовать пользовательские исключения в PHP