Laravel - 无法覆盖模型的创建方法

Laravel - Unable to override the create method for a model

覆盖基础 Laravel 模型创建方法时,应用程序失败。没有错误发送回浏览器,服务器日志为空。奇怪的是,它在没有覆盖的情况下工作得很好。不确定我做错了什么。

简化的控制器功能:

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);
    }

    // ...
}

澄清一下,我并不是在寻找其他实现方法。我只需要知道为什么父调用对我来说失败了。

这是一些服务器信息...

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

public static function create(array $attributes = [])
{
    // Your custom code goes here

    return parent::create($attributes);
}

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

解释是public静态函数create()没有定义在Illuminate\Database\Eloquent\Modelclass.

被处理为动态方法调用,即通过调用函数处理:

public static function __callStatic($method, $parameters)

Illuminate\Database\Eloquent\Modelclass.

最后create()函数定义在Illuminate\Database\Query\Builderclass中。 这就是您不能在模型中覆盖它并调用 parent::create()

的原因

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

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