php - 您不能在 laravel 中序列化或反序列化 PDO 实例

标签 php laravel events serialization queue

我正在使用这样的默认 laravel 事件系统

use \Illuminate\Database\Connection;

class ExampleService {

private $connection;

    public function __construct(Connection $connection)
    {
        $this->connection = $connection;
    }
}

class ExampleEvent {

    private $service;

    public function __construc(ExampleService $service) {
        $this->service = $service;
    }
}


class ExampleListener implements ShouldQueue {

    public function handle(ExampleEvent $event) {

    }
}

这是我的自定义服务,我使用的是连接而不是 eloquent,每当我注入(inject)时,我都会将我的服务从事件解析到监听器并将其放入队列中,我得到错误 You cannot serialize or unserialize PDO instances .我希望我的听众使用 implements ShouldQeueue而不是创建不同的作业并从同一个监听器进行调度

最佳答案

将项目添加到队列中会使它们序列化。

Connection 包含一个 PDO 实例,但您无法序列化 PDO 实例,因此,您会收到该错误。

您应该实现 __sleep and __wakeup确保序列化正确发生的方法,例如:

class ExampleService {

    private $connection;

    public function __construct(Connection $connection)
    {
        $this->connection = $connection;

    }

    public function __sleep() {
         return []; //Pass the names of the variables that should be serialised here
    }
    public function __wakeup() {
         //Since we can't serialize the connection we need to re-open it when we unserialise
         $this->connection = app()->make(Connection::class); 
    }
}

关于php - 您不能在 laravel 中序列化或反序列化 PDO 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54477007/

相关文章:

php - 如何从存储过程中获取特定的 count(*) 列作为字符串或整数

javascript - Backbone.js:为什么事件没有第二次触发(delegateEvents 没有帮助)

php - mysql 61表连接限制

php - 显示用户通过 Laravel 关系关注的用户的帖子

laravel - 创建多个文件的zip并在laravel中下载

javascript - 单击浏览器的后退按钮时如何销毁 session

php - SQL 查询可在测试服务器上运行,但不能实时运行……有什么区别?

php - WooCommerce 存档页面产品查询上的多个 orderby 参数

javascript - 仅将更改应用于具有相同方法名称的多个元素中的单击元素

oop - 依赖注入(inject)系统中的事件往哪个方向发展?