Symfony 4/JMS/FOSUser:无法序列化来自 FOS\UserBundle 的数据
Symfony 4/JMS/FOSUser: Can't serialize datas from FOS\UserBundle
有很多类似的问题,其中一些有经过验证的答案,但我在这里,none 个问题有效。
我的用例非常简单:
我的用户 App\Client\common\Entities\User
属于客户 App\Client\common\Entities\Customer
。
App\Client\common\Entities\User
也继承了 FOS\UserBundle\Model\User
其中包含神圣的 属性 “email”
我想序列化我所有的客户和他们的用户(包括他们的邮件)。 Jms 工作得很好,除了我无法从 FOS\UserBundle\Model\User
class.
访问属性
下面这是我现在的。
jms_serializer.yml
jms_serializer:
#blablablaa....
metadata:
auto_detection: true
directories:
App:
namespace_prefix: 'App\Client'
path: '%kernel.project_dir%/serializer'
FOSUB:
namespace_prefix: 'FOS\UserBundle'
path: '%kernel.project_dir%/serializer'
serializer/App.Client.common.Entities.User.yml :
App\Client\common\Entities\User:
exclusion_policy: ALL
properties:
surname:
expose: true
exclude: false
groups: [export]
serializer/Model.User.yml:
FOS\UserBundle\Model\User:
exclusion_policy: ALL
properties:
email:
expose: true
exclude: false
groups: [export]
src/Command/DeploySyncUsersCommand.php:
protected function execute(InputInterface $input, OutputInterface $output)
{
$users = $this->customerRepository->findAll(); //this is an array of Customer
$context = new SerializationContext();
$context->setGroups(['export']);
$serializer = SerializerBuilder::create()->build();
$json = $serializer->serialize($users, 'json', $context);
// do something with json
}
一切正常,除了 json 不包含电子邮件或任何 FOSUser\User 数据。
还有一点有趣的是,我可以在 App.Client.common.Entities.User.yml 和 Model.User.yml 文件中写入任何内容(甚至是无效的 yml),我能够毫无错误地清除缓存。当我在 jms_serializer.yml
中写入无效的 yml 时出现错误
好的,我已经能够使用依赖注入而不是构建序列化程序来解决这个问题
/**
* @var SerializerInterface
*/
private SerializerInterface $serializer;
/**
* @var string
*/
private string $reportAnalysisUrl;
public function __construct(SerializerInterface $serialzer, $reportAnalysis)
{
$this->serializer = $serialzer;
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$users = $this->customerRepository->findAll();
$context = new SerializationContext();
$context->setGroups(['export']);
$json = $this->serializer->serialize($users, 'json', $context);
//do something with json
}
所以现在我的 yml 文件不再被忽略
有很多类似的问题,其中一些有经过验证的答案,但我在这里,none 个问题有效。
我的用例非常简单:
我的用户
App\Client\common\Entities\User
属于客户App\Client\common\Entities\Customer
。App\Client\common\Entities\User
也继承了FOS\UserBundle\Model\User
其中包含神圣的 属性 “email”
我想序列化我所有的客户和他们的用户(包括他们的邮件)。 Jms 工作得很好,除了我无法从 FOS\UserBundle\Model\User
class.
下面
jms_serializer.yml
jms_serializer:
#blablablaa....
metadata:
auto_detection: true
directories:
App:
namespace_prefix: 'App\Client'
path: '%kernel.project_dir%/serializer'
FOSUB:
namespace_prefix: 'FOS\UserBundle'
path: '%kernel.project_dir%/serializer'
serializer/App.Client.common.Entities.User.yml :
App\Client\common\Entities\User:
exclusion_policy: ALL
properties:
surname:
expose: true
exclude: false
groups: [export]
serializer/Model.User.yml:
FOS\UserBundle\Model\User:
exclusion_policy: ALL
properties:
email:
expose: true
exclude: false
groups: [export]
src/Command/DeploySyncUsersCommand.php:
protected function execute(InputInterface $input, OutputInterface $output)
{
$users = $this->customerRepository->findAll(); //this is an array of Customer
$context = new SerializationContext();
$context->setGroups(['export']);
$serializer = SerializerBuilder::create()->build();
$json = $serializer->serialize($users, 'json', $context);
// do something with json
}
一切正常,除了 json 不包含电子邮件或任何 FOSUser\User 数据。
还有一点有趣的是,我可以在 App.Client.common.Entities.User.yml 和 Model.User.yml 文件中写入任何内容(甚至是无效的 yml),我能够毫无错误地清除缓存。当我在 jms_serializer.yml
中写入无效的 yml 时出现错误好的,我已经能够使用依赖注入而不是构建序列化程序来解决这个问题
/**
* @var SerializerInterface
*/
private SerializerInterface $serializer;
/**
* @var string
*/
private string $reportAnalysisUrl;
public function __construct(SerializerInterface $serialzer, $reportAnalysis)
{
$this->serializer = $serialzer;
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$users = $this->customerRepository->findAll();
$context = new SerializationContext();
$context->setGroups(['export']);
$json = $this->serializer->serialize($users, 'json', $context);
//do something with json
}
所以现在我的 yml 文件不再被忽略