3

我已经配置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: ~

在我的测试中,我的数据库中有三个标签:tag1, tag2, new 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时,里面有对象。

4

3 回答 3

1

您不了解文档。您可以在以下文件中阅读: 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不返回序列化数据。它使用serialzier 将序列化数据发送到elasticsearch 服务器。使用序列化程序时,您不必在配置中提供映射。

于 2016-01-05T08:35:12.460 回答
0

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

于 2016-01-04T12:56:12.577 回答
0

将 $results 序列化为 json 存在问题JsonResponse

JsonResponse类在里面做简单的json_encode,所以没有机会获得受保护的属性。

例如:

<?php

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

var_dump(json_encode(new Data()));

返回{"name":"foo"}

于 2016-01-05T08:27:58.933 回答