Symfony Serializer没有反序列化为不同命名空间中的对象:'没有找到支持的规范化器'

时间:2016-10-07 19:05:35

标签: php symfony serialization

我尝试使用symfony / serializer包和symfony / property-access通过composer将json反序列化为一个对象。当我反序列化的类在同一个文件中时,它可以工作,但在其他地方(甚至不是同一命名空间中的不同文件)时则不行。 我有以下代码:

<?php // Somewhere/Foo.php
namespace Somewhere;
class Foo
{
    private $foo;
    public function getFoo() { return $this->foo; }
    public function setFoo($foo) { $this->foo = $foo; }
}

<?php // file tests/Test.php
namespace tests;

use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Somewhere\Foo;

class Foo2
{
    private $foo;
    public function getFoo() { return $this->foo; }
    public function setFoo($foo) { $this->foo = $foo; }
}

class Test extends \PHPUnit_Framework_TestCase
{

    public function testFoo()
    {
        $encoders = array(new XmlEncoder(), new JsonEncoder());
        $normalizers = array(new ObjectNormalizer(), new GetSetMethodNormalizer());
        $serializer = new Serializer($normalizers, $encoders);
        $payload = '{"foo": {"bar": "baz"}}';

        $obj = $serializer->deserialize($payload, Foo::class, 'json');
        $this->assertInstanceOf(Foo::class, $obj);
    }

    public function testFoo2()
    {
        $encoders = array(new XmlEncoder(), new JsonEncoder());
        $normalizers = array(new ObjectNormalizer(), new GetSetMethodNormalizer());
        $serializer = new Serializer($normalizers, $encoders);
        $payload = '{"foo": {"bar": "baz"}}';

        $obj = $serializer->deserialize($payload, Foo2::class, 'json');
        $this->assertInstanceOf(Foo2::class, $obj);
    }
}

使用本地类(Foo2)的测试工作正常,但在不同命名空间(\Somewhere\Foo)中使用该类的测试显示了以下错误: Symfony\Component\Serializer\Exception\UnexpectedValueException: Could not denormalize object of type Somewhere\Foo, no supporting normalizer found

我已经尝试过使用\Somewhere\Foo::class'Foo''\Somewhere\Foo'代替Foo :: class而没有任何运气。

类似的问题:

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

发生错误是因为Foo类在此上下文中不存在,您可能忘记将此文件Somewhere/Foo.php包含在自动加载中。

在你的样本中,这应该有效!

<?php // file tests/Test.php

namespace tests;

include 'Somewhere/Foo.php';

//...

PHPStorm的某些编辑器能够自动导入Foo类,如果它在同一目录中而不显示任何错误。

相关问题