我已将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
时,里面有对象。
答案 0 :(得分: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服务器。使用序列化程序时,您不必在配置中提供映射。
答案 1 :(得分:0)
AppBundle \ Entity \ Tag应该实现\ JsonSerializable接口,以便Elastica可以谨慎处理它。关于这个主题的一些讨论在这里:https://github.com/ruflin/Elastica/issues/783
答案 2 :(得分:0)
使用JsonResponse
将jason序列化为$结果时出现问题。
JsonResponse
类内部正在执行简单的json_encode,因此没有机会获得受保护的属性。
例如:
<?php
class Data {
protected $id = 1;
public $name = 'foo';
}
var_dump(json_encode(new Data()));
返回{"name":"foo"}