Как исключить 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)