Php Laravel在中间件中设置cookie,使其';在同一个要求下,它是可用的
我有一个Laravel中间件,如果cookie不存在,它会设置cookie:Php Laravel在中间件中设置cookie,使其';在同一个要求下,它是可用的,php,laravel,Php,Laravel,我有一个Laravel中间件,如果cookie不存在,它会设置cookie: public function handle($request, Closure $next) { if (!$request->cookie('cart_id')) { return $next($request)->withCookie(cookie()->forever('cart_id', $this->generateUniqueCart
public function handle($request, Closure $next)
{
if (!$request->cookie('cart_id')) {
return $next($request)->withCookie(cookie()->forever('cart_id', $this->generateUniqueCartId()));
}
return $next($request);
}
简单!问题是,如果我尝试在同一请求上从控制器访问该cookie,它将返回null
$request->cookie('cart_id')
只有在后续请求中,请求才包含cookie
我知道原始请求从未包含cookie,因此它返回
null
是有意义的,但我想知道是否有一种干净的访问它的方法,或者我必须将它闪存到会话中,以便在该请求中稍后访问它?我通过创建一个专门处理它的类来解决我的问题使用cart Cookie生成并使其成为注入服务容器的单例类
一旦它生成了一个唯一的购物车id,它就会将其存储起来,以便我以后可以使用app(CartCookie::class)->id()
在同一请求中访问它。如果有人能想出一个更好的方法,那就一定要让我知道
代码如下:
CartCookie.php
namespace App\Services;
use App\Cart;
use Illuminate\Http\Request;
class CartCookie
{
private $id;
private $request;
function __construct(Request $request)
{
$this->request = $request;
if ($request->cookie('cart_id')) {
$this->id = $request->cookie('cart_id');
} else {
$this->id = $this->generateUniqueCartId();
}
}
public function id()
{
return $this->id;
}
private function generateUniqueCartId()
{
do {
$id = md5(time() . 'cart' . rand(100000000000000, 9999999999999999));
} while (Cart::find($id));
return $id;
}
}
CartCookieServiceProvider.php
namespace App\Providers;
use App\Services\CartCookie;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
class CartCookieServiceProvider extends ServiceProvider
{
public function boot(Request $request)
{
$this->app->singleton(CartCookie::class, function ($app) use ($request) {
return new CartCookie($request);
});
}
}
cartcookie.php
namespace App\Http\Middleware;
use App\Cart;
use Closure;
class CartCookie
{
public function handle($request, Closure $next)
{
if (!$request->cookie('cart_id')) {
$id = app(\App\Services\CartCookie::class)->id();
return $next($request)->withCookie(cookie()->forever('cart_id', $id));
}
return $next($request);
}
}
通过创建一个专门处理cart Cookie生成的类,并将其作为注入服务容器的单例类,我已经解决了这个问题 一旦它生成了一个唯一的购物车id,它就会将其存储起来,以便我以后可以使用
app(CartCookie::class)->id()
在同一请求中访问它。如果有人能想出一个更好的方法,那就一定要让我知道
代码如下:
CartCookie.php
namespace App\Services;
use App\Cart;
use Illuminate\Http\Request;
class CartCookie
{
private $id;
private $request;
function __construct(Request $request)
{
$this->request = $request;
if ($request->cookie('cart_id')) {
$this->id = $request->cookie('cart_id');
} else {
$this->id = $this->generateUniqueCartId();
}
}
public function id()
{
return $this->id;
}
private function generateUniqueCartId()
{
do {
$id = md5(time() . 'cart' . rand(100000000000000, 9999999999999999));
} while (Cart::find($id));
return $id;
}
}
CartCookieServiceProvider.php
namespace App\Providers;
use App\Services\CartCookie;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
class CartCookieServiceProvider extends ServiceProvider
{
public function boot(Request $request)
{
$this->app->singleton(CartCookie::class, function ($app) use ($request) {
return new CartCookie($request);
});
}
}
cartcookie.php
namespace App\Http\Middleware;
use App\Cart;
use Closure;
class CartCookie
{
public function handle($request, Closure $next)
{
if (!$request->cookie('cart_id')) {
$id = app(\App\Services\CartCookie::class)->id();
return $next($request)->withCookie(cookie()->forever('cart_id', $id));
}
return $next($request);
}
}
据我所知,中间件不是会话生命周期的一部分,因此不能在中间件中设置cookie。我没有任何引用,所以如果我错了,请纠正我,但我在某个地方读过它,这可能就是原因?cookie是会话的一部分,仅在请求中设置,因此您以前不能使用它。只需在临时文件中设置值variable@Markinson中间件是会话生命周期的一部分,cookie设置得很好,但只能在后续请求中访问。啊,好吧!值得一试;-)据我所知,中间件不是会话生命周期的一部分,因此不能在中间件中设置cookie。我没有任何引用,所以如果我错了,请纠正我,但我在某个地方读过它,这可能就是原因?cookie是会话的一部分,仅在请求中设置,因此您以前不能使用它。只需在临时文件中设置值variable@Markinson中间件是会话生命周期的一部分,cookie设置得很好,但只能在后续请求中访问。啊,好吧!值得一试;-)