Я пытаюсь создать приложение PHP, используя шаблон MVC. Я новичок в MVC и не использую фреймворк, так как хочу глубже понять основные процессы MVC. У меня есть вопрос, касающийся моделей, представления JSON и внешних ключей. Допустим, у меня есть две модели:
Class User {
public $id;
public $name;
public $gender_id;
}
Class Gender{
public $id;
public $description
}
Пользователь-> пол_идентификатора является внешним ключом таблицы Genders-> id.
Мой URI — / users / 1, который должен возвращать следующий JSON:
{"id":1,"name":"john","gender":"male"}
Обязан ли контроллер знать отношения модели и извлекать необходимые данные (пользователь & гендерная модель), которая затем будет передана в представление, которое будет выводить JSON? Или ассоциация должна быть определена как-то в модели пользователя? Половое описание является описательным атрибутом, но каким-то образом оно должно быть включено в представление «Пользователи».
С уважением
Контроллер не обязан извлекать постоянные данные, для этого у вас должен быть Mapper. Есть много ответов, которые подробно объясняют функции моделей и контроллеров (этот очень хороший).
Class User
{
private $id;
private $name;
private $gender;
public function __construct($id, $name, Gender $gender)
{
$this->id = $id;
$this->name = $name;
$this->gender = $gender;
}
public function getId()
{
return $this->id;
}
... and other getter/setters
public function setGender(Gender $gender)
{
$this->gender = $gender;
}
public function getGender()
{
return $this->gender;
}
}
А твой пол класс таким образом:
Class Gender
{
private $id;
private $description;
public function ($id, $description)
{
$this->id = $id;
$this->description = $description;
}
//with getters and setters
}
Вы можете приступить к созданиюService
‘(из-за отсутствия лучшего слова), чтобы вернуть вашу строку JSON вашего User
объект. Обратите внимание, что этоService
‘считается частью вашей модели (видеть это)
Class UserToJSON
{
public function convert(User $user)
{
$user_arr = array();
$user_arr['id'] = $user->id;
$user_arr['name'] = $user->name;
$user_arr['gender'] = $user->gender->getDescription();
return json_encode($user_arr, true);
}
}
Со всем этим на месте (при условии, что у вас есть действительный User
объект), вы можете легко получить свой JSON для пользователя, например, так:
$user = new User(1, "name", new Gender(1, "female"));
print (new UserToJSON())->convert($user);
Других решений пока нет …