How to extend the ZF2 skeleton application - entit

2019-08-19 17:15发布

我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,而不是告诉我,所有的代码片段去是不抓的概念有很大帮助。

我想我想要做的是很常见的,我错,我无法找到任何真实世界的教程。 研究小时,我敢肯定,之后我非常接近一个突破 - 但我不能再看到它,需要一个推动。 谢谢 :-)

Answer 1:

当你永远需要得到或缩小的对象/实体,当使用一种形式,或者也可以保存或从存储加载实体时,它可以是数据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/



文章来源: How to extend the ZF2 skeleton application - entities with foreign keys