Php Laravel在中间件中设置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

我有一个Laravel中间件,如果cookie不存在,它会设置cookie:

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设置得很好,但只能在后续请求中访问。啊,好吧!值得一试;-)