在Eloquent Model的构造函数中创建一个闭包作为类变量

时间:2015-02-23 19:08:40

标签: php laravel eloquent

我试图在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的人应该知道我的意思)...在其他情况下实例化模型(读/更新/删除)有效正好。关于可能导致问题的任何想法将不胜感激!

1 个答案:

答案 0 :(得分:3)

在您的模型上覆盖setAttributegetAttribute

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数组中,因此不会保存并转换为字符串。