如何为Auth::routes生成的注册POST路由分配ProtectAgainstSpam中间件
给自动生成的注册POST路由分配中间件的三种可行方案
Auth::routes生成的注册POST路由默认参数如下:路由别名为register,对应控制器方法为App\Http\Controllers\Auth\RegisterController@register,请求路径为/register,可任选以下方案实现中间件分配:
方案1:在控制器中绑定中间件(最便捷)
直接修改注册控制器的构造方法,给注册提交的方法单独绑定中间件,不需要修改路由文件。
打开app/Http/Controllers/Auth/RegisterController.php,修改构造方法:
public function __construct() { $this->middleware('guest'); // 新增以下代码,仅给注册提交方法加防垃圾中间件 $this->middleware(\Spatie\Honeypot\ProtectAgainstSpam::class)->only('register'); }
方案2:手动覆盖路由定义
Laravel路由按定义顺序从上到下匹配,先手动定义注册POST路由,优先级会高于Auth::routes自动生成的同路径路由,直接附加中间件即可。
在routes/web.php中按如下顺序写代码:
// 先手动定义注册POST路由,加指定中间件 Route::post('register', [App\Http\Controllers\Auth\RegisterController::class, 'register']) ->middleware(\Spatie\Honeypot\ProtectAgainstSpam::class) ->name('register'); // 保留原有的Auth路由定义即可,重复的注册POST路由会被自动忽略 Auth::routes(['verify' => true]);
方案3:在路由服务提供者中动态绑定
不需要修改控制器或路由文件,在服务提供者中匹配到注册路由时动态附加中间件。
打开app/Providers/RouteServiceProvider.php,在boot方法中添加如下代码:
public function boot() { parent::boot(); // 匹配到注册路由时动态加中间件 Route::matched(function (\Illuminate\Routing\Events\RouteMatched $event) { if ($event->route->getName() === 'register') { $event->route->pushMiddleware(\Spatie\Honeypot\ProtectAgainstSpam::class); } }); }
内容的提问来源于stack exchange,提问作者poashoas
相关产品推荐
相关产品推荐

