如何解决这个 Laravel 会话问题

Posted

技术标签:

【中文标题】如何解决这个 Laravel 会话问题【英文标题】:How to solve this Laravel session issue 【发布时间】:2020-10-03 12:04:53 【问题描述】:

我有一个数组。然后我使用 php unset 方法从数组中只删除一个索引。然后我将新数组存储在 laravel 会话中。

$GetCartItems = json_decode($request->SessionValue);

unset($GetCartItems->items[$request->ArrIndex]);

$request->session()->put('cart', $GetCartItems);

之后,我使用以下代码从 laravel 会话中重试了数组。现在它是 stdClass 类型的对象,而不是数组。但是,我想要一个数组。

 $GetCartItems = Session::get('cart');

这是我想从 laravel 会话中得到的。

App\Cart #282 ▼
  +items: array:3 [▼
    0 => array:6 [▼
      "item_id" => "29"
      "qty" => array:1 [▶]
      "price" => "1235"
      "size" => array:1 [▶]
      "item" => App\Product #283 ▶
      "produ" => array:1 [▶]
    ]
    1 => array:6 [▶]
    2 => array:6 [▶]
  ]
  +totalQty: 3
  +totalPrice: 3705
  +count: 3
  +ArrCount: 3

这是我在删除一个带有元素的索引并存储在 laravel 会话中之后得到的。

#282 ▼
  +"items": array:3 [▼
    0 => #283 ▼
      +"item_id": "29"
      +"qty": array:1 [▶]
      +"price": "1235"
      +"size": array:1 [▶]
      +"item": #284 ▶
      +"produ": array:1 [▶]
    
    1 => #286 ▶
    2 => #290 ▶
  ]
  +"totalQty": 6
  +"totalPrice": 7410
  +"count": 6
  +"ArrCount": 3

我怎样才能摆脱这个 stdClass 类型的对象并得到我想要的??

【问题讨论】:

我想你已经序列化了 App\Cart 模型和嵌套的 items 关系?我说的对吗? 【参考方案1】:

在下一行中,您将 SessionValue 转换为 stdClass 对象,因为 json_decode 将序列化对象转换为 stdClass

$GetCartItems = json_decode($request->SessionValue);

如果你在第二个的 json_decode 参数中添加一个 true,你会得到一个 Array 而不是 stdClass

$GetCartItems = json_decode($request->SessionValue, true);

另一方面,使用 json_encode 获取 Cart Instance 并不容易,但您可以尝试使用 Object Serialization https://www.php.net/manual/en/language.oop5.serialization.php

<?php

class Cart implements \Serializable

    public $items;
    public function __construct()
    
        $this->items = [
            1,2,3
        ];
    
    public function serialize() 
        return serialize($this->items);
    
    public function unserialize($items) 
        $this->items = unserialize($items);
    

这样您就可以序列化您的对象并将其持久化到会话中

<?php

$GetCartItems = unserialize($request->SessionValue);

unset($GetCartItems->items[$request->ArrIndex]);

$request->session()->put('cart', serialize(($GetCartItems));

下次你尝试这样做时

$GetCartItems = unserialize($request->SessionValue);

您将获得具有正确值的购物车实例 :)

【讨论】:

【参考方案2】:

当你想将对象转换为数组时,你可以使用toArray()方法,像这样:

$GetCartItems = Session::get('cart')->toArray();

【讨论】:

以上是关于如何解决这个 Laravel 会话问题的主要内容,如果未能解决你的问题,请参考以下文章

单击浏览器的后退按钮时如何销毁会话

Laravel 会话超时,额外的注销代码

PHP cURL 没有存储会话 cookie...如何解决这个问题?

如何解决这个问题 -> Laravel Route 404 错误

如何解决 laravel 中不明确的列问题?

如何解决 Laravel 需要 php mcrypt 扩展?