2015-11-01 53 views
0

我创建了一个中间件作为各路线:Laravel:自定义中间件应用

use Closure; 
use Gate; 
class ACLMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Gate::denies('access-post')) { 
      abort(403,'Not allowed!!!'); 
     } 
     return $next($request); 
    } 
} 

然后在路线定义为:

Route::get('/', '[email protected]'); 

Route::group(['middleware' => 'auth','acl'], function() { 

    Route::resource('post', 'PostController'); 
    ... 

当我运行这个..它施加于所有航线,甚至在/。为什么是这样?

Kernel.php

<?php 

namespace App\Http; 

use Illuminate\Foundation\Http\Kernel as HttpKernel; 

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \App\Http\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
     \App\Http\Middleware\VerifyCsrfToken::class, 
     \App\Http\Middleware\ACLMiddleware::class, 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = [ 
     'auth'  => \App\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'guest'  => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'acl'  => \App\Http\Middleware\ACLMiddleware::class, 
    ]; 
} 
+0

那么你的'应用程序\ HTTP \ Kernel.php'文件是什么样子? – tam5

+0

@tam问题更新 – Volatil3

+0

'auth'会在每个请求上运行还是'acl'? – tam5

回答

2

中间件注册在App\Http\Kernel.php

阵列:

protected $middleware = ['...']; 

定义了应该在每个HTTP请求运行的中间件。在你的情况下,如果你不希望它在每个请求上运行,你需要删除\App\Http\Middleware\ACLMiddleware::class

阵列:

protected $routeMiddleware = ['...']; 

限定在其中指定将仅被应用的中间件。这是你的定义所属的地方。

+0

我删除了,但现在它不在路由上被调用。 – Volatil3

+0

我是否需要按照设置中间件路线的方式进行更改? – Volatil3

0

您需要将中间件使用兆瓦级名称,比如你的路线链接:Route::post('route', '[email protected]')->middleware(Authorize::class);