Доброго времени суток, Столкнулся со следующей проблемой. При создании записи (допустим Post) в БД, нужно реализовать AJAX загрузку файлов. Так-как запись еще не создана, "привязывать" каждый файл в БД не к чему. Решил эту проблему передачей ключа при загрузке файлов, который генерируется каждый раз при показе формы и сохраняется в БД. При загрузке файлов сохраняю информацию о файле + отношение (id) записи с ключом. Когда запись (Post) сохранилась, выдергиваю ключ из запроса и "привязываю" все файлы в БД с таким же ключом к созданному Post. Проблема заключается в зависимостях контроллера (в данном случае) от трех сервисов PostService, TokenService, PostFileService PostService - работает с сущностью Post (создать, обновить, удалить) TokenService - работает с сущностью Token (создать, удалить, найти) PostFileService - работает с сущностью PostFile (сохранить на диске загруженный файл, создать запись, удалить запись и т.д). Вызовы всех этих сервисов нагружают контроллер и логика "размазывается". Если, в будущем, расширять приложение и добавить новый контроллер, который будет обрабатывать RESTful запросы, то придется и там "тянуть" все зависимости и буквально копировать логику, которая сейчас находится в контроллере. Есть ли смысл добавить еще один слой между контроллером и этими тремя сервисами и держать в нем логику, которая находится сейчас в контролере? Как обзывают такой слой? Может поделитесь своими подходами в подобных случаях? Благодарю заранее!
Вам на него и ответили. При создании (сначала) создавайте. А потом уже наполняйте – редирект на действие edit. У нас все REST-приложения так работают, даже самые простые. --- Добавлено --- P.S. Помимо кнопки «Создать» нужно максимум одно т/поле для явного задания id/слага и т.п. «Коллекция», в кот. создается объект, определяется адресом. Если разместить кнопку на странице коллекции (страницах коллекции при использовании пагинации), то – тек. адресом страницы.
ход мысли понял. Спасибо за доходчивое объяснение! Меня так же интересовала тема размещения бизнес логики. Т.е. для постов у меня есть сервис, в который передаю репозиторий для постов. Для файлов поста такой же сервис + слой для работы с файловой системой. В данный момент при создании записи я поочередно вызываю методы различных сервисов в контроллере. $this->posts->create($data), $this->files->create($data) и так далее. Вопрос как лучше работать с этими сервисами, например, в контроллере. Первый вариант тянуть оба сервиса в контроллер и вызывать нужные методы как это делаю сейчас. Второй захардкодить в сервис постов зависимость от сервиса для файлов, тогда в контроллере можно будет вызывать лишь один сервис типа $this->service->create($data). Проблема первого - размывается часть бизнес логики по контроллеру, во втором сервис нагружаю еще одной зависимостью.