В общем пытаюсь освоить Di, сервисы, репозитории - правильную архитектуру. Делаю тренировочный проект, но возникли вопросы:
Раньше была модель User extend ActiveRecord, и была модель RegistrationForm extend Model
При получении данных, в экшене создавал вторую модель и выполнял метод валидации: $form->load($this->getRequest()->post()) && $form->validate(), далее вызывал метод регистрации. В общем-то все, все это можно было увидеть в примерах yii2.
class AccountController extend BaseController
{
public function actionRegistration()
{
$form = new RegistrationForm($this->getRequest()->post());
if ($form->validate()) {
$user = $form->registration();
return $user->id;
} else {
throw new BadRequestHttpException(implode(';, $registration->getFirstErrors()));
}
}
}
Сейчас логику регистрации вынес в сервис AccountService, работу с моделью User (поиск, создание, сохранение..) вынес в UserRepository. Сама модель ничего не содержит кроме rules. Но вот куда теперь девать RegistrationForm в которой была валидация пришедших данных?
1) В контроллере валидировать?
$email = Yii::$app->getRequest()->post['email'];
if (!EmailValidator::validate($email)) {
throw new BadRequestHttpException('Wrong email');
}
2) Оставить RegistrationForm, но сделать унаследованной от User c переопределенными rules. Передавать заполненную модель в сервис и в сервисе вызывать валидацию. Так пока и сделал:
public function actionRegistration()
{
$registrationForm = new RegistrationForm($this->getRequest()->post());
$user = $this->accountService->registrationUser($registrationForm);
if ($user) {
return $this->accountService->generateToken($user)->token;
} else {
throw new BadRequestHttpException(implode('; ', $registrationForm->getFirstErrors()));
}
}
3) Передавать в сервис массив пришедших данных и там уже каким-нибудь способом валидировать.
В общем хочу понять как правильно делать, где-что должно лежать и запускаться.