Php 使用依赖注入更新模型

Php 使用依赖注入更新模型,php,laravel,Php,Laravel,我将我的模型和控制器转换为支持依赖注入,它运行得很好,但有一件事我有点挣扎。如何更新存储库实例?假设我有以下代码: $upload = Upload::find($id); $upload->receiver_email_id = $mailAdress->id; $upload->sender_email_id = $mailAdress2->id; $saved = $upload->save(); 所以我得到了模型,更新了email_id并再次保存。现在,依

我将我的模型和控制器转换为支持依赖注入,它运行得很好,但有一件事我有点挣扎。如何更新存储库实例?假设我有以下代码:

$upload = Upload::find($id);
$upload->receiver_email_id = $mailAdress->id;
$upload->sender_email_id = $mailAdress2->id;
$saved = $upload->save();
所以我得到了模型,更新了email_id并再次保存。现在,依赖注入是如何进行的呢

$upload = $this->upload->find($id);
现在我有了我的模型。现在最优雅的更新方式是什么? 比如:

$upload->update(array(
    'receiver_email_id' => $mailAdress->id,
    'sender_email_id' => $mailAdress2->id
));
或者类似的

$upload->receiver_email_id = $mailAdress->id;
$upload->sender_email_id = $mailAdress2->id;
$saved = $upload->save($upload);
我在哪里传递完整的上传对象并在存储库中处理保存


不知道我为什么要和这个做斗争。或者我把事情复杂化了,有一个简单的解决方案?

你的两种方法都是正确的,我看不出有任何问题

如果您有一个项目数组,只需使用
update()
,即可节省几行代码

$upload->update(Input::all());
另一方面,如果您有一些变量并且想要更新模型,那么最好的方法是将它们指定给模型对象

$upload->receiver_email_id = $mailAdress->id;
$upload->sender_email_id = $mailAdress2->id;
$upload->save();

如何构建存储库取决于您。我倾向于将您的第一种方法主要用于我的存储库

class UploadRepository {

    public function findById($id)
    {
        $upload = Upload::find($id);

        if ( ! $upload )
            throw new NotFoundException("Upload model with id:$id was not found");

        return $upload;
    }

    public function update($id, array $data)
    {
        $upload = $this->findById($id);

        $upload->update($data);

        $this->validate($upload->toArray());

        return $upload->save();
    }

    public function validate(array $data)
    {
        $validator = Validator::make($data);

        if ($validator->fails())
            throw new ValidationException($validator);
    }
}
显然,用您需要的其他方法填充repo,但这样您可以简单地将
Input::all()
的结果从控制器传递到repo

// Considering this a resource controller
class UploadController extends BaseController {

    public function __construct(UploadRepository $repo)
    {
        $this->repo = $repo;
    }

    public function update($id)
    {
        return $this->repo->update($id, Input::all());
    }
}

我不是100%确定你真正想做什么,但似乎你把事情复杂化了。简而言之,DI就是在另一个类中使用一个类,这样它就可以工作。因此,如果您有一个自定义类(UploadService),而您的另一个类(Upload)需要该类才能工作,那么只需通过一个_构造函数方法启动它即可。这正是我想要的。tyvm