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); });
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());
$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();