首页 > 解决方案 > PHP / laravel将项目添加到会话未保存

问题描述

昨天我开始了我的第一个 laravel 项目。但我遇到了一个我无法理解的问题。

我正在尝试创建一个购物车,我用我自己的包装器跟踪使用 laravel 的会话对象。代码如下所示:

class SessionController extends Controller
{
 static function getSessionData($key = null, $data = null)
    {
        if($data === null)
        {
            return Session::get($key);
        }

        else
        {
            return Session::get($key, $data);
        }
    }

    static function allSessionData()
    {
        return Session::all();
    }

    static function putSessionData($key = null, $data)
    {
        if ($key === null)
        {
            Session::put($data);
        }
        else
        {
            Session::put($key, $data);
        }
    }

    static function has($key)
    {
        return Session::has($key);
    }  

现在在我的ShoppingCart班级中,我创建了一个$instance字段,用于保存购物车数据,或者如果它还没有在会话中,则创建一个空的购物车。代码如下所示:

class ShoppingCart extends Model
{
    public $id;
    public $session;
    private $sessionName = 'shoppingcart';
    private $instance;
    public $cartItems;

    protected $connection = 'mysql2';
    protected $table = 'shoppingcart';
    protected $primaryKey = 'Id';   


    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->cartItems = [];
    }

    private function getOrCreateSession()
    {
        if(SessionController::has($this->sessionName))
        {
            $this->instance = SessionController::getSessionData($this->sessionName);
        }

        else
        {
            SessionController::putSessionData($this->sessionName, $this);
            $this->instance = SessionController::getSessionData($this->sessionName);
        }
    }

    function addCartItem($productId, $qty = 1)
    {
        $this->getOrCreateSession();
        $cartItem = $this->createCartitem($productId, $qty);
        $content = $this->getContent();

        if ($existingCartitem = $this->alreadyInCart($cartItem)) {
            $existingCartitem->qty += $cartItem->qty;
        } else {
            array_push($content, $cartItem);
        }
    }

    function createCartItem($productId, $qty)
    {
        $cartItem = CartItem::fromId($this->instance->id, $productId, $qty);
        $cartItem->associate($this->instance->id);

        return $cartItem;
    }

    private function alreadyInCart($cartItem)
    {
        $alreadyInCart = FALSE;

        foreach ($this->instance->cartItems as $item) {
            if ($item->productId == $cartItem->productId) {
                return $item;
            }
        }

        return $alreadyInCart;
    }

    //returns current shoppingcart contents.
    private function getContent()
    {
       return $this->instance->cartItems;
    }
}

现在在addCartItem-method 中,我尝试使用array_push()var_dump()-ing 会话将新的 caritem 推送到数组中,然后显示会话不包含新添加的项目。但是,如果我var_dump()在- 方法$content之前和之后array_push,我可以看到它被添加了。

我认为 PHP 会通过引用传递会话,但显然我在这里遗漏了一些东西。

我究竟做错了什么?

先感谢您。

标签: phplaravel

解决方案


您永远不会真正将数据持久化(保存)到Session.

尝试Session通过执行类似Session::put('new.item' , $cartItem).

然后您可以通过以下方式检索控制器中的项目:Session::get('new.item')


推荐阅读