Реализация Selection Factory и Update Factory

Опубликовал read-php в 28.04.2011 Категория: Шаблоны баз данных PHP

Конечно, мы и раньше видели многие эти функции в шаблоне Data Mapper. Но в этой специализации мы можем воспользоваться преимуществами дополнительных функций, предоставляемых шаблоном Identity Object. Это способствует тому, чтобы сделать создание шаблонов более динамичным, просто потому, что возможное количество вариантов столь высоко.

На рис.  показаны простые шаблоны Selection Factory и Update Factory.

Шаблоны Selection Factory и Update Factory, опять-таки, обычно организованы так, что они соответствуют объектам приложения в системе (возможно, посредниками которых являются объекты Identity Object). По этой причине они также являются кандидатами для PersistenceFactory: шаблон Abstract Factory, который мы поддерживаем в качестве «универсального магазина» для инструментов персистентности объектов приложения. Вот реализация базового класса для объектов Update Factory.

Scr01 Реализация Selection Factory и Update Factoryabstract class woo_mapper UpdateFactory {

abstract function newUpdate( woo_domain_DomainObject $obj )

protected function buildStatement( $table, array $fields,

array $conditions=null ) {

$terms = array();

if ( ! is_null( $conditions ) ) {

$query = «UPDATE {$table} SET «;

$query = implode ( » = ?,», array_keys( $fields ) );

$terms = array_values( $fields );

$cond = array();

$query = » WHERE «;

foreach ( $conditions as $key=>$val ) { $cond[]=»$key = ?»;

$terms []=$val;

}

$query .= implode( » AND «, $cond );

} else {

$query = »INSERT INTO {Stable} («;

$query .= implode( «,», array_keys($fields) );

$query .= ») VALUES («;

foreach ( $fields as $name => $value ) {

$terms[]=$value;

$qs [] = ‘?’;

}

$query .= implode( «,», $qs );

$query .= «)»;

}

return array( $query# $terms );

}

}

i

С точки зрения интерфейса, единственное, что делает этот класс, — определяет метод newUpdate (). Он вернет массив, содержащий строку запроса, и список условий, которые нужно к ней применить. Метод buildstatement () выполняет общую работу по созданию запроса на обновление, причем работу, связанную с отдельными объектами приложения, выполняют дочерние классы. Методу buildstatement () передается имя таблицы, ассоциативный массив полей и их значений и аналогичный ассоциативный массив условий. Метод объединяет это для создания запроса. Вот конкретный класс UpdateFactory.

class woo_mapper_VenueUpdateFactory extends woo_mapper_UpdateFactory {

function newUpdate( woo_domain_DomainObject $obj ) {

$id = $obj->getId();

$cond =null;

$values['name'] = $obj->getName();

if ( $id > -1 ) {

$cond [ ''id' ] = $id;

}

return $this->buildStatement( «venue», $values, $cond );

}

}

В этой реализации я работаю непосредственно с DomainObject. В системах, где он может работать со многими объектами одновременно при обновлении, мы можем использовать Identity Object для определения набора, который хотим обработать. Это формирует основу массива $cond, который здесь содержит только данные id.

Метод newUpdate () извлекает данные, необходимые для генерации запроса. Это процесс, посредством которого данные объекта преобразуются в информацию базы данных.

Обратите внимание, что метод newUpdate () примет любой DomainObject. Дело в том, что все классы UpdateFactory метут совместно использовать интерфейс. Неплохо было бы добавить дополнительную проверку типа, чтобы гарантировать, что неправильный объект передан не будет.

Можем рассмотреть аналогичную структуру для классов SelectionFactory. Вот базовый класс.

abstract class woo_mapper_SelectionFactory {

abstract function newSelection( woo_mapper_IdentityObject $obj );

function buildWhere( woo_mapper_IdentityObject $obj ) {

if ( $obj->isVoid() ) {

return array( «», array() );

}

$compstrings = array () ;

$values = array();

foreach ( $obj->getComps() as $comp ) {

$compstrings[] = «{$comp['name']} {

$comp['operator']} ?»;

$values[] = $comp[1value1];

}

$where = «WHERE » , implode( » AND «, $compstrings );

return array( $where, $valyes );

}

}

И снова в классе определен общедоступный интерфейс в форме абстрактного класса. Метод newSelectionO ожидает IdentityObject. Также требует IdentityObject, но локальный по отношению к типу,— вспомогательный метод buildwhere (). Он использует метод IdentityObject: :getComps О , чтобы получить информацию, необходимую для создания конструкции WHERE, и построить-список значений, причем и то, и другое он возвращает в двухэлементном массиве.

Вот конкретный класс SelectionFactory.

class woo_mapper VenueSelectionFactory extends woo_mapper_SelectionFactory {

function newSelection( woo_mapper_IdentityObject $obj ) {

$fields = implode(    $obj->getObjectFields() );

$core = «SELECT $fields FROM venue»;

list( $where, $values ) = $this->buildwhere( $obj );

return array( $core.» «.$where, $values );

Он создает основу SQL-оператора, а затем вызывает метод buildwhere (), чтобы добавить условный оператор. На самом деле, единственное, что отличает один конкретный SelectionFactory от другого в моем тестовом коде, — это имя таблицы. Если я считаю, что в ближайшее время мне не понадобится уникальная специализация, то я уберу эти подклассы и буду использовать один конкретный класс SelectionFactory, который будет запрашивать имя таблицы из PersistenceFactory.

P.S. Хотите создать свой сайт, но не знаете как? Впрочем создание сайта не такой уж простой процесс, если у вас не получается то стоит обратиться к профессионалам.

Купить детское Питание Продажа, детский интернет магазин коломна. .
Комментариев нет