Laravel模态框校验中间件实现与配置的技术咨询
Laravel模态框校验中间件实现与配置的技术咨询
嘿,我看你已经动手实现了一个Laravel中间件用来校验模态框的启用状态,还更新了Kernel.php来配置它,来跟你聊聊这段实现的细节和可以优化的地方~
一、你的现有实现解析
先来看你写的中间件代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use App\Containers\Modals\Models\Modal; class ModalsMiddleware { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next, string $modalNames): Response { $modals = explode(',', $modalNames); foreach ($modals as $modalName) { $modal = Modal::where('slug', $modalName)->first(); if (!$modal->enabled) { abort(404); } } return $next($request); } }
你的核心逻辑没问题:接收路由传入的模态框slug列表,逐个校验是否启用,不满足就返回404。但有两个小坑需要注意:
- 如果某个slug对应的模态框根本不存在,
$modal会是null,这时候调用$modal->enabled会直接抛出致命错误,而不是返回404 - 循环里每次都查一次数据库,当传入多个slug时,会产生多次查询,性能不太好
优化后的中间件代码
我给你调整了一下,解决了上面的问题:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use App\Containers\Modals\Models\Modal; class ModalsMiddleware { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next, string $modalNames): Response { $modals = explode(',', $modalNames); // 用whereIn批量查询,一次数据库请求搞定所有slug,只取需要的字段 $enabledModals = Modal::whereIn('slug', $modals) ->pluck('enabled', 'slug') ->toArray(); foreach ($modals as $modalName) { // 先检查模态框是否存在,再检查是否启用 if (!isset($enabledModals[$modalName]) || !$enabledModals[$modalName]) { abort(404); } } return $next($request); } }
二、Kernel.php的完整配置步骤
你提到已经更新了Kernel.php,这里给你补全完整的配置流程,确保中间件能正常使用:
- 打开
app/Http/Kernel.php,找到$routeMiddleware数组,把你的中间件注册进去:
protected $routeMiddleware = [ // 这里是其他已有的中间件,比如auth、guest等... 'modals.check' => \App\Http\Middleware\ModalsMiddleware::class, ];
- 注册完成后,就可以在路由中使用这个中间件了,举个例子:
// 单个模态框校验 Route::get('/modal/profile', [ModalController::class, 'showProfile']) ->middleware('modals.check:profile-modal'); // 多个模态框校验,用逗号分隔 Route::get('/modal/dashboard', [ModalController::class, 'showDashboard']) ->middleware('modals.check:dashboard-modal,settings-modal');
这样每次访问这些路由时,中间件都会自动帮你校验指定的模态框是否存在且启用,只要有一个不满足,就会直接返回404页面。
备注:内容来源于stack exchange,提问作者Hilal Najem
相关产品推荐
相关产品推荐

