我正在使用Laravel 4创建一个Web应用程序,在这个应用程序中我有一些文章。每篇文章都有多个图片。现在,当我想删除一篇文章时,我还必须删除属于该文章的图像。我想知道,我应该把Image删除方法放在哪里。我可以把它放在文章控制器,图像控制器或图像模型中。
由于我还必须能够在不触及文章的情况下单独删除图像,因此让文章控制器删除文件是没有意义的。那么放在哪里呢?图像模型或图像控制器?我认为Image Model。
编辑:我使用Laravel ORM并且所有文章都链接到他们的图像。删除一篇文章也会删除DB中的所有图像。我只是想知道,文件系统的删除应该去哪里..
答案 0 :(得分:4)
首先,模型是图层。这不是多元化的 - 你可以在这里阅读更多相关内容:php - How should a model be structured in MVC?。
如果您使用的是MySQL数据库,则可以查看ON CASCADE DELETE
- 这将删除数据库中与该文章相关的所有图像。如果您不想在数据库端执行此操作,则可以查看Entity\Repository pattern,这可以通过使用Doctrine之类的ORM轻松实现。这将允许您为ON CASCADE DELETE
的php端版本注释您的“实体”(具有类成员,属性和一些getter / setter的域对象)。
您的控制器应该没有业务逻辑。在模型层中执行此操作 - 这意味着您的控制器将仅调用方法并从模型层获取响应。
总之,链接您的文章和图片(实体)在数据库中或通过ORM的注释(例如,学说),这样当您删除一个时,其他的将被删除
最后,如果这对您来说太过分了,请在执行文章(实体)删除(存储库)时将代码删除到同一文件中。
添加:如果图像路径未存储在数据库中,并且您确实要删除物理文件,则应使用{{3}编写外部服务(类)处理文件删除。删除文章的代码将调用此服务。这意味着您的代码将更易于测试,您可以抛出自定义异常以确定出现问题(例如无法删除图像)。
答案 1 :(得分:1)
ImageModel将是正确的地方。在你的ArticleModel中添加一个删除方法,它将循环遍历所有相关图像,调用delete方法然后删除自己。
<?php
class ArticleModel {
public function getImages() {
//fetch your images
return $images;
}
public function delete() {
foreach($this->getImages() as $image) {
$image->delete();
}
$this->delete();
}
答案 2 :(得分:0)
这完全取决于您和您的申请。
有些人选择瘦身模特,脂肪控制者,反之亦然。虽然大多数应用程序不需要额外的分离层,但也有人会把这样的东西放在库中。
我认为有时程序员会花更多时间考虑放置代码的位置,而不是实际编写代码。
我知道对于代码可读性等需要存在分离,但通常除了工作和显示逻辑之外的任何事情都是过度的。无论如何我的2个penneth。
我的个人意见。瘦的控制器。让它反弹交通,仅此而已。任何类似的东西都应该在你的模型中,或者如果你有图书馆。