Laravel - 无法覆盖模型的create方法

时间:2017-03-30 17:42:36

标签: php laravel laravel-5.4

覆盖基本Laravel模型create方法时,应用程序失败。没有错误发送回浏览器,服务器日志为空。奇怪的是,没有覆盖它就可以正常工作。不确定我做错了什么。

简化的控制器功能:

public function save(Request $request, $id = 0) {
    $myModel = MyModel::find($id);
    $data = $request->all();

    if (!$myModel) // Create a new row
    {
        $myModel = MyModel::create($data);
    }

    // ...
}

这个工作正常,直到我将此函数添加到模型中:

class MyModel extends Model
{
    // ...

    public static function create($attributes = [])
    {
        return parent::create($attributes);
    }

    // ...
}

只是为了澄清,我不是在寻找一种不同的方式来实现这一点。我只需要知道为什么父母的电话失败了。

这里有一些服务器信息...

  • 服务器操作系统:Windows 7(带XAMPP的个人电脑)
  • Laravel版本5.4.15
  • PHP版本5.6.30

2 个答案:

答案 0 :(得分:3)

解释是公共静态函数create()未在Illuminate\Database\Eloquent\Model类中定义。

作为 dinamic 方法调用处理,即通过调用函数来处理:

public static function __callStatic($method, $parameters)

Illuminate\Database\Eloquent\Model班。

最后,create()类中定义了Illuminate\Database\Query\Builder函数。 这就是你无法在模型中覆盖它并调用parent :: create()

的原因

恕我直言,我没有完全测试,你可以尝试:

public static function create($attributes)
{
    return (new static)->newQuery()->create($attributes);
}

答案 1 :(得分:0)

关于错误,您应该确保已在服务器上启用了log_errors。关于错误,当你扩展类并想要覆盖方法时,它应该具有相同的签名,所以它应该是:

public static function create(array $attributes = [])
{
    return parent::create($attributes);
}

(注意array类型提示)。显然我假设你要在这个函数中添加更多内容:)