2014-01-12 2 views
1

Я делаю веб-приложение с Laravel 4, и в этом приложении у меня есть некоторые статьи. Каждая статья имеет несколько изображений. Теперь, когда я хочу удалить одну статью, мне также нужно удалить изображение, принадлежащее этой статье. Мне интересно, где я должен поместить метод удаления изображения. Я мог бы поместить его в контроллер товара, контроллер изображения или модель изображения.Удалить метод файла в контроллере или модели?

Поскольку я также должен иметь возможность удалять изображения индивидуально, не касаясь статьи, было бы бесполезно, чтобы контроллер статьи удалял файлы. Итак, куда его поместить? Модель изображения или Контроллер изображений? Я думаю, модель изображения.

Редактировать: Я использую Laravel ORM, и все статьи связаны с их изображениями. Удаление одной статьи также удаляет все изображения из БД. Мне просто интересно, куда следует удалять файлы из файловой системы.

ответ

4

Прежде всего, модель - это слой. Это не плюрализованное - вы можете узнать об этом подробнее: php - How should a model be structured in MVC?.

Если вы используете базу данных MySQL, вы можете посмотреть ON CASCADE DELETE - что бы удалить все изображения в базе данных, связанные с этой статьей. Если вы не хотите делать это на стороне db, вы можете посмотреть на Entity\Repository pattern, и этого легко достичь с помощью ORM, например Doctrine. Это позволит вам аннотировать ваши «объекты» (объекты домена с членами класса, свойствами и несколькими геттерами/сеттерами) для версии php-side ON CASCADE DELETE.

Ваши контроллеры должны делать нет бизнес-логики. Сделайте это в своем слое модели - это означает, что ваш контроллер будет использовать только методы вызова и получать ответы с уровня модели.

В заключение ссылка ваши статьи и изображения (лица) либо в БД или с помощью аннотаций ОРМ (в доктрине, например), так что при удалении одного, остальные будут удалены для вас.

И, наконец, если это слишком много для вас, поместите код, чтобы удалить изображения в том же файле, что и вы делаете удаление (репозиторий) статьи (объекта).


Дополнение: Если пути изображения не сохраняются в БД, и вы буквально хотите удалить физический файл, вы должны писать внешний сервис (класс) с Single Responsibility обращения файла удаления. Затем код, удаляющий статью, вызовет эту службу. Это означает, что ваш код будет более подвержен проверке, и вы можете бросить пользовательские исключения, чтобы определить, что что-то пошло не так (например, изображение не может быть удалено).

1

ImageModel будет правильным местом. Добавьте метод удаления в свой ArticleModel, в котором он будет перебирать все связанные изображения, вызывать метод удаления и впоследствии удалять себя.

<?php 
    class ArticleModel { 
     public function getImages() { 
      //fetch your images 
      return $images; 
     } 

     public function delete() { 
      foreach($this->getImages() as $image) { 
       $image->delete(); 
      } 
      $this->delete(); 
     } 
+0

это то, о чем я думал .. – Kris

0

Это полностью зависит от вас и вашего приложения.

Есть те, кто идет для тощей модели, регулятора жира и наоборот. Есть также люди, которые бы поместили подобные вещи в библиотеку, хотя большинство приложений не требуют дополнительного слоя разделения.

Я думаю, что иногда программисты тратят больше времени на размышления о том, куда положить код, а не писать код.

Я знаю, что разделение должно существовать для чтения кода и т. Д., Но часто что-то большее, чем разделение выработок и логика отображения, является излишним. Мои 2 пенни в любом случае.

Мое личное мнение. Тощий контроллер. Пусть это отскакивает вокруг, ничего больше. Все, что должно быть в вашей модели, или если у вас есть библиотека.

Смежные вопросы