【问题标题】:What is the proper way to save form data in Laravel (using an injected model)?在 Laravel 中保存表单数据的正确方法是什么(使用注入模型)?
【发布时间】:2015-01-29 00:20:34
【问题描述】:

我正在尝试设置一个简单的表单来保存,但想确保我们使用的是最佳实践,例如 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;
}

如何使用依赖注入将表单数据正确保存在 store 函数中?

【问题讨论】:

    标签: php laravel laravel-4 dependency-injection


    【解决方案1】:

    查看Illuminate\Database\Eloquent\Model 中的__constructor,您可以看到它使用fill() 来分配传入的值。

    public function __construct(array $attributes = array())
    {
        $this->bootIfNotBooted();
        $this->syncOriginal();
        $this->fill($attributes);
    }
    

    所以你可以在类被实例化后使用fill() 来做同样的事情:

    $this->clientmodel->fill($data)
    $this->clientmodel->save();
    

    或者如果你想保存它,你可以使用create()

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

    【讨论】:

    • 很好的解释。谢谢!
    【解决方案2】:

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

    public function store()
    {
        //get form data
        $data = Input::all();
    
        $this->clientmodel->create($data);
    
        return Redirect::route('clients.index');
    }
    

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

    【讨论】:

      【解决方案3】:

      你所做的只是一个好习惯。这将为您节省大量代码。但是,还有更多的余数。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 2022-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多