php - 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 会通过引用传递会话,但显然我在这里遗漏了一些东西。
我究竟做错了什么?
先感谢您。
解决方案
您永远不会真正将数据持久化(保存)到Session
.
尝试Session
通过执行类似Session::put('new.item' , $cartItem)
.
然后您可以通过以下方式检索控制器中的项目:Session::get('new.item')
。
推荐阅读
- reactjs - 如何在反应中制作外部超链接?
- r - 是否可以在 RStudio 服务器上的 ShinyApp 中运行 RSelenium?
- node.js - Vue.js 图像纵横比
- node.js - node.js 可以将文件/文件夹发送到回收站(MacOS 上的垃圾箱)而不是 fs.unlink / fs.rmdir 吗?
- r - 如何从 R 快速连接(访问)IBM 云对象存储?
- netsuite - SuiteScript 2 file.File 参数类型错误
- luxon - 如何在 luxon 中创建 momentLocaleData.firstDayOfWeek()?
- jquery - jQuery 错误 MaterializeCSS
- javascript - 大数据网格单元的实时更新:方法
- reactjs - 如何使用 Material UI 动态创建选择和状态?