昨天我开始了我的第一个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会通过引用传递会话,但显然我在这里遗漏了一些东西。
我在做什么错?
先谢谢您。
答案 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')
在控制器中检索该项目。