Где и кто должен делать валидацию?
1. Да, но не вручную, а через форму, которая за это отвечает - через RegistrationForm. Это же замечательный функционал, глупо его игнорировать. Один раз описываете правила валидации и форма работает.
2. Нет, они выполняют разные роли: форма занимается валидацией входящих данных, а AR-модель хранением. Я настоятельно не рекомендую тесно связывать формы с сущностями, т.е. наследовать одни от других. Их нужно держать раздельно: изменение AR-сущности User никогда не создаст вам проблем в формах, а изменение данных запроса и правил валидации формы RegistrationForm не навредит AR-сущности. Вы сможете менять их независимо друг от друга.
3. Вы должны передать провалидированные данные от контроллера в сервис. А вот как вы это сделаете полностью на ваше усмотрение: грубо массивом, особым value-объектом или предусмотреть передачу заполненной формы RegistrationForm в сервис, который сам сможет извлечь данные и выполнить работу. Важный момент: данные должны быть полностью проверены. Сервис при этом может даже не знать кто его использует, главное соблюдать публичный интерфейс.
Это хороший вопрос.
Когда форма сама занимается своей валидацией, то тут вариантов немного. Остаемся в контроллере.
Но по-хорошему, если отвлечься от конкретных велосиепедов, плотно увязывающих вывод ХТМЛ и валидацию входящих в модель данных, то в AccountService должен быть метод validate().
Соответственно, из любого места, где нам надо создать юзера, сначала дергаем validate(), а потом по результатам либо выдаем ошибку, либо дергаем create()