在 Laravel 中保存表单数据的正确方法是什么(使用注入模型)?
What is the proper way to save form data in Laravel (using an injected model)?
我正在尝试设置一个简单的表单来保存,但想确保我们使用的是最佳实践,例如 DI。
在控制器文件中,我有
public function store()
{
//get form data
$data = Input::all();
$newclient = new Client($data);
$newclient->save();
return Redirect::route('clients.index');
}
但这真的不是依赖注入。 (对吧?)我是这样注入模型的
public function __construct(\Client $clientmodel)
{
$this->clientmodel=$clientmodel;
}
如何使用依赖注入将表单数据正确保存在商店功能上?
你所做的只是一个很好的练习。那会为你节省很多代码。但是,还有更多的余数。
- 始终遍历每个输入以检查缺少哪个输入。好吧,就您而言,这是一个简单的表格。但如果它是 API,客户端会发送各种输入,您需要知道会发生什么。有时,当输入不存在时,可能会导致严重的问题,例如将未定义输入的值分配给模型。
- 始终检查输入是否有效。确保每个输入都符合您的标准。您可以进行各种验证以实现它。
除了以上两点,你已经在正确的轨道上走了很远。
如果您总是创建一个新对象,那么您可以像这样使用 Eloquent 模型的 create
方法:
public function store()
{
//get form data
$data = Input::all();
$this->clientmodel->create($data);
return Redirect::route('clients.index');
}
如果有时此路由可能会处理现有 Client
记录的更新,那么您应该查看 firstOrCreate
和 firstOrNew
方法。
查看 Illuminate\Database\Eloquent\Model
中的 __constructor
,您可以看到它使用 fill()
分配传入的值。
public function __construct(array $attributes = array())
{
$this->bootIfNotBooted();
$this->syncOriginal();
$this->fill($attributes);
}
所以在实例化 class 之后,您可以使用 fill()
做同样的事情:
$this->clientmodel->fill($data)
$this->clientmodel->save();
或者如果你想保存它,你可以使用 create()
:
$this->clientmodel->create($data);
我正在尝试设置一个简单的表单来保存,但想确保我们使用的是最佳实践,例如 DI。
在控制器文件中,我有
public function store()
{
//get form data
$data = Input::all();
$newclient = new Client($data);
$newclient->save();
return Redirect::route('clients.index');
}
但这真的不是依赖注入。 (对吧?)我是这样注入模型的
public function __construct(\Client $clientmodel)
{
$this->clientmodel=$clientmodel;
}
如何使用依赖注入将表单数据正确保存在商店功能上?
你所做的只是一个很好的练习。那会为你节省很多代码。但是,还有更多的余数。
- 始终遍历每个输入以检查缺少哪个输入。好吧,就您而言,这是一个简单的表格。但如果它是 API,客户端会发送各种输入,您需要知道会发生什么。有时,当输入不存在时,可能会导致严重的问题,例如将未定义输入的值分配给模型。
- 始终检查输入是否有效。确保每个输入都符合您的标准。您可以进行各种验证以实现它。
除了以上两点,你已经在正确的轨道上走了很远。
如果您总是创建一个新对象,那么您可以像这样使用 Eloquent 模型的 create
方法:
public function store()
{
//get form data
$data = Input::all();
$this->clientmodel->create($data);
return Redirect::route('clients.index');
}
如果有时此路由可能会处理现有 Client
记录的更新,那么您应该查看 firstOrCreate
和 firstOrNew
方法。
查看 Illuminate\Database\Eloquent\Model
中的 __constructor
,您可以看到它使用 fill()
分配传入的值。
public function __construct(array $attributes = array())
{
$this->bootIfNotBooted();
$this->syncOriginal();
$this->fill($attributes);
}
所以在实例化 class 之后,您可以使用 fill()
做同样的事情:
$this->clientmodel->fill($data)
$this->clientmodel->save();
或者如果你想保存它,你可以使用 create()
:
$this->clientmodel->create($data);