промежуточное ПО вызывается, даже если оно не должно вызываться - PullRequest
0 голосов
/ 15 февраля 2019

Я не знаю, почему это промежуточное ПО вызывается, даже если оно не должно быть.

Это промежуточное ПО:

<?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-сообщение, отображаемое при переходе к базовому URL моего сайта (например:www.example.com).

Но, как вы можете видеть в функции mapWebRoutes, я применяю только веб-промежуточное программное обеспечение к веб-маршрутам, поэтому я не понимаю, почему вызывается FacebookLogin промежуточное программное обеспечение.
Я применяю FacebookLogin промежуточное ПО только для маршрутов префиксов "fb" и "fb / ajax".

Я заметил еще одно странное поведение: я получаю сообщение, только если я захожу на https-версию моего веб-сайта, а не если я захожу на http-версию.

1 Ответ

0 голосов
/ 15 февраля 2019

в проверке промежуточного программного обеспечения $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, поэтому оно применяется ко всеммаршруты, убери оттуда.

...