Как исключить middleware в определённых роутах Laravel
В этой статье мы рассмотрим различные методы исключения 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 в ваших проектах.
Ссылки
- Middleware – Excluding Middleware (Документация Laravel)
- Laravel 11+ – Controller Middleware (Документация Laravel)
- Laravel 10 – Controller Middleware (Документация Laravel)