На что обычно похож Картопостроитель Данных?

Мне назвали таблицу Cat, и названный класс PHP Cat. Теперь я хочу сделать a CatDataMapper класс, так, чтобы Cat extends CatDataMapper.

Я хочу, чтобы тот класс Картопостроителя Данных обеспечил основную функциональность для того, чтобы сделать ORM, и для создания, редактирования и удаления CAT.

С этой целью возможно, кто-то, кто знает этот шаблон очень хорошо, мог дать мне некоторый полезный совет? Я чувствую, что было бы немного слишком просто просто обеспечить некоторые функции как обновление (), удалить (), сохранить ().

Я понимаю, что Картопостроитель Данных имеет эту проблему: Сначала Вы создаете экземпляр CAT, затем инициализируете все переменные как имя, furColor, eyeColor, purrSound, meowSound, операторы, и т.д. и после того, как все настраивается, Вы называете сохранение () функцией, которая наследована от CatDataMapper. Это было просто ;) Но теперь, настоящая проблема: Вы запрашиваете базу данных для кошек и возвращаете простой скучный набор результатов с большим количеством данных кошек.

Функции PDO некоторая возможность ORM создать экземпляры CAT. Позволяет говорят, что я использую это, или позволяет, даже говорят, что у меня есть mapDataset () функция, которая берет ассоциативный массив. Однако, как только я получил свой объект CAT от набора данных, у меня есть избыточные данные. В то же время двадцать пользователей могли взять те же данные кошки из базы данных и отредактировать объект кошки, т.е. переименовать кошку и сохранить () его, в то время как другой пользователь все еще вещи об установке другого furColor. Когда все они сохраняют их редактирования, все испорчено.

Допустите ошибку... хорошо, для хранения этого вопроса действительно коротким: что такое хорошая практика здесь?

8
задан Frank Krueger 28 December 2009 в 18:12
поделиться

5 ответов

Из DataMapper в PoEA

Data Mapper - это уровень программного обеспечения. который разделяет объекты в памяти из базы данных. Его ответственность заключается в передаче данных между двумя а также изолировать их от каждого Другое. С помощью Data Mapper внутрипамятная память объекты не должны знать даже о том, что есть база данных присутствует; им не нужен SQL код интерфейса, и уж точно нет знание схемы базы данных. (The схема базы данных всегда в курсе объекты, которые его используют). Так как это форма Картограф (473), Картограф данных сам по себе даже неизвестен домену Таким образом, Cat не должна расширять CatDataMapper, потому что это создаст связь и привяжет Cat к слою Persistence. Если вы хотите иметь возможность обрабатывать персистентность с помощью Cats таким образом, посмотрите ActiveRecord или любую другую модель архитектуры источника данных.

Обычно вы используете DataMapper при работе с моделью домена. Простой DataMapper просто сопоставляет таблицу базы данных с эквивалентным классом in-memory на основе "от поля к полю". Однако, когда возникает необходимость в DataMapper, у вас обычно не будет таких простых связей. Таблицы не будут сопоставлять 1:1 с вашими объектами. Вместо этого несколько таблиц могут быть сформированы в один Object Aggregate и наоборот. Следовательно, реализация только методов CRUD, может легко стать довольно сложной задачей.

Кроме того, это один из более сложных паттернов (охватывает 15 страниц в PoEA), часто используемый в комбинации с Repository pattern среди прочих. Загляните в соответствующую колонку вопросов в правой части этой страницы для поиска похожих вопросов.

Что касается вашего вопроса о множестве пользователей, редактирующих один и тот же Cat, то это обычная проблема, называемая Конкурентоспособность. Одним из решений этой проблемы было бы блокирование строки , в то время как кто-то редактирует ее. Но как и все остальное, это может привести к другим проблемам .

.
12
ответ дан 5 December 2019 в 10:03
поделиться

Если вы полагаетесь на ORM как Doctrine или Propel, то основной принцип заключается в создании статического класса, который будет получать фактические данные из базы данных (например, Propel создаст CatPeer), а результаты, получаемые классом Peer, будут "гидратированы" в объекты Cat.

Процесс гидратации - это процесс преобразования "простого скучного" набора результатов MySQL в хорошие объекты с геттерами и сеттерами.

Так что для извлечения вы бы использовали что-то вроде CatPeer::doSelect(). Затем для нового объекта вы сначала выполните его инстанцирование (или извлечение и экземпляр из БД): $cat = new Cat();

Вставка будет так же проста, как и сделать: $cat->save(); Это было бы эквивалентно вставке (или обновлению, если объект уже существует в db... ORM должен знать, как сделать разницу между новыми и существующими объектами, используя, например, наличие ort отсутствие первичного ключа).

2
ответ дан 5 December 2019 в 10:03
поделиться

Реализация Data Mapper очень сложна в PHP < 5.3, так как вы не можете читать/записывать защищенные/частные поля. У вас есть несколько вариантов при загрузке и сохранении объектов:

  1. Используйте какой-нибудь обходной путь, например, сериализация объекта, изменение его строкового представления и возвращение его обратно с помощью unerialize
  2. Сделайте все поля общедоступными
  3. Сохраняйте их приватными/защищенными и пишите мутаторы/аксессоры для каждого из них

Первый метод имеет возможность взлома с новым релизом, и является очень грубым взломом, второй считается (очень) плохой практикой.

Третий вариант также считается плохой практикой, так как не следует предоставлять геттеры/сеттеры для всех ваших полей, а только для тех, которые в них нуждаются. Ваша модель становится "поврежденной" с точки зрения чистого DDD (domain driven design), так как она содержит методы, которые нужны только из-за механизма персистентности. Это также означает, что теперь вы должны описать еще одно отображение для полей -> методов установки, рядом с полями -> столбцами таблицы.

PHP 5.3 вводит возможность доступа/изменения всех типов полей, используя отражение:

http://hu2.php.net/manual/en/reflectionproperty.setaccessible.php

С помощью этого вы можете достичь истинного отображения данных, так как необходимость в предоставлении мутаторов для всех полей прекратилась.

.
2
ответ дан 5 December 2019 в 10:03
поделиться

PDO имеет некоторые возможности ORM, чтобы создавать кошачьи экземпляры. Допустим, я использую или даже скажем, что у меня есть mapDataset(), которая принимает функцию ассоциативный массив. Однако, как только Я взял свой кошачий объект из набора данных, я имеют избыточные данные. В то же время, двадцать пользователей могли бы подхватить то же самое кошачьи данные из базы данных и редактирование кошачий объект, т.е. переименовать кошку, и сохранить его, в то время как другой пользователь всё ещё что-то насчёт того, чтобы свести счёты с жизнью FurColor. Когда все они спасают своих Для того, чтобы отслеживать состояние данных, как правило, используется IdentityMap и/или UnitOfWork, отслеживаются все различные операции с отображаемыми объектами.... и в конце цикла запроса все операции будут выполнены.

1
ответ дан 5 December 2019 в 10:03
поделиться

держите ответ коротким: У вас есть экземпляр Кэт. (Может, он расширяет CatDbMapper, или Cat3rdpartycatstoreMapper). Вы звоните:

$cats = $cat_model->getBlueEyedCats();
//then you get an array of Cat objects, in the $cats array

Не зная, что вы используете, вы можете взглянуть на php-фреймворк для лучшего понимания.

0
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: