Symfony API平台&x2B;alice 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

我已配置了以下UserDataPersister(直接取自):

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 } ]