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

如何使用依赖注入将表单数据正确保存在商店功能上?

你所做的只是一个很好的练习。那会为你节省很多代码。但是,还有更多的余数。

  1. 始终遍历每个输入以检查缺少哪个输入。好吧,就您而言,这是一个简单的表格。但如果它是 API,客户端会发送各种输入,您需要知道会发生什么。有时,当输入不存在时,可能会导致严重的问题,例如将未定义输入的值分配给模型。
  2. 始终检查输入是否有效。确保每个输入都符合您的标准。您可以进行各种验证以实现它。

除了以上两点,你已经在正确的轨道上走了很远。

如果您总是创建一个新对象,那么您可以像这样使用 Eloquent 模型的 create 方法:

public function store()
{
    //get form data
    $data = Input::all();

    $this->clientmodel->create($data);

    return Redirect::route('clients.index');
}

如果有时此路由可能会处理现有 Client 记录的更新,那么您应该查看 firstOrCreatefirstOrNew 方法。

查看 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);