为什么在Symfony2中找不到我的SerializerBuilder?

时间:2013-03-15 22:57:34

标签: php symfony jmsserializerbundle

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

我已经通过作曲家成功安装了这个包。

然后,在the official documentation之后,我正在做:

<?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');
    }

}

但它返回

  

FatalErrorException:

     

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

第51行是:

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

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

3 个答案:

答案 0 :(得分:2)

如果use JMS\Serializer\SerializerBuilder;到位,您应该像SerializerBuilder一样处理该课程。没有它,请使用完全限定名称\JMS\Serializer\SerializerBuilder(注意前导反斜杠!)

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

答案 1 :(得分:1)

那是因为你没有正确使用命名空间。 use语句为特定命名空间生成别名。 use JMS\Serializer\SerializerBuilder;语句表示SerializerBuilderJMS\Serializer\SerializerBuilder类的别名。

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

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

有关详细信息,请查看一些“PHP命名空间”教程,例如this one

答案 2 :(得分:1)

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