Session Laravel 中未设置变量
Session variable isn't set in Laravel
各位。
我做了一个中间件。我做了一个全局的,把它放到 Kernel.php 中,每个请求都会调用它,并验证用户是否登录。
关键是我需要为此使用 session。但是 session 是空的。可能是因为它稍后在脚本中填充。
所以我使用名为“\Illuminate\Session\Middleware\StartSession::class”的全局中间件修复它。这很棒,因为在那之后我可以在我的中间件中看到 session 包含的内容。
但是出现了另一个错误。由于我放置了“\Illuminate\Session\Middleware\StartSession::class”中间件,我的重定向不再放在 session 变量上。
到目前为止,下面的代码运行良好,重定向在 session:
上创建了 arsh 变量
return redirect('/admin')->with('arsh', $arsh);
但现在不再将 arsh 变量放在重定向 session 上。
我在网上查了很多资料,但一无所获。我看到了很多建议,但没有一个有效。
我只是不知道我能做什么。如果你知道一些东西会很棒。
你也可以考虑在我的中间件中使用另一种解决方法来读取session,这可能就不需要再考虑上一个错误了。
我希望你能理解我写的东西,对不起我的英语。
编辑:
我做了哈穆德说的:
我将我的中间件 (\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',
],
];
现在重定向效果很好,可以在 session 上设置变量。但是我的中间件不再工作了:
<?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 在之后被调用。因此,当我的 url 类似于 domain.com/admin/fgtsdr.
时,我将重定向到 404
我的中间件所做的是,如果路由是 admin/* 而我没有登录,它会将我重定向到 /admin。关键是它必须这样做,即使路线存在与否...
您没有 post 您的 Kernel.php
文件,并且不清楚全局中间件的含义。您将其添加到 $middleware
数组还是 $middlewareGroups
数组?
这些中间件的顺序很重要。在 Kernel.php
文件中有三个数组,您可以在其中注册您的中间件。
$middleware
。随每个请求触发。
$middlewareGroups
。您注册一组中间件以分配给特定路由。它有两个主要组:web
和 api
。 web
组分配给在 routes/web.php
文件中注册的所有路由。
$routeMiddleware
。分配给特定路由的单个中间件。
我假设您首先将自定义中间件放在 $middleware
中以使其全局化,当这不起作用时您将 Laravel 的 StartSession
中间件添加到相同的大批。但是,StartSession
已经在 web
组的 $middlewareGroups
数组中注册。所以,你有两个会话,其中一个正在破坏另一个。
当所有路由需要会话(网络路由)时,向所有路由添加中间件的正确方法是将其添加到 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.
],
各位。
我做了一个中间件。我做了一个全局的,把它放到 Kernel.php 中,每个请求都会调用它,并验证用户是否登录。
关键是我需要为此使用 session。但是 session 是空的。可能是因为它稍后在脚本中填充。 所以我使用名为“\Illuminate\Session\Middleware\StartSession::class”的全局中间件修复它。这很棒,因为在那之后我可以在我的中间件中看到 session 包含的内容。
但是出现了另一个错误。由于我放置了“\Illuminate\Session\Middleware\StartSession::class”中间件,我的重定向不再放在 session 变量上。
到目前为止,下面的代码运行良好,重定向在 session:
上创建了 arsh 变量return redirect('/admin')->with('arsh', $arsh);
但现在不再将 arsh 变量放在重定向 session 上。
我在网上查了很多资料,但一无所获。我看到了很多建议,但没有一个有效。
我只是不知道我能做什么。如果你知道一些东西会很棒。
你也可以考虑在我的中间件中使用另一种解决方法来读取session,这可能就不需要再考虑上一个错误了。
我希望你能理解我写的东西,对不起我的英语。
编辑:
我做了哈穆德说的: 我将我的中间件 (\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',
],
];
现在重定向效果很好,可以在 session 上设置变量。但是我的中间件不再工作了:
<?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 在之后被调用。因此,当我的 url 类似于 domain.com/admin/fgtsdr.
时,我将重定向到 404我的中间件所做的是,如果路由是 admin/* 而我没有登录,它会将我重定向到 /admin。关键是它必须这样做,即使路线存在与否...
您没有 post 您的 Kernel.php
文件,并且不清楚全局中间件的含义。您将其添加到 $middleware
数组还是 $middlewareGroups
数组?
这些中间件的顺序很重要。在 Kernel.php
文件中有三个数组,您可以在其中注册您的中间件。
$middleware
。随每个请求触发。$middlewareGroups
。您注册一组中间件以分配给特定路由。它有两个主要组:web
和api
。web
组分配给在routes/web.php
文件中注册的所有路由。$routeMiddleware
。分配给特定路由的单个中间件。
我假设您首先将自定义中间件放在 $middleware
中以使其全局化,当这不起作用时您将 Laravel 的 StartSession
中间件添加到相同的大批。但是,StartSession
已经在 web
组的 $middlewareGroups
数组中注册。所以,你有两个会话,其中一个正在破坏另一个。
当所有路由需要会话(网络路由)时,向所有路由添加中间件的正确方法是将其添加到 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.
],