Содержание


TableGateway


TableGateway, ЗФ2, Zend Framework 2, ZF2, DB




TableGateway предназначен для обеспечения объекта, который представляет собой таблицу в БД и методов этого объекта, реализующих наиболее часто используемые операции работы с БД. Интерфейс выглядит так:

interface Zend\Db\TableGateway\TableGatewayInterface
{
    public function getTable();
    public function select($where = null);
    public function insert($set);
    public function update($set, $where = null);
    public function delete($where);
}

Есть всего две наиболее часто используемых реализации интерфейса TableGatewayInterface: AbstractTableGateway и TableGateway.

 

AbstractTableGateway является абстрактной базовой реализацией, которая обеспечивает работу select(), insert(), update(), delete() и дополнительное API для выполнения этих же задач с явными SQL объектами: selectWith(), insertWith(), updateWith() and deleteWith(). Так же есть API «Feature», которое позволяет расширять базовую реализацию TableGateway без необходимости создания расширенного класса с этой функциональностью.

 

TableGateway является частной реализацией и просто предоставляет разумный конструктор  для класса AbstractTableGateway.

 

 Основы использования

 

Самый быстрый способ использования -  это настройка конкретной реализации TableGateway.

 

Его API:

class TableGateway extends AbstractTableGateway
{
     public $lastInsertValue;
     public $table;
     public $adapter;
 
     public function __construct($table, Adapter $adapter, $features = null, ResultSet $resultSetPrototype = null, Sql $sql = null)
 
     /** Inherited from AbstractTableGateway */
 
    public function isInitialized();
    public function initialize();
    public function getTable();
    public function getAdapter();
    public function getColumns();
    public function getFeatureSet();
    public function getResultSetPrototype();
    public function getSql();
    public function select($where = null);
    public function selectWith(Select $select);
    public function insert($set);
    public function insertWith(Insert $insert);
    public function update($set, $where = null);
    public function updateWith(Update $update);
    public function delete($where);
    public function deleteWith(Delete $delete);
    public function getLastInsertValue();
 
}

TableGateway использует конструктор для внедрения зависимостей и настроек в экземпляр. Что бы получить рабочий объект TableGateway необходимо передать имя таблицы и адаптер БД Adapter.

 

В самом простом случае такая реализация не знает о структуре таблицы или метаданных, и когда выполняется, например,  select() -  получаем простой объект ResultSet на основе данных Adapter.

use Zend\Db\TableGateway\TableGateway;
$projectTable = new TableGateway('project', $adapter);
$rowset = $projectTable->select(array('type' => 'PHP'));
 
echo 'Projects of type PHP: ';
foreach ($rowset as $projectRow) {
     echo $projectRow['name'] . PHP_EOL;
}
 
// or, when expecting a single row:
$artistTable = new TableGateway('artist', $adapter);
$rowset = $artistTable->select(array('id' => 2));
$artistRow = $rowset->current();
 
var_dump($artistRow);

Метод select() принимает те же аргументы, что и Zend\Db\Sql\Select::where(), с той лишь разницей, что возможно использование замыкания, которое в свою очередь будет передано в объект Select для создания запроса на выборку (SELECT). Пример такой реализации:

use Zend\Db\TableGateway\TableGateway;
use Zend\Db\SqlSelect;
$artistTable = new TableGateway('artist', $adapter);
 
// search for at most 2 artists who's name starts with Brit, ascending
$rowset = $artistTable->select(function (Select $select) {
     $select->where->like('name', 'Brit%');
     $select->order('name ASC')->limit(2);
});

Особенности TableGateway

 

APIFeatures (особенности) позволяет расширять функциональность базового объекта TableGateway без полиморфного расширения базового класса.

 

Особенности необходимо инъекцировать в объект TableGateway через конструктор. Это возмоно сделать тремя различными способами:

1) Один объект Feature

2) Объект FeatureSet

3)  Массив объектов Feature

 

В Zend\Db уже рализован базовый набор особенностей для TableGateway.

 

GlobalAdapterFeature позволяет использовать глобальные/статические адаптеры без необходимости инъекцировать их в объект TableGateway. Особо полезно при расширении реализации AbstractTableGateway.

class MyTableGateway extends AbstractTableGateway
{
   public function __construct()
   {
           $this->table = 'my_table';
           $this->featureSet = new Feature\FeatureSet();
           $this->featureSet->addFeature(new FeatureGlobal\AdapterFeature());
           $this->initialize();
   }
}
 
// elsewhere in code, in a bootstrap
Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);
 
// in a controller, or model somewhere
$table = new MyTableGateway(); // adapter is statially loaded

MasterSlaveFeature – позволяет использовать мастер-адаптер для insert(), update(), delete() при использовании обычного адаптера для select().

$table = new TableGateway('artist', $adapter, new Feature\MasterSlaveFeature($slaveAdapter));

MetadataFeature – реализует возможность заполнения TableGateway колонкой информации из объекта Metadata. Информация о первичном ключе будет храниться  в RowGatewayFeature.

$table = new TableGateway('artist', $adapter, new Feature\MeatadataFeature());

EventFeature – позволяет использовать TableGateway в связке с Zend\EventManager для обеспечения возможности подписываться на различные события в течении жизненного цикла TableGateway.
$table = new TableGateway('artist', $adapter, new Feature\EventFeature($eventManagerInstance));

RowGatewayFeature - select() можетвернутьобъект ResultSet послеитерирования. (that upon iteration will)

$table = new TableGateway('artist', $adapter, new Feature\RowGatewayFeature('id'));
$results = $table->select(array('id' => 2));
 
$artistRow = $results->current();
$artistRow->name = 'New Name'; 
$artistRow->save();

Автор статьи: DuB