当您需要从对象/实体中获取数据或从对象/实体中获取数据时,可以使用水合器,这可能是在使用表单时,也可能是在从存储中保存或加载实体时。
我不会使用 Hydrator 来用相关对象填充您的对象(例如,将反对象对象添加到您的相册中)。我会把它留给你的服务/映射器。
这是我如何做的一个例子:
相册.php
<?php
class Album
{
// .. properties / getters/setters etc ..
public function setArtist(ArtistInterface $artist)
{
$this->artist = $artist;
}
public function getArtist()
{
return $this->artist;
}
}
AlbumHydrator.php
这可能会有所不同,您将使用 getter/setter 或属性,查看基本 hydrators 以决定您要走哪条路线..
您的 Hydrator 将获取组装对象,并返回显示表单或保存到持久性等所需的数据。
<?php
class AlbumHydrator // extends Zend\Stdlib\Hydrator\ClassMethods
{
public function extract($object)
{
return array(
'artist_id' => $object->getArtist()->getId(),
'albumn_name' => $object->getAlbumName()
)
}
// .. etc
}
专辑服务.php
<?php
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;
class AlbumService implements ServiceManagerAwareInterface
{
/**
* Get an album, we'll also load any related objects here
*
* @param int
*/
public function find($id)
{
$album = $this->_getAlbumMapper()->find($id);
$artist = $this->_getArtistMapper()->findByAlbum($id);
$album->setArtist($artist);
return $album;
}
/**
* Get the Mapper
*
* @return Application\Mappers\AlbumMapper
*/
protected function _getAlbumMapper()
{
return $this->getServiceManager()
->get('AlbumMapper')
;
}
// ..
}
您将在 Service Manager 配置中设置您的服务,如下所示:
'AlbumService' => function($sm) {
$mapper = $sm->get('AlbumMapper');
$service = new Application\Service\AlbumService();
$service->setAlbumMapper($mapper);
return $service;
},
然后,您使用您的服务来创建您需要的对象图。您将为每个实体拥有单独的映射器,并且服务可以使用映射器来生成您需要的对象。
通常每个实体都有一个 Hydrator,映射器会使用它们为您填充对象。这取决于您的实现,您可能正在使用 TableGateway 或其他东西而不是映射器,这仍然可以正常工作。
现在是在控制器内部访问对象的示例
SomeController.php
public function albumAction()
{
$id = (int) $this->params()->fromRoute('id', FALSE);
if( ! $id) {
// do something with errors etc ..
return $this->redirect()->toRoute('default_route', array(
'controller' => 'index',
'action' => 'index'
));
}
$request = $this->getRequest();
$album = $this->getServiceLocator()->get('AlbumService')->find($id);
$artistName = $album->getArtist()->getName();
return new ViewMdoel(
'album' => $ablum,
'artistName' => $artistName
);
}
使用集合时填充对象图有点棘手,但我倾向于使用延迟加载和虚拟代理进行这种设置,这基本上会延迟加载您需要的对象,直到您需要它们,检查这些:
http://phpmaster.com/intro-to-virtual-proxies-1/
http://phpmaster.com/intro-to-virtual-proxies-2/