Как реализовать принцип единственной обязанности?
Это хороший вопрос.
Начнем с того, что согласно принципу единственной обязанности в контроллере никакого добавления в БД быть не должно.
Контроллер, вообще, это самая ничтожная часть веб-приложения. Его задача - получить данные из НТТР запроса и передать их в модель и потом передать ответ браузеру. Тупо "подай-принеси".
А вот модель уже и должна записывать в базу, проверять валидность данных и совершать все прочие телодвижения. 
чтобы сформировать абстракцию, надо знать задачу не на уровне огрызка туманной фразы, "ряд дополнительных методов и запросов, нужных для формирования фильтров в магазине". Что за запросы? При чем здесь фильтры вообще? Как реализован интерфейс с БД - это ОРМ, прямая работа с БД, что-то ещё?
Судя по информации из комментов, тут пригодится хелпер сервис. Отдельный класс, который реализует добавление товара. 
То есть контроллер дергает валидатор и смотрит ответ.
Если есть ошибка валидации, то показывает форму обратно
Если ошибок нет - дергает сервис на добавление товара и потом редиректит куда-нибудь
А сервис уже выполняет все те действия, которые необходимы при добавлении товара. 
В принципе, валидацию тоже можно в сервис, но тогда надо продумать обратную коммуникацию с контроллером.
Самое главное что тут надо понимать - что Модель - это не интерфейс по взаимодействию с одного класса с одной таблицей в БД (как это до сих пор считается большинством), а вся совокупность логики - классов и модулей - реализующих бизнес-логику приложения. То есть, в модель входят и мапперы, и сервисы, и репозитории и все что угодно - кроме интерфейсов взаимодействия с внешним миром, таких как контроллеры.
Контроллер дергает сервис у которого есть методы для работы с товаром.
ProductService->addProduct(...)
если в этот ProductService сделаете добавление/удаление комментариев к продукту то это и есть нарушение принципа единственной ответственности