I have an abstract table class with code similar to this:
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;
}
This works well enough for the default ArrayObject
that $row
is returned as, however I am now wanting to include additional functionality into my row objects (so that the functionality is not included in multiple, unrelated, places such as different controllers, etc).
To this end I have created an ArrayObjectPrototype
extending Zend\Db\RowGateway\RowGateway
, however when I try to cache the row I am getting the following error message: You cannot serialize or unserialize PDO instances
Oh dear.
I have no problem adding __wake
and __sleep
functions to my row object, but how do I get the PDO object into my __wake
function?
I am creating my cache in my application.config.php
file:
'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'),
)
);
},
I assume I have to create a custom plugin that I pass the db adaptor into? But I am totally lost on how to do that.