我不知道为什么这个中间件被调用,即使它不应该被调用。
这是中间件:
<?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版本。
在你的中间件检查$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
,所以它适用于所有路线,从那里删除。