Используем аналогию.
Музыкант может быть абстрагирован с помощью интерфейсов, жанр, к которому принадлежит музыкант, может быть классом abstrac, который определяет некоторые глобальные правила интерпретации и каждый музыкант, который играет, может быть смоделирован с конкретным классом.
Если вы слушатель музыкальной работы, у вас есть ссылка на сценарий, например «Fuga и Tocata» Баха и каждый музыкант, который его выполняет, делает это полиморфно по-своему.
Это всего лишь пример возможного дизайна (на Java):
public interface Musician {
public void play(Work work);
}
public interface Work {
public String getScript();
}
public class FugaAndToccata implements Work {
public String getScript() {
return Bach.getFugaAndToccataScript();
}
}
public class AnnHalloway implements Musician {
public void play(Work work) {
// plays in her own style, strict, disciplined
String script = work.getScript()
}
}
public class VictorBorga implements Musician {
public void play(Work work) {
// goofing while playing with superb style
String script = work.getScript()
}
}
public class Listener {
public void main(String[] args) {
Musician musician;
if (args!=null && args.length > 0 && args[0].equals("C")) {
musician = new AnnHalloway();
} else {
musician = new TerryGilliam();
}
musician.play(new FugaAndToccata());
}
Один из способов достижения вашей цели:
- поддерживать контроллер в чистоте только с одной моделью.
$model = new SignupForm();
- добавить дополнительные поля для профиля пользователя как свойство SignupForm.php
и ввести необходимые правила для их проверки.
public $fullname;
public $dateOfBirth;
public $address;
...
public function rules()
{
...
[['fullname', 'dateOfBirth', 'address'], 'required'],
}
- поставить логику для сохранения профиля пользователя внутри функции signup()
.
public function signup()
{
if (!$this->validate()) {
return null;
}
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$userProfile = new UserProfile();
$userProfile->fullname = $this->fullname;
$userProfile->dateOfBirth = $this->dateOfBirth;
$userProfile->address = $this->address;
return $user->save() && ($userProfile->userId = $user->id) !== null && $userProfile->save() ? $user : null;
}
- наконец, добавьте поля профиля пользователя в поле зрения.