Laravel 5中间件即使在限制之后也会执行

时间:2018-05-04 05:52:09

标签: php laravel-5 laravel-middleware

如果路由不允许,我有一个限制访问路由的中间件。我将其添加到:kernel.php

 protected $middleware = [ \App\Http\Middleware\MyMiddlware::class,]


 public function handle($request, Closure $next)
{
    $response = $next($request);
    $currentRoute = $request->route()->getName();
    $accessibleMenu = $this->menu->where('route_name', $currentRoute)->first();

  dd('middleware');

    if ($this->auth->check() && !is_null($accessibleMenu)) {

        $userRole = $request->user()->role()->first()->id;


        if (!is_null($userRole ) && $userRole ==1) {

            return $response;
        }
    }

    return Response::make(view('noPermission'), 404);
}

路线:

   Route::get('menu/list','MenuController@index')->name('menu-list');

控制器功能::

    public function index($parent_id = null)
{
     dd('executed');
    $menus = $this->menu->orderBy('id', 'DESC')->paginate(5000);

    return view('menu.index', compact('menus'));
}

现在为实际:如果角色id为2,则中间件应返回404视图而不执行路由。但它在屏幕上打印执行的字符串!

1.如果我删除或评论:

 $response = $next($request);

它返回

Call to a member function getName() on null
  1. 如果我将路线注册移至

    'web'=> [             \ APP \ HTTP \中间件\ EncryptCookies ::类,             \照亮\饼干\中间件\ AddQueuedCookiesToResponse ::类,             \照亮\会议\中间件\ StartSession ::类,             // \ Illuminate \ Session \ Middleware \ AuthenticateSession :: class,             \照亮\查看\中间件\ ShareErrorsFromSession ::类,             \ APP \ HTTP \中间件\ VerifyCsrfToken ::类,             \照亮\路由\中间件\ SubstituteBindings ::类,             \ APP \ HTTP \中间件\活动::类,             \ APP \ HTTP \中间件\ MyMiddlware ::类,         ],

  2. 并发表评论:

     $response = $next($request);
    

    然后屏幕打印“中间件”,中间件工作

    我的问题是,如果我使用这个

    ,middlware允许函数执行
     $response = $next($request);
    

    在第一个句柄函数中? 为什么middlware不起作用,如果我在getName()数组中使用,则protected $middleware = []返回null?

    laravel在kernel.php中说 - protected $ middleware = []: *这些中间件在您的应用程序的每个请求期间运行。

    为什么即使我限制访问后这也允许?

1 个答案:

答案 0 :(得分:1)

我很难通过这个阅读,但是我想你想要改变2行:

删除$response = $next($request);

return $response;更改为return $next($request);