即使不应该调用中间件,也会调用它

问题描述 投票:0回答:1

我不知道为什么这个中间件被调用,即使它不应该被调用。

这是中间件:

<?php
namespace App\Http\Middleware;

use ...;

class FacebookLogin
{
    public function handle($request, Closure $next)
    {
        Session::flash('error', "My message error");
        return $next($request);
    }
}

这是我的Kernel.php文件:

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    protected $middlewareGroups = [
        'web' => [
            \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,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'fb.login' => \App\Http\Middleware\FacebookLogin::class,
        'cors' => \App\Http\Middleware\Cors::class,
        'auth.api' => \App\Http\Middleware\AuthApi::class,
        'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    ];
}

这是我的RouteServiceProvider.php文件:

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    protected $namespace = 'App\Http\Controllers';

    public function boot()
    {
        parent::boot();
    }

    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        $this->mapFacebookRoutes();
    }

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));

        Route::prefix('ajax')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/ajax.php'));

        Route::middleware(['web', 'auth'])
            ->namespace($this->namespace)
            ->group(base_path('routes/auth.php'));
    }

    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }

    protected function mapFacebookRoutes()
    {
        Route::group([
            'middleware' => ['web', 'fb.login'],
            'namespace' => $this->namespace,
            'prefix' => 'fb',
        ], function () {
            require base_path('routes/facebook.php');
        });

        Route::group([
            'middleware' => ['web', 'fb.login'],
            'namespace' => $this->namespace,
            'prefix' => 'fb/ajax',
        ], function () {
            require base_path('routes/facebook_ajax.php');
        });
    }
}

我得到的是当我导航到我的网站的基本网址时显示的Flash消息(例如:www.example.com)。

但是,正如您在mapWebRoutes函数中看到的,我只将Web中间件应用于Web路由,因此我不会调用FacebookLogin中间件。 我将FacebookLogin中间件仅应用于“fb”和“fb / ajax”前缀路由。

我注意到另一个奇怪的行为:只有当我访问我的网站的https版本时才会收到消息,而不是我访问http版本。

php middleware laravel-5.7 laravel-middleware
1个回答
0
投票

在你的中间件检查$request->has('error')

<?php
namespace App\Http\Middleware;

use ...;

class FacebookLogin
{
    public function handle($request, Closure $next)
    {
        if($request->has('error')){
            Session::flash('error', "My message error");
        }
        return $next($request);
    }
}

在您的RouteServiceProvider更改顺序内:

public function map()
    {   
        $this->mapApiRoutes();
        $this->mapFacebookRoutes();
        $this->mapWebRoutes();
    }

你已经在'fb.login' => \App\Http\Middleware\FacebookLogin::class, 中添加了protected $routeMiddleware,所以它适用于所有路线,从那里删除。

© www.soinside.com 2019 - 2024. All rights reserved.