Но по-хорошему, мне ведь нужно отдать данные об авторе, во View, тоже как объект? Т.е. свойство author_id должно быть объектом author в котором присутствует id, имя автора, аватар и т.д.. На каком этапе нужно получать с помощью author_id информацию об авторе поста?
Entity это класс для работы с БД или другим хранилищем данных.
<?php
//Entity
class Entity{
use ObjectToArrayTrait;
protected $id;
public function setId($id){
$this->id = $id;
return $this;
}
public function getId(){
return $this->id;
}
}
//Validation
class UserValidation extend Validation{
protected $user;
public function __construct(User $user){
$this->user = $user;
}
public function isValid(){
//validation logic
return true
}
}
//User
class User extends Entity
{
protected $email;
protected $name;
public function __construct(Email $email, $name)
{
$this
->setEmail($email)
->setName($name);
}
//даже если изменим через свойство другой класс не пройдет
public function setEmail(Email $email){
$this->email = $email;
return $this;
}
public function setName($name){
$this->name = $name;
return $this;
}
public function getEmail(){
return $this->email;
}
public function getName(){
return $this->name;
}
}
//UserRepo
class UserRepo{
protected $db;
function __construct(ActiveRecord $db){
$this->db = $db;
}
//получаем User
public function getUserById($id){
$row = $this->db->getRow("users")->where("id",$id);
$user
= (new User(new Email($row["email"])))
->setName($row["name"]);
return $user;
}
//сохраняем
public function save(User $user){
if($user->getId()>0){
$this->db->update("users",$user->toArray())->where("id",$user->getId());
}
else{
$this->db->insert("users",$user->toArray());
}
}
}
//принимаем пост
$post = $request->all();
//создаем объект
$user = (new User(new Email($post["email"])))->setName($post["name"]);
//валидируем
$validation = new UserValidation($user);
//сохраняем
if(!$validation->isValid()){
throw new ValidationError($validation->getErrors());
}
else{
$userRepo->save($user);
}
class User{
protected $email;
protected $lastAuthDate;
function __construct($email){
$this->email = $email;
}
}
Первый вариант, следущая версия выпущена, но до тестировщика не добралась