Symfony2:FOS:弹性填充失败,因为序列化程序有回调

时间:2014-12-15 11:00:30

标签: symfony serialization elastica

我正在使用symfony LTS和主FOS:elastica和master jms_serializer。

配置

fos_elastica:
clients:
    default: { host: %elastic_host%, port: %elastic_port% }
serializer:
    callback_class: FOS\ElasticaBundle\Serializer\Callback
    serializer: serializer
indexes:
    c_search:
        client: default
        types:
            adverts:
                mappings:
                    id:
                        type: integer
                    user:
                        type: string
                    Media:
                        type: nested
                        properties:
                            urlMedia: ~
                persistence:
                    driver: orm
                    model: WebSite\MyBundle\Entity\Advert
                    provider: ~
                    listener: ~
                    finder: ~

填充

php app/console fos:elastica:populate

在添加以下行之前,此命令没有任何问题。当我尝试运行“php app / console fos:elastica:populate”时,由于我添加了这些行,因此存在无限循环:

serializer:
    callback_class: FOS\ElasticaBundle\Serializer\Callback
    serializer: serializer 

故障:

在此之后,我在我的控制器上发出了一个简单的请求(因为我的问题没有序列化):

    public function testAction()
    {
        $repositoryManager = $this->container->get('fos_elastica.manager');
        $repository = $repositoryManager->getRepository('WebSiteMyBundle:Advert');
        $data = json_encode($repository->find('68200'));
        return $this->render('WebSiteMyBundle:Default:test.html.twig', array(
            'test'=> $data,
        ));
    }

在我的结果测试中,有5个空数组。我知道结果很好,因为我的原始请求中有正常的5响应,但如果有人有想法,我找不到显示真实内容的解决方案。

1 个答案:

答案 0 :(得分:1)

好的,我的评论是对的,这个问题与序列化程序有关,而且非常符合逻辑。 实际上,如果你没有指定任何东西,弹性将索引级联中的每个属性和每个关系,这在进行一些循环引用时是个问题。

您可以采取以下措施解决问题:

首先,在您的组中添加一些属性:

<?php

namespace WebSite\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;

/**
 * Advert
 *
 * @ORM\Table(name="advert")
 */
class Advert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=55)
     * @Serializer\Groups({"elastica"})
     */
    private $title;

    ...

然后,在配置文件中添加:

fos_elastica:
    clients:
        default: { host: %elastic_host%, port: %elastic_port% }
    serializer:
        callback_class: FOS\ElasticaBundle\Serializer\Callback
        serializer: serializer
    indexes:
        c_search:
            client: default
            types:
                adverts:
                    serializer:
                        groups: [elastica]
                    mappings:
                        id:
                            type: integer
                        user:
                            type: string
                        Media:
                            type: nested
                            properties:
                                urlMedia: ~
                    persistence:
                        driver: orm
                        model: WebSite\MyBundle\Entity\Advert
                        provider: ~
                        listener: ~
                        finder: ~

然后,您不应该有任何循环引用,并且只有弹性搜索索引中的title属性。

祝你好运。