使用Ajax时如何访问购物车ID的会话变量?如何设置属性?

时间:2019-03-25 13:05:10

标签: php laravel laravel-5.7

在laravel 5.3更新之后,开发人员无法访问构造函数中的会话变量。问题是-如何使用基于会话购物车ID的属性设置CartController?

例如:

class CartController extends Controller
{
    public $cartId;
    public $cartProducts;

public function __construct()
{
    $this->cartId= $this->getCartId();
    $this->cartProducts = $this->getCartProducts();
}

public function getCartProducts()
{
    return CartProduct::with('product')->where('id_cart', $this->getCartId())->get();
}

public function getCartId()
{
    $sessionCartId = Session::get('cartId');
    $cookieCartId = Cookie::get('cartId');

    if ($cookieCartId) {
        $cartId = $cookieCartId;
        Session::put('cartId', $cartId);
    } elseif ($sessionCartId) {
        $cartId = $sessionCartId;
        Cookie::queue('cartId', $cartId, 10080);
    } else {
        $cartId = $this->setNewCart();
    }

    return $cartId;
}

在此示例中,当我通过ajax getCartProducts()调用以获取产品列表时,我需要调用方法getCartId()而不是属性$ this-> cartId。 不错,但是当我调用更复杂的操作(如删除和刷新表方法)时,getCartId方法将被多次调用,从而导致多个查询。现在,如果我可以访问属性,则可以在一个查询中获得cartId。

问题是-如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用session闭包访问__construct中的middleware数据:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        $this->cartId = $this->getCartId();
        $this->cartProducts = $this->getCartProducts();

        return $next($request);
    });
}