PHP / laravel向会话添加项目未保存

时间:2018-08-14 13:15:09

标签: php laravel

昨天我开始了我的第一个laravel项目。但是我有一个我不明白的问题。

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

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方法内部,我尝试使用array_push()将新的Cartitem推入数组,但是var_dump()-之后的会话显示该会话不包含新添加的项目。但是,如果我在var_dump()方法之前和之后$content array_push,我可以看到它被添加了。

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

我在做什么错?

先谢谢您。

2 个答案:

答案 0 :(得分:0)

您将需要通过引用返回会话,即

$myVariable = &SessionController::getSessionData($this->sessionName);

并通过获取其引用来使用它,例如:

<?php
class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.
?>

引用docs

  

当您想使用函数来通过引用返回时很有用   查找引用应该绑定到哪个变量。不使用   参考返回以提高性能。引擎会   自行自动优化。仅在以下情况下返回引用   您有充分的技术理由这样做。要返回引用,请使用   这种语法:

{% include 'countsnippet' %}

答案 1 :(得分:0)

您实际上从未将数据持久保存(保存)到Session中。

尝试使用Session之类的方法来使用Session::put('new.item' , $cartItem)门面。

然后,您可以通过Session::get('new.item')在控制器中检索该项目。