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);
}
// ...
}
澄清一下,我并不是在寻找其他实现方法。我只需要知道为什么父调用对我来说失败了。
这是一些服务器信息...
- 服务器 OS:Windows 7(个人电脑XAMPP)
- Laravel 版本 5.4.15
- PHP 版本 5.6.30
关于错误,您应该确保在您的服务器上启用了 log_errors。关于这个错误,当你扩展 class 并想覆盖方法时,它应该有相同的签名,所以它应该是:
public static function create(array $attributes = [])
{
// Your custom code goes here
return parent::create($attributes);
}
(注意 array
类型提示)。显然,我假设您要在此函数中添加更多内容:)
解释是public静态函数create()没有定义在Illuminate\Database\Eloquent\Model
class.
被处理为动态方法调用,即通过调用函数处理:
public static function __callStatic($method, $parameters)
在Illuminate\Database\Eloquent\Model
class.
最后create()
函数定义在Illuminate\Database\Query\Builder
class中。
这就是您不能在模型中覆盖它并调用 parent::create()
的原因
恕我直言,我还没有完全测试过,你可以试试:
public static function create($attributes)
{
return (new static)->newQuery()->create($attributes);
}
覆盖基础 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);
}
// ...
}
澄清一下,我并不是在寻找其他实现方法。我只需要知道为什么父调用对我来说失败了。
这是一些服务器信息...
- 服务器 OS:Windows 7(个人电脑XAMPP)
- Laravel 版本 5.4.15
- PHP 版本 5.6.30
关于错误,您应该确保在您的服务器上启用了 log_errors。关于这个错误,当你扩展 class 并想覆盖方法时,它应该有相同的签名,所以它应该是:
public static function create(array $attributes = [])
{
// Your custom code goes here
return parent::create($attributes);
}
(注意 array
类型提示)。显然,我假设您要在此函数中添加更多内容:)
解释是public静态函数create()没有定义在Illuminate\Database\Eloquent\Model
class.
被处理为动态方法调用,即通过调用函数处理:
public static function __callStatic($method, $parameters)
在Illuminate\Database\Eloquent\Model
class.
最后create()
函数定义在Illuminate\Database\Query\Builder
class中。
这就是您不能在模型中覆盖它并调用 parent::create()
恕我直言,我还没有完全测试过,你可以试试:
public static function create($attributes)
{
return (new static)->newQuery()->create($attributes);
}