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