Для тех, кто в танке, как этот мистер 6к постов "иди гугли", во избежании дальнейших недоразумений, объясню:
Нужно сериализовать объект, который прилетает в обработчик события, но все мои попытки приводят к ошибкам: Exception Serialization of 'Closure' is not allowed
Код: Выделить всё
$topic->on(ActiveRecord::EVENT_AFTER_UPDATE,function($event){
serialize($event); //Exception Serialization of 'Closure' is not allowed
});
Тогда я попробовал схитрить
Код: Выделить всё
$topic->on(ActiveRecord::EVENT_AFTER_UPDATE,[$this, 'handler']); //Exception Serialization of 'Closure' is not allowed
Тогда, я подумал, может в Event есть какое-то свойство, из-за которого глюк (например анонимка)? И переписал код вообще без обработки события, может дело вовсе не в замыкании
Код: Выделить всё
$topic = Topic::findOne(30);
$event = new \yii\base\Event(['sender' => $topic]);
echo serialize($event);
Этот код успешно отработал, тогда я подумал, ну остается один вариант, проблема таки в замыкании. Следовательно, я написал свою версию
Код: Выделить всё
$callback = function($obj){
echo serialize($obj);
};
class A {
public $foo;
public function __construct($bar){
$this->foo = $bar;
}
}
$obj = new A('РАБОТАЙ ЖЕ ЕБАННОЕ ГАВНО');
$callback($obj);
Этот код успешно отработал. Отсюда стало понятно две вещи
1. Анонимная функция, она же замыкание спокойно внутри себя может сериализовать
2. Она отлично может серилизовать объекты внутри себя.
Тогда я попробовал сделать так и опять обламался, потому что все работает
Код: Выделить всё
$callback = function($obj){
echo serialize($obj);
};
$topic = Topic::findOne(40);
$event = new \yii\base\Event(['sender' => $topic]);
$callback($event);
Ну и тут я немного "подвис". С такими выводами: Если Event и мой ActiveRecord сериализуется в не обработчика событий, просто в анонимке, то значит в них нет свойств по причине которых не проходила бы сериализация. Если допустим, проблемным является само замыкание во время обработки события, то тогда это должно было бы работать в таком виде, но нет:
Код: Выделить всё
$topic->on(ActiveRecord::EVENT_AFTER_UPDATE,[$this, 'handler']); //Exception Serialization of 'Closure' is not allowed
Отсюда у меня вопрос, как заставить это работать?