Роль модели и контроллера

Sufir

Я не волшебник, я только учусь
Столкнулся на днях с такой, достаточно простой вещью. Есть обращения от клиентов с аттачами. Обращения хранятся в одной таблице, информация об аттачах в другой. Классический one-to-many.

Возникла ситуация, когда мне нужно было доработать некоторые вещи. Саму систему разрабатывал другой человек, более опытный чем я. Как это реализовано: есть форма, контроллер и две моддели.
PHP:
// В контроллере происходит передача данных в модель 
$model->save( $form->getData(), $form->getFiles() );

// В модели обращений (метод save) происходит запись данных в таблицу
$this->query(...);
// и сохранение необходимой информации о файлах
$modelFiles->save(...);

// Что делает метод save модели modelFiles
// Внутри него (!) происходит:
// 1. Запись в б.д. информации о файле
// 2. Переименование и перемещение файлов из tmp в в нужную директорию
// 3. UPDATE с путём к файлу
// Мотивация такая "файлы - это тоже данные, с данными работает модель".
Я обычно все действия с файлами проделываю в контроллере (возможно стоит эту задачу переложить на форму?) и в модель передаю уже готовые данные.
PHP:
if ($form->validate()){
  if ( $model->save( $form->getData() ){
      $files = $form->getFiles();
      // перемещение, переименование
      $modelFiles->save( $files );
  }
}
Хотелось бы узнать мнение и точку зрения "бывалых". Как правильно подходить к решению такой, достаточно тривиальной, задачи? Кто за что должен отвечать и что делать (форма, контроллер и две моддели)?
 

Redjik

Джедай-мастер
Форма эта та же самая модель, отдаешь ей инфу, а она уже раскидывает по другим моделям...
 

Redjik

Джедай-мастер
да, так в yii устроено =)

не факт, что это хороший вариант, но мне нравится - логичный

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

Sufir

Я не волшебник, я только учусь
да, так в yii устроено =)

не факт, что это хороший вариант, но мне нравится - логичный

UPD. btw таким образом кстати ты сможешь делать какую-то элементарную валидацию файлов, и изменять логику поведения upload файлов, не притрагиваясь к контроллеру. (я говорю не про файлы в бд, а непосредственно сами аттачи - например пережать картинку)
Я согласен, что разумно передать задачу валидации и фильтрации (в данном случае "пережать картинку" или переименовать файл). Но, вот знание о моделях я бы предпочёл форме не давать. Пусть уж в контроллере берутся данные из формы и передаются в модель.

Собственно больше всего меня удивило то, что эти задачи были возложены на модель. Сам я всегда передаю в модель уже готовые данные и поэтому на поиски того места где происходит переименование ушло немало места, тем более, что $modelFiles->save() вызывается внутри $model->save(). Как-то мне кажется нагляднее и проще сориентироваться, когра открываешь Controller->addAction и там сразу видишь, что откуда и куда.
 

fixxxer

К.О.
Партнер клуба
Как-то мне кажется нагляднее и проще сориентироваться, когра открываешь Controller->addAction и там сразу видишь, что откуда и куда.
А если там еще и sql-запросы, и echo table tr td - так вообще сразу все видно, откуда и куда, нагляднее некуда!
 

Sufir

Я не волшебник, я только учусь
А если там еще и sql-запросы, и echo table tr td - так вообще сразу все видно, откуда и куда, нагляднее некуда!
К чему сарказм? Я-то не спорю, я - учусь. Скажи конкретно: проверку, перемещение и переименование файлов в данном конкретном случае должна делать модель?
 

fixxxer

К.О.
Партнер клуба
Вообще говоря, контроллер делать ничего не может, он только конфигурирует источники данных и связи. Вот завтра ты поменяешь локальное хранилище на какой-нибудь CDN, и?
 
  • Like
Реакции: Gas

Sufir

Я не волшебник, я только учусь
Ну, я и не имел в виду что я прямо в контроллере проделываю все действия. Но все их вызываю в контроллере. Я выше привёл пример. Просто принцип "смерть в яйце, яйцо в утке, утка..." как-то запутывает и пока доберёшься туда, ногу сломишь. Тогда уж вообще в отдельный класс выделить работу с файлами. Но в модель передавать готовые данные оттуда. А так получается из формы передаётся банально тот же $_FILES, просто обёрнутый методом и из одной модели вызывается другая, а в ней происходит перемещение и переименование... В общем это, наверное по неопытности, меня изрядно это запутало.
Модель, так модель...
 

Sufir

Я не волшебник, я только учусь
В частности при такой реализации как есть сейчас переодически происходит "пропажа файлов". Где-то по ходу происходит сбой и файл не перемещается, а фантомная запись в базе уже существует. Собственно из-за чего я и вынужден был лезть разбираться.
 

fixxxer

К.О.
Партнер клуба
Давай зайдем с другой стороны. Чтобы тебя не смущало.

Представь себе, что сначала ты решил хранить файлы в базе, в блобах. А потом решил переделать на файлы.

(А то, что у тебя что-то там пропадает - потому что надо в транзакции все оборачивать, и подчищать за собой, если что-то не так - еще один довод, почему это должно быть в модели).
 
Сверху