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