Должен ли я передавать модель в качестве инъекции зависимостей в шаблоне сопоставления данных или я должен объявить модель внутри класса сопоставления?
class Mapper { public function __construct( $model ) { $this->model = $model; } public function mapObject(array $row) { $this->model->setArticleId($row['article_id']) ; $this->model->setTitle($row['title']); $this->model->setDescription($row['description']); $this->model->setContent(isset($row['content']) ? $row['content'] : null); $this->model->setTemplate(isset($row['template']) ? $row['template']['path'] : null); return $this->model; } }
или:
class Mapper { public function mapObject(array $row) { $model = new Model; $model->setArticleId($row['article_id']) ; $model->setTitle($row['title']); $model->setDescription($row['description']); $model->setContent(isset($row['content']) ? $row['content'] : null); $model->setTemplate(isset($row['template']) ? $row['template']['path'] : null); return $model; } }
Какой из них правильный?
Mapper должен создавать объекты, будь то самостоятельно или с использованием фабрики. Внедрение «пустого» объекта, а затем всегда возвращает тот же объект, но с разными данными не имеет большого смысла.
Если вы вводите завод? Это хорошая идея для разделения создания объектов и использования объектов. Но IMHO dataperper попадает в категорию создания объекта, поэтому $model = new Model
идеально подходит.
Еще одно замечание: в первом примере вы должны ввести модель с недопустимым состоянием, то есть неинициализированным. Разрешение недопустимого состояния может привести к ошибкам, и этого следует избегать.
Фактически вы также допускаете недопустимое состояние во втором примере, по крайней мере теоретически. Я бы рекомендовал передавать необходимые данные через конструктор вместо setter, чтобы убедиться, что экземпляры Model
всегда действительны.