2015-11-01 30 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);