Называется, услышал звон, да не знаю где он.
1. Сервисный слой ты превратил в контроллер.
Т.е. у тебя есть контроллер, а ты создал ещё один, т.к. где-то слышал, что нужны сервисы.
Но, сервисы не шлют ответы, это внутренний слой для отделения логики.
Ты можешь те методы вызвать через консоль, другие сервисы и т.п.
Там должен просто генерироваться return, а сам response уже в контроллере (чтоб контроллер своб функцию выполнял). Валидацию реквеста кстати тоже надо делать не в сервесе.
2. CategoryQuery - это вобще дичь дикая.
Ты опять создаёшь дубликат, потому что услышал о репозиториях, и даже интерфейс. Вот я угараю с людей, кто везде пихает интерфейсы. Интерфейсы нужны там, где они нужны. Где будет 2+ наследователей интерфейса.
Откуда у тебя тут наследники, если ты завязан на элокуент?
А ноги от индусов репозитаристов. Не нужен репозитарий, Query и интерфейсы при работе в элокуент. Он сам в себе это всё уже содержит и все повторяющиеся вещи обёрнуты уже. find, first, firstOrNew и т.д.
Так что используй элокуент и не переусложняй проект напрасно. Не надо делать сложно, делай просто.
3. CategoryAction.
Опять интерфейс...
Вот это Экшн по сути у тебя сервис. Тут ты имеено перенёс бизнес логику создания и редактирования и возвращаешь ответ данного метода. Вот удали свой CategoryAction и перенеси методы в сервис.