我ZF2主干应用程序工作正常,按了Zend用户指南。 但现在我在圈子快到试图让专辑的艺术家是不是一个字符串了,但艺术家表在我的数据库外键来扩展应用程序。
我已经创建了所有必要的模型,控制器,视图创建,编辑和查看的艺术家,这也能正常工作。 但我怎么将二者结合起来,使我的专辑的列表显示了艺术家的名字?
我用一个水化战略的建议在这里 ? 如果是这样,我该如何实现呢? 在Zend \ STDLIB \保湿\策略手册不告诉我在哪里注册水化策略。 是的,有很短的实现代码:
$foo = new Foo();
$foo->setFoo("bar");
$foo->setBar("foo");
$hydrator = new ClassMethods();
$hydrator->addStrategy("foo", new Rot13Strategy());
但是,在这不走? 在我的AlbumController? 为什么一直说大家都hydrators“主要用于形式”?
或者是不是我要找的毕竟是一个水化? 我一直撞到我寻求解决的另一件事是依赖注入。 再次,我发现这个类型的教程 ,但在使用类A,B和C,而不是告诉我,所有的代码片段去是不抓的概念有很大帮助。
我想我想要做的是很常见的,我错,我无法找到任何真实世界的教程。 研究小时,我敢肯定,之后我非常接近一个突破 - 但我不能再看到它,需要一个推动。 谢谢 :-)
当你永远需要得到或缩小的对象/实体,当使用一种形式,或者也可以保存或从存储加载实体时,它可以是数据Hydrators使用。
我不会用的保湿来填充相关对象的对象(例如,用于添加昂蒂斯对象到您的相册)。 我会离开这个高达你的服务/映射器。
这里有一个例子,我怎么会做它:
Album.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决定要采取哪条路线..
你的保湿将采取组装的对象,并给回你需要任何显示格式,数据或保存持久性等等。
<?php
class AlbumHydrator // extends Zend\Stdlib\Hydrator\ClassMethods
{
public function extract($object)
{
return array(
'artist_id' => $object->getArtist()->getId(),
'albumn_name' => $object->getAlbumName()
)
}
// .. etc
}
AlbumService.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')
;
}
// ..
}
你会设置你的服务在服务管理器的配置是这样的:
'AlbumService' => function($sm) {
$mapper = $sm->get('AlbumMapper');
$service = new Application\Service\AlbumService();
$service->setAlbumMapper($mapper);
return $service;
},
然后,您使用您的服务来创建你所需要的对象图。 你必须为每个实体的独立映射器,以及服务可以使用映射器来生成您需要的对象。
您通常会为每个实体的保湿,而映射器将使用这些填充物为您服务。 这将取决于您的实施,很可能是使用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/