大家。
我做了一个中间件。我做了一个全局的把它放到Kernel.php中,它被调用到每个请求,并验证用户是否被插入。
关键是我需要使用会话。但会议是空的。可能是因为它稍后会在脚本中填充。 所以我使用名为'\ Illuminate \ Session \ Middleware \ StartSession :: class'的全局中间件修复它。这很棒,因为在那之后我可以在我的中间件中看到会话包含什么。
但另一个错误出现了。由于我打了'\ Illuminate \ Session \ Middleware \ StartSession :: class'中间件,我的重定向不再对会话变量。
到目前为止,下面的代码工作正常,重定向在会话上创建了arsh变量:
return redirect('/admin')->with('arsh', $arsh);
但现在不再在重定向的会话上放置arsh变量了。
我在互联网上研究了很多,但没有。我看到很多建议,但没有人工作。
我只是不知道自己能做些什么。如果你知道什么会很棒。
你也可以考虑在我的中间件中使用另一种解决方法来阅读会话,并且可能不再需要考虑上一个bug了。
我希望你理解我写的内容并对我的英语表示抱歉。
我做了哈姆德所说的话: 我将我的中间件(\ App \ Http \ Middleware \ RedirectIfNotAuthenticated :: class)从$ middleware移动到$ middlewareGroups:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrimStrings::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,
\App\Http\Middleware\RedirectIfNotAuthenticated::class, // my middleware
],
'api' => [
'throttle:60,1',
'bindings',
],
];
现在重定向效果很好,可以在会话中设置变量。但我的中间件不再起作用了:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Session;
use Request;
class RedirectIfNotAuthenticated
{
/**
* handle
*/
public function handle($request, Closure $next, $guard = null)
{
if ($request->is('admin/*') && !$request->is('admin') && !$request->is('admin/login') && (!Session::has(_DB_PREFIX_.'id_admin') || !Session::has(_DB_PREFIX_.'name_admin'))) {
return redirect('/admin');
}
return $next($request);
}
}
如果声明永远不真实...... 这是因为在验证路由之前调用$ middleware,而之后调用$ middlewareGroups。所以当我的网址类似于domain.com/admin/fgtsdr时,我会重定向到404。
我的中间件做的是如果路由是admin / *并且我没有进入,它会将我重定向到/ admin。关键是即使路线存在与否也必须这样做......
答案 0 :(得分:2)
您没有发布您的Kernel.php
文件,并且不清楚全球中间件的含义是什么。你是在添加$middleware
数组还是$middlewareGroups
数组?
这些中间件的顺序很重要。在Kernel.php
文件中有三个阵列,您可以在其中注册中间件。
$middleware
。每次请求都会触发。
$middlewareGroups
。您注册中间件组以分配给特定路由。它有两个主要组:web
和api
。 web
组已分配给routes/web.php
文件中注册的所有路由。
$routeMiddleware
。分配给特定路由的单个中间件。
我假设您首先将自定义中间件放在$middleware
中以使其全局化,当这不起作用时,您将Laravel的StartSession
中间件添加到同一个阵列中。但是,StartSession
已在$middlewareGroups
组中的web
数组中注册。所以,你有两个会议,其中一个正在摧毁另一个。
在需要会话(网络路由)的情况下,将中间件添加到所有路由的正确方法是,如果web
之后,则将其添加到$middlewareGroups
组中> StartSession
中间件。
例如,
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class, <---- Laravel session middleware
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\CustomMiddleware::class, <--- Your global middleware.
],