Symfony API平台&x2B;alice UserDataPersister不使用装置
我已配置了以下UserDataPersister(直接取自):Symfony API平台&x2B;alice UserDataPersister不使用装置,symfony,fixtures,api-platform.com,alice,Symfony,Fixtures,Api Platform.com,Alice,我已配置了以下UserDataPersister(直接取自): Information for Service "App\DataPersister\UserDataPersister" ============================================================= Service ID App\DataPersister\UserDataPersister Class
Information for Service "App\DataPersister\UserDataPersister"
=============================================================
Service ID App\DataPersister\UserDataPersister
Class App\DataPersister\UserDataPersister
Tags api_platform.data_persister (priority: -1000)
Public no
Shared yes
Abstract no
Autowired yes
Autoconfigured yes
以及以下用户设备:
App\Entity\User:
user_{1..10}:
email: "usermail_<current()>\\@email.org"
plainPassword: "plainPassword_<current()>"
__calls:
- initUuid: []
我对UserDataPersister的实现与文章末尾的引用相同 如果我们现在停止。。。耶!我们没有。。。真正地我们做了什么 已添加此新的明文密码属性。。。但是没有人在使用它!所以 请求最终会在数据库中爆炸,因为 $password字段将为空 接下来,我们需要连接到请求处理过程:我们需要 在反序列化之后但在持久化之前运行一些代码。我们会的 使用数据持久器 因为单元测试将发布请求,所以数据持久器由api平台调用,它将通过事件获取编码逻辑。在fixture的情况下,直接批量插入完成后,将绕过所有持久性逻辑,并将导致空密码 有一种方法可以解决这个问题,如@rishta所述,使用处理器对数据装置实现哈希,如中所述 在API平台中进行输入屏蔽的一个更好的方法是使用DTO模式,这与本文建议的相反,在本文中,您可以:
- 创建单独的输入和输出数据对象
- 在对象之间转换基础日期
- 根据需要为每个操作选择不同的IO对象
关于DTO的更多信息在中,您能否编辑您的问题以包含
App\DataPersister\UserDataPersister
的源代码?@arleghix,我添加了一个指向我复制的代码的链接。idk他们为什么对模型中的字段执行此操作,最好的方法是将模型与数据对象分开。通过这种方式,您可以始终利用良好的旧数据结构,然后从单独进出的端点转换数据对象。DTO/规范化器是实现这一点的最佳方法。我不明白作者为什么选择这样做,这看起来像是滥用了框架和原则。产生这个错误是因为你们的固定代码不会触发encodePassword,你们的persistor只有在通过端点的真正请求时才会被调用。根据代码,每当请求出现并且api paltform捕捉到该事件时,密码字段都来自DataPersistor。fixture不会生成将触发此persistor的内核事件,因为它不是框架的一部分。你能做的是在你的设备中调用encode password方法,通过自定义伪造程序或其他方法来解决这个问题。@MaulikParmar本教程是从旧的Symfony版本发展而来的,所以我想他们太“懒”了,无法修改它以适应新的模式和实践。嗯,需要帮助。
An exception occurred while executing 'INSERT INTO "user" (id, uuid, roles, password, email) VALUES (?, ?, ?, ?, ?)' with params [281, "16ac40d3-53af-45dc-853f-e26f188d
1818", "[]", null, "usermail1@email.org"]:
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "password" of relation "user" violates not-null constraint
DETAIL: Failing row contains (281, 16ac40d3-53af-45dc-853f-e26f188d1818, [], null, usermail1@email.org).
<?php
namespace App\DataFixtures\Processor;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Fidry\AliceDataFixtures\ProcessorInterface;
use App\Entity\User;
final class UserProcessor implements ProcessorInterface
{
private $userPasswordEncoder;
public function __construct(EntityManagerInterface $entityManager, UserPasswordEncoderInterface $userPasswordEncoder) {
$this->userPasswordEncoder = $userPasswordEncoder;
}
/**
* @inheritdoc
*/
public function preProcess(string $fixtureId, $object): void {
if (false === $object instanceof User) {
return;
}
$object = $this->userPasswordEncoder(
$object,
$object->getPlainPassword()
);
}
/**
* @inheritdoc
*/
public function postProcess(string $fixtureId, $object): void
{
// do nothing
}
}
# app/config/services.yml
services:
_defaults:
autoconfigure: true
App\DataFixtures\Processor\UserProcessor: ~
#add tag in case autoconfigure is disabled, no need for auto config
#tags: [ { name: fidry_alice_data_fixtures.processor } ]