Intereting Posts
Как реализовать систему вложенных комментариев? Замена одиночной обратной косой черты двойной обратной косой чертой в php Ошибка электронной почты php filter_var PHP Regex для нескольких символов Unicode 324 Ошибка ответа в Ubuntu 10.04, но работает в Windows Интеграция Node.js с Symfony2 или PHP Изменение разрешений файла, загруженного PHP Простая система входа с использованием CodeIgniter, возвращающая 404 при входе в систему Подключить API календаря Google, получить пустой массив с помощью php Когда вы автоматически создаете субдомены при регистрации пользователей, это создает новый веб-сайт или дает внешний вид веб-сайта? pdo_oci make не работает Как заменить возврат каретки Как определить, удалить и перенаправить URL-адреса с # в конце в PHP? PHP: вызов метода экземпляра через синтаксис ClassName :: method приводит к статическому вызову? Как мне зашифровать этот пароль с помощью MD5 с помощью PHP?

Data Mapper – следует ли использовать инъекцию зависимостей?

Должен ли я передавать модель в качестве инъекции зависимостей в шаблоне сопоставления данных или я должен объявить модель внутри класса сопоставления?

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 всегда действительны.