1

我正在尝试使用JMSSerializerBuilderjson 对我的对象进行编码,以便能够进行 AJAX 调用。

我已经通过composer成功安装了这个包。

然后,按照官方文档,我正在做:

<?php

namespace Pondip\GeolocBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use JMS\Serializer\SerializerBuilder;   

class DefaultController extends Controller
{
    public function getLakesSurroundingAction($lat=0, $lng=0, $limit = 50, $distance = 50, $unit = 'km')
    {
        $lakesNearby= $this->getNearby($lat, $lng, $limit, $distance, $unit);
        $serializer = JMS\Serializer\SerializerBuilder::create()->build();
        $return = $serializer->serialize($return, 'json');
    }

}

但它返回

致命错误异常:

错误:在 C:\Program Files (x86)\wamp\www\Pondip Dev\src\Pondip\GeolocBundle\Controller\DefaultController.php 第 51 行中找不到类 'Pondip\GeolocBundle\Controller\JMS\Serializer\SerializerBuilder'

第 51 行是:

$serializer = JMS\Serializer\SerializerBuilder::create()->build();

为什么会这样?删除该use JMS\Serializer\SerializerBuilder;行时(因为文档中未指定),我只收到内部服务器错误。

4

3 回答 3

2

就位后,use JMS\Serializer\SerializerBuilder;您应该像SerializerBuilder. 没有它,使用完全限定名称\JMS\Serializer\SerializerBuilder(注意前导反斜杠!)

进一步参考:http ://www.php.net/manual/en/language.namespaces.basics.php

于 2013-03-15T23:01:26.290 回答
1

那是因为您没有正确使用命名空间。使用语句为特定命名空间生成别名。该use JMS\Serializer\SerializerBuilder;语句意味着这SerializerBuilderJMS\Serializer\SerializerBuilder该类的别名。

在您的代码中执行$serializer = JSM\Serializer\SerializerBuilder::create()时,它是一个非限定名称空间,这意味着它会进入当前名称空间。这意味着 PHP 正在搜索 a Pondip\GeolocBundle\Controller\JMS\Serializer\SerializerBuilder(就像您在Pondip\GeolocBundle\Controller\命名空间中一样)。

要解决此问题,只需使用$serializer = SerializerBuilder::create(). 因为我们已经为 设置了别名SerializerBuilder,所以它会进入正确的类并且一切正常。

有关更多信息,请查看一些“PHP 命名空间”教程,例如这个

于 2013-03-15T23:03:16.900 回答
1

我个人不得不使用$this->container->get('serializer');而不是$serializer = $container->get('jms_serializer');

于 2013-04-10T14:52:19.177 回答