我有一个抽象的表类,其代码类似于:
function fetchById($id) {
$id = (int) $id;
$cacheName = sprintf('%s-%s', stripslashes(get_class($this)), hash('sha256', sprintf(
'%s-%s-%s', get_class($this), __FUNCTION__, $id
)));
if (($row = $this->cache->getItem($cacheName)) == FALSE) {
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
$this->cache->setItem($cacheName, $row);
}
return $row;
}
这对于返回ArrayObject
的默认$row
非常有效,但是我现在想要在我的行对象中包含其他功能(以便功能不包含在多个中,不相关,诸如不同控制器之类的地方等。)
为此,我创建了ArrayObjectPrototype
扩展Zend\Db\RowGateway\RowGateway
,但是当我尝试缓存该行时,收到以下错误消息:You cannot serialize or unserialize PDO instances
将__wake
和__sleep
函数添加到我的行对象中没有问题,但如何将PDO对象放入我的__wake
函数中?
我正在application.config.php
文件中创建缓存:
'ZendCacheStorageFactory' => function() {
return \Zend\Cache\StorageFactory::factory(
array(
'adapter' => array(
'name' => 'filesystem',
'options' => array(
'dirLevel' => 2,
'cacheDir' => 'data/cache',
'dirPermission' => 0755,
'filePermission' => 0666,
),
),
'plugins' => array('serializer'),
)
);
},
我假设我必须创建一个自定义插件,我将db适配器传递给它?但我完全迷失了如何做到这一点。
答案 0 :(得分:0)
我所做的(可能是错误的)是创建一个不保存pdo实例的抽象行类。此类扩展了RowGateway
类,但覆盖了__construct
,initialize
,save
和delete
函数(所有需要pdo的函数)
/**
* Abstract table row class.
*
* @package RPK
* @subpackage Db
* @author SuttonSilver
*/
namespace RPK\Db;
use Zend\Db\Adapter\Adapter;
use Zend\Db\RowGateway\Exception\RuntimeException;
use Zend\Db\RowGateway\RowGateway;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\TableIdentifier;
use Zend\Db\RowGateway\Feature\FeatureSet;
abstract class RowAbstract extends RowGateway {
/**
* Constructor
*
* @param string $primaryKeyColumn
* @param string|TableIdentifier $table
* @param Adapter|Sql $adapterOrSql
* @throws Exception\InvalidArgumentException
*/
public function __construct($primaryKeyColumn, $table, $adapterOrSql = null) {
// setup primary key
$this->primaryKeyColumn = empty($primaryKeyColumn) ? null : (array) $primaryKeyColumn;
// set table
$this->table = $table;
$this->initialize();
}
/**
* initialize()
*/
public function initialize() {
if ($this->isInitialized) {
return;
}
if (!$this->featureSet instanceof FeatureSet) {
$this->featureSet = new FeatureSet;
}
$this->featureSet->setRowGateway($this);
$this->featureSet->apply('preInitialize', []);
if (!is_string($this->table) && !$this->table instanceof TableIdentifier) {
throw new RuntimeException('This row object does not have a valid table set.');
}
if ($this->primaryKeyColumn === null) {
throw new RuntimeException('This row object does not have a primary key column set.');
} elseif (is_string($this->primaryKeyColumn)) {
$this->primaryKeyColumn = (array) $this->primaryKeyColumn;
}
$this->featureSet->apply('postInitialize', []);
$this->isInitialized = true;
}
/**
* Save any changes to this row to the table
* @throws \Exception
*/
public function save() {
throw new \Exception('No PDO object available.');
}
/**
* Delete this row from the table
* @throws \Exception
*/
public function delete() {
throw new \Exception('No PDO object available.');
}
}