You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:44:31