gpt4 book ai didi

php - Symfony/serializer 在对象中标准化对象

转载 作者:行者123 更新时间:2023-12-05 01:41:15 24 4
gpt4 key购买 nike

大家好,我没有找到关于递归归一化对象的回复

    class User
{
public $email;
public $userId;
public $userName;
/**
* @var CustomAttributes
*/
public $customAttributes;
}
class CustomAttributes
{
public $someStuff;
public $someStuffHere;
}

我只是想通过 symfony 组件的 normalize() 将其转换为数组 snake_case

$normalizer = new PropertyNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
$user_normalize = $normalizer->normalize($user);

但是我有这个错误

In AbstractObjectNormalizer.php line 129: Cannot normalize attribute "customAttributes" because the injected serializer is not a normalizer

谢谢你的帮助

最佳答案

这是因为你忘记添加 $serializer = new Serializer([$normalizer]) 位。请参阅下面的工作示例。

实现

use App\User;
use App\CustomAttributes;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;
use Symfony\Component\Serializer\Serializer;

class SnakeCaseUtility
{
public function convert(): array
{
$classMetadataFactory = null;
$nameConverter = new CamelCaseToSnakeCaseNameConverter();

$normalizer = new PropertyNormalizer($classMetadataFactory, $nameConverter);
$serializer = new Serializer([$normalizer]);

$normalizedUser = $serializer->normalize($this->getUser(), 'json');

return $normalizedUser;
}

private function getUser(): User
{
$customAttributes = new CustomAttributes();
$customAttributes->someStuff = 'Some stuff';
$customAttributes->someStuffHere = 'Some stuff here';

$user = new User();
$user->userId = 123;
$user->userName = 'Hello World';
$user->email = 'hello@world.com';
$user->customAttributes = $customAttributes;

return $user;
}
}

测试

use App\SnakeCaseUtility;
use PHPUnit\Framework\TestCase;

class SnakeCaseUtilityTest extends TestCase
{
public function testSnakeCase(): void
{
$expected = [
'email' => 'hello@world.com',
'user_id' => 123,
'user_name' => 'Hello World',
'custom_attributes' => [
'some_stuff' => 'Some stuff',
'some_stuff_here' => 'Some stuff here',
]
];

$this->assertSame($expected, (new SnakeCaseUtility())->convert());
}
}

结果

$ vendor/bin/phpunit --filter SnakeCaseUtilityTest tests/SnakeCaseUtilityTest.php 
PHPUnit 7.5.1 by Sebastian Bergmann and contributors.

. 1 / 1 (100%)

Time: 83 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

关于php - Symfony/serializer 在对象中标准化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com