首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Symfony2 -用于AJAX调用的实体存储库JSON编码

Symfony2 -用于AJAX调用的实体存储库JSON编码
EN

Stack Overflow用户
提问于 2013-09-24 21:38:50
回答 2查看 5.8K关注 0票数 0

我正在尝试使用AJAX自动完成功能构建一个动态文本字段。

我在控制器中定义了一个用于AJAX调用的方法。

代码语言:javascript
代码运行次数:0
运行
复制
public function cityAction(Request $request)
{
    $repository = $this->getDoctrine()
        ->getRepository('UserCityBundle:District');

    $items = $repository->findAll();

// $format = $request->getRequestFormat();
// \Doctrine\Common\Util\Debug::dump($items);

    return $this->render('CommonAjaxBundle:Default:index.html.twig', array('data' => array(
        'success' => true,
        'root' => 'district',
        'count' => sizeof($items),
        'rows' => $items
    )));
}

添加到twig文件中:

代码语言:javascript
代码运行次数:0
运行
复制
{{ data | json_encode | raw }}

我从一个如何在Symfony2中进行ajax调用的示例中获取了这一点。它应该打印我的区域实体存储库的json编码,但我得到了以下结果:

代码语言:javascript
代码运行次数:0
运行
复制
{"success":true,"root":"district","count":6,"rows":[{},{},{},{},{},{}]} 

为什么它不打印括号之间的字段?

EN

回答 2

Stack Overflow用户

发布于 2013-09-25 03:23:25

您可以通过序列化程序组件来序列化实体(请参阅http://symfony.com/doc/current/components/serializer.html)。

要序列化实体,可以使用上面链接中描述的GetSetMethodNormalizer类,也可以创建一个规范化程序,并在包的服务定义文件中将其声明为标记为serializer.normalizer的新服务(如果使用yaml配置,则为Resource/config/service.yml)。

代码语言:javascript
代码运行次数:0
运行
复制
parameters:
    common_ajax_bundle.district.normalizer.class: Full\Path\To\Your\normalizer\Class

common_ajax_bundle.district.normalizer:
    class: '%common_ajax_bundle.district.normalizer.class%'
    tags:
        - { name: serializer.normalizer }

规范化类可以扩展Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer类。通过$this->setIgnoredAttributes(array(/* the fields to ignore */))方法将所有要忽略的字段放在构造函数中,或者您可以从头开始创建它,它只需实现Symfony\Component\Serializer\Normalizer\NormalizerInterface接口。

然后在你的控制器中:

代码语言:javascript
代码运行次数:0
运行
复制
public function cityAction(Request $request)
{
    $repository = $this->getDoctrine()
        ->getRepository('UserCityBundle:District');

    $items = $repository->findAll();

    $serializer = $this->container->get('serializer');

    // serialize all of your entities
    $serializedCities = array();
    foreach ($items as $city) {
        $serializedCities[] = $serializer->normalize($city, 'json');
    }

    return new JsonResponse(array(
        'success' => true,
        'root' => 'district',
        'count' => sizeof($items),
        'rows' => $serializedCities
    ));
}
票数 3
EN

Stack Overflow用户

发布于 2013-12-06 17:20:36

来自实体的数据是私有的,因此无法从json_encode访问。您必须使用序列化程序。很多人推荐使用JMSSerializerBundle。您还可以使用以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;

$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new 
JsonEncoder()));
$json = $serializer->serialize($entity, 'json');

在我的例子中,我构建了一个twig函数,以便返回有限数量的数据(也可以重命名键属性):

代码语言:javascript
代码运行次数:0
运行
复制
namespace Company\EgBundle\Services;

class TwigExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('encode_entity', array($this, 'encodeEntity')),
        );
    }

    public function encodeEntity($entity, $filter = null)
    {
        $data = [];
        $methods = get_class_methods($entity); 
        if ($filter) {
            $methods = array_intersect($methods, array_keys($filter));
        }
        foreach ($methods as $method) {
            if (strpos($method, 'get') === 0) {
                $value = $entity;
                while(is_object($value)) {
                    $value = $value->$method();
                }
                $key = $filter ? $filter[$method] : substr($method, 3);
                $data[$key] = $value;
            }
        }
        return json_encode($data);
    }
}

要在模板中使用此函数,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
{{ row|encode_entity({'getProductName': 'name', 'getIdIsoCry': 'currency'}) }}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18983229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档