За последние 24 часа нас посетили 20703 программиста и 1121 робот. Сейчас ищут 320 программистов ...

Архитектура приложения

Тема в разделе "PHP для профи", создана пользователем ded100let, 25 окт 2018.

  1. ded100let

    ded100let Новичок

    С нами с:
    11 сен 2018
    Сообщения:
    8
    Симпатии:
    0
    Доброго времени суток,

    Столкнулся со следующей проблемой. При создании записи (допустим Post) в БД, нужно реализовать AJAX загрузку файлов. Так-как запись еще не создана, "привязывать" каждый файл в БД не к чему.

    Решил эту проблему передачей ключа при загрузке файлов, который генерируется каждый раз при показе формы и сохраняется в БД. При загрузке файлов сохраняю информацию о файле + отношение (id) записи с ключом. Когда запись (Post) сохранилась, выдергиваю ключ из запроса и "привязываю" все файлы в БД с таким же ключом к созданному Post.

    Проблема заключается в зависимостях контроллера (в данном случае) от трех сервисов PostService, TokenService, PostFileService

    PostService - работает с сущностью Post (создать, обновить, удалить)
    TokenService - работает с сущностью Token (создать, удалить, найти)
    PostFileService - работает с сущностью PostFile (сохранить на диске загруженный файл, создать запись, удалить запись и т.д).

    Вызовы всех этих сервисов нагружают контроллер и логика "размазывается".

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

    Есть ли смысл добавить еще один слой между контроллером и этими тремя сервисами и держать в нем логику, которая находится сейчас в контролере? Как обзывают такой слой?

    Может поделитесь своими подходами в подобных случаях?

    Благодарю заранее!
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я вот сейчас тоже самое делаю))
    просто при нажатии кнопки СОЗДАТЬ сразу создаю запись в БД)) и все))
     
  3. ded100let

    ded100let Новичок

    С нами с:
    11 сен 2018
    Сообщения:
    8
    Симпатии:
    0
    Тут скорее вопрос в том как лучше сделать :)
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    @ded100let у тебя всё хорошо. Не парься.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    Вам на него и ответили. При создании (сначала) создавайте. А потом уже наполняйте – редирект на действие edit. У нас все REST-приложения так работают, даже самые простые.
    --- Добавлено ---
    P.S. Помимо кнопки «Создать» нужно максимум одно т/поле для явного задания id/слага и т.п. «Коллекция», в кот. создается объект, определяется адресом. Если разместить кнопку на странице коллекции (страницах коллекции при использовании пагинации), то – тек. адресом страницы.
     
    Алекс8 нравится это.
  6. ded100let

    ded100let Новичок

    С нами с:
    11 сен 2018
    Сообщения:
    8
    Симпатии:
    0
    ход мысли понял. Спасибо за доходчивое объяснение!

    Меня так же интересовала тема размещения бизнес логики. Т.е. для постов у меня есть сервис, в который передаю репозиторий для постов. Для файлов поста такой же сервис + слой для работы с файловой системой. В данный момент при создании записи я поочередно вызываю методы различных сервисов в контроллере. $this->posts->create($data), $this->files->create($data) и так далее. Вопрос как лучше работать с этими сервисами, например, в контроллере. Первый вариант тянуть оба сервиса в контроллер и вызывать нужные методы как это делаю сейчас. Второй захардкодить в сервис постов зависимость от сервиса для файлов, тогда в контроллере можно будет вызывать лишь один сервис типа $this->service->create($data). Проблема первого - размывается часть бизнес логики по контроллеру, во втором сервис нагружаю еще одной зависимостью.