Я создаю свою собственную инфраструктуру MVC, просто чтобы узнать что-то новое и в последнее время столкнулся с этой проблемой. Допустим, у меня есть, как это:Создание класса со многими параметрами
Class Post extends \application\BaseClass
{
private $objPostDetail = null;
private $objAuthor = null
private $objCategory = null;
private $objType = null;
private $objTitlePicture = null;
public function __construct(PostDetail $objPostDetail,
Author $objAuthor,
Category $objCategory,
Type $objType,
TitlePicture $objTitlePicture)
{
$this->objPostDetail = $objPostDetail;
$this->objAuthor = $objAuthor;
$this->objCategory = $objCategory;
$this->objType = $objType;
$this->objTitlePicture = $objTitlePicture;
}
}
Тогда некоторые объекты, используемые в constuctor также может быть Comlex создать. Я получаю данные для него из класса PostDAO, который возвращает массив данных. Теперь проблема заключается в том, как создать новый экземпляр этого класса, поскольку он может быть во многих местах приложения. Я думаю, что создать везде $ objAuthor, затем $ objCategory и т. Д., Чтобы наконец создать $ objPost, не очень хорошо. Так что я создал то, что я думаю, что можно назвать завод:
Class PostFactory extends \application\BaseFactory
{
private $arrData = null;
private $objPostDetail = null;
private $objCategory = null;
private $objType = null;
private $objTitlePicture = null;
public function __construct($arrData)
{
$this->arrData = $arrData;
}
public function build()
{
$this->objPostDetail = $this->buildPostDetail();
$this->objCategory = $this->buildCategory();
$this->objType = $this->buildType();
$this->objTitlePicture = $this->buildTitlePicture();
return $this->buildPost();
}
private function buildPostDetail()
{
$objPostDetail = new \includes\classes\factories\PostDetailFactory($this->arrData);
return $objPostDetail->build();
}
private function buildCategory()
{
$objCategory = new \includes\classes\factories\CategoryFactory($this->arrData);
return $objCategory->build();
}
private function buildType()
{
$objType = new \includes\classes\factories\TypeFactory($this->arrData);
return $objType->build();
}
private function buildTitlePicture()
{
$objTitlePicture = new \includes\classes\factories\TitlePictureFactory($this->arrData);
return $objTitlePicture->build();
}
private function buildPost()
{
return new \includes\classes\Post($this->objPostDetail, $this->objCategory,
$this->objType, $this->objTitlePicture);
}
}
Это работает хорошо, но мне не нравится, что у меня есть в два раза больше классов, и я не знаю, какие параметры мне нужно сделать для инстанцирования Post поскольку я передаю массив классу Factory (потому что я хочу избежать многих параметров в конструкторе). Итак, мой вопрос - как лучше всего создать экземпляр класса?
Заранее благодарим за любую помощь.
Моя проблема заключается в том, как создать объект после получения данных из модели, я знаю, как передать его модели, потому что обычно это несколько параметров. – Petr
Хорошо, тогда применяется то же самое решение. Вы уже знаете, что получаете взамен от модели. Используйте его в стиле имен, как описано в моем сообщении в блоге. Просто назовите аргументы конструктора так же, как и модель, и он будет автоматически передан конструктору;) – Harold