FOSElastica 为什么我的结果没有序列化?

FOSElastica why my result is not serialized?

我已经配置 FOSElasticaBundle 如下:

fos_elastica:
    clients:
        default: { host: %elasticsearch_host%, port: %elasticsearch_port%  }
    serializer: ~
    indexes:
        app:
            types:
                tags:
                    serializer:
                        groups: [Default]
                    mappings:
                        name: ~
                    persistence:
                        driver: orm
                        model: AppBundle\Entity\Tag
                        provider: ~
                        listener: ~
                        finder: ~

根据我的测试,我的数据库中有三个标签:tag1tag2new tag。 我的实体看起来像:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Class Tag
 * @package AppBundle\Entity
 *
 * @ORM\Entity
 * @ORM\Table(name="tags")
 */
class Tag
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var int
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    protected $name;

我正在按如下方式搜索索引标签:

$finder = $this->container->get('fos_elastica.finder.app.tags');

$results = [];
if ($query !== null) {
    $results = $finder->find("*" . $query . "*");

    //$results should be serialized, but aren't

    return new Response($results);
}

return new JsonResponse([
    'results' => $results
]);

我的回复是:{"results":[{},{},{}]}

为什么$results没有序列化?当我调试 $results 时,里面有对象。

AppBundle\Entity\Tag 应该实现 \JsonSerializable 接口,以便 Elastica 能够优雅地处理它。关于这个话题的一些讨论在这里:https://github.com/ruflin/Elastica/issues/783

使用 JsonResponse 将 $results 序列化为 json 时出现问题。

JsonResponseclass在里面做简单的json_encode,所以没有机会得到保护属性。

例如:

<?php

class Data {
protected $id = 1;
public $name = 'foo';
}

var_dump(json_encode(new Data()));

returns {"name":"foo"}

你不懂文档。您可以在以下文件中阅读: https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/Resources/doc/serializer.md

FOSElasticaBundle supports using a Serializer component to serialize your objects to JSON which will be sent directly to the Elasticsearch server. Combined with automatic mapping it means types do not have to be mapped.

FOSElasticaBundle 不 return 序列化数据。它使用 serialzier 将序列化数据发送到 elasticsearch 服务器。使用序列化程序时,您不必在配置中提供映射。