【问题标题】:Laravel try to save a class object into sessionLaravel 尝试将类对象保存到会话中
【发布时间】:2021-03-26 18:41:42
【问题描述】:

我试图将一个类对象保存到会话中,但不知何故它抛出了“不允许序列化'Closure'”错误。

我能做些什么来解决它?

下面是我的代码

public function getAddToCart(Request $request, $id){
        $listing=Listing::find($id);

        
        $cart = new Cart(null); 
        $cart->add($listing,$listing->id); //this is working 
        Session::put('cart',$cart);
        Session::save();
        return Redirect::to('/');
    }

下面是我的课

class Cart {
    public $items=null;
    public $totalQty=0;
    public $totalPrice=0;

    public function __construct($oldCart){
        if($oldCart){
            $this->items=$oldCart->items;
            $this->totalQty=$oldCart->totalQty;
            $this->totalPrice=$oldCart->totalPrice;
        }
    }
    public function add($item, $id){
        $this->items[$id]=['qty'=>0,'price'=>0,'item'=>$item];
        $this->totalQty++;
        $this->totalPrice+=10000;
        
    }
}

这是错误

enter image description here

(Laravel、会话、对象、Serealize)

这是模型

<?php namespace Nanolution\Listing\Models;


class Listing extends Model
{
    use \October\Rain\Database\Traits\Validation;
    

    public $table = 'nanolution_listing_';

    public $rules = [
    ];

    public $attachMany=[
        "gallery"=>"System\Models\File"
    ];

    public $hasMany=[
        'testimonials'=>"Nanolution\Listing\Models\Testimonial"
    ];

    public $belongsToMany=[
        'categories'=>["Nanolution\Listing\Models\Category",
                        'table'=>'nanolution_listing_list_cate'
        
        ]

    ];
    public function getNameAttribute()
    {
        return $this->attributes['name'];
    }
}

【问题讨论】:

  • @lagbox 列表只是一个 Eloquent 模型
  • 可以展示一下模型吗
  • 是的,它已编辑。
  • 需要查看基本模型和特征,但似乎某些东西已经在列表的模型实例上设置了一个闭包..
  • 我设置成'item'=>$item->title,问题就解决了

标签: php laravel object session serialization


【解决方案1】:

您的 Cart 包含对您的 Listing 模型的引用。模型不能被序列化,因为它们包含对包含对闭包的引用的对象的引用。

如果可能,请更新您的 Cart 以不保留对 Listing 模型的引用。

如果您的 Cart 需要 Listing 引用,那么您将需要更新代码以处理序列化和反序列化模型。 Laravel 有一个可以尝试使用的排队系统的特性。不过,我不知道它是否会起作用。

要尝试此操作,请将 Illuminate\Queue\SerializesModels 特征添加到您的 Cart 类中。 trait 的工作方式是,在幕后,它不是尝试序列化整个模型,而是序列化模型标识符。然后,当对象被反序列化时,它会从数据库中检索模型的新实例。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2017-06-23
    • 2018-04-13
    • 2019-05-12
    • 2015-10-31
    相关资源
    最近更新 更多