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