我试图在Eloquent模型的构造函数中创建一个lambda样式的闭包作为动态命名的类变量。
实例化对象时工作正常,除了创建模型时(也就是说,读取,更新和删除工作正常)。
我可以通过在实例化对象之前显式声明类变量来解决这个问题,但是,这只是一个hack,我需要能够动态地创建类变量(作为闭包)。
以下代码有效,但如果我删除声明$ public foo;
,则会失败public $foo;
public function __construct() {
$foo = 'foo';
$this->{$foo} = function ($args) { return 'foo';};
}
我收到以下错误:
例外' ErrorException'使用消息'类Closure的对象可以 不能转换为字符串'在 /用户/站点/.../供应商/ laravel /框架/ SRC /照亮/支持/ helpers.php:900
就像我提到的那样,这只发生在创建/插入一个对象时(对不起,如果听起来很模糊,但是熟悉Laravel的人应该知道我的意思)...在其他情况下实例化模型(读/更新/删除)有效正好。关于可能导致问题的任何想法将不胜感激!
答案 0 :(得分:3)
在您的模型上覆盖setAttribute
和getAttribute
:
protected $closures = [];
public function setAttribute($key, $value)
{
if ($value instanceof \Closure)
{
$this->setClosureProperty($key, $value);
}
parent::setAttribute($key, $value);
}
public function getAttribute($key)
{
if (array_key_exists($key, $this->closures)
{
return $this->closures[$key];
}
return parent::getAttribute($key);
}
public function setClosureProperty($key, \Closure $value)
{
$this->closures[$key] = $value;
}
这样,cloures将不会保存在attributes
数组中,因此不会保存并转换为字符串。