当前位置: 首页 > 知识库问答 >
问题:

API平台alice UserDataPerchat不使用夹具

上官羽
2023-03-14

我配置了以下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: []

但是我在加载这个夹具时会出现错误:

  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).                                                                 

我的UserDataPersister实现与此相同。

共有1个答案

钦永贞
2023-03-14

引用文章末尾的内容

如果我们现在停止。。。耶!我们没有。。。真正地完成任何操作:我们添加了这个新的plainPassword属性。。。但什么都没用!因此,请求最终会在数据库中爆炸,因为$password字段将为空。

接下来,我们需要钩住请求处理过程:我们需要在反序列化之后但在持久化之前运行一些代码。我们将使用数据持久器来实现这一点。

由于单元测试将POST请求,数据持久化器由api平台调用,它将按事件获取编码逻辑。在夹具的情况下,直接进行原则批处理插入,这将绕过所有持久化逻辑并导致空密码。

正如@rishta所提到的,有一种方法可以解决这个问题,使用Processor对文档中引用的数据装置实现哈希

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

在API平台中进行输入屏蔽的一个更好的方法是使用DTO模式,这与本文建议的相反,在本文中,您可以:

  • 创建单独的输入

文档中有关DTO的更多信息

 类似资料:
  • 我刚开始使用API和Python获取数据。我想从我的交易平台中提取数据。他们提供了以下说明: http://www.questrade.com/api/documentation/getting-started 我可以完成步骤4,并有一个访问令牌。我需要第五步的帮助。我如何翻译这个请求: 进入Python代码?我已经试过了 我读了这个后尝试:Python请求与身份验证(access_token)

  • 问题内容: 我遇到此错误: java.lang.UnsupportedOperationException:当前平台不支持桌面API 我会从Java应用程序中打开文件。我使用这种方法: 我怎么解决这个问题? 问题答案: 基本上,问题是Java桌面集成在Linux上无法很好地工作。 它旨在与Windows配合使用。某些东西可以在其他系统上运行,但是没有人真正关心为这些系统添加适当的支持。即使安装了必

  • 我正在学习带有 Api-Platform 的 OpenApi/Swagger API。我创建了一个新的endpoint,它接受枚举的值作为参数: 然而,这是一个相当常见的参数,值可以频繁更新(随着服务器的增加),我想使用某种模板。 所以我试着: 跟 或者 以及其他各种形式,都无济于事。 我试图理解组件的概念,但无法找到在Symfony/Api平台中使用它们的方法。 如何在不同的endpoint重用

  • 新浪SAE平台使用 新版sp框架直接支持在新浪云计算平台(SAE)上面运行。 不再需要像旧版一样区分SAE版本和非SAE版本的做法,目前SAE对许多PHP原生环境支持都比较好了。 新版框架在SAE平台上面的演示地址:https://speedphp.sinaapp.com/ 当然,在SAE上面使用新版sp框架,还是得注意一下: protected/config.php配置文件中,设置一下view的

  • 我需要创建一个GETendpoint来返回通过超文本传输协议客户端从另一个应用程序获取的资源,而不是基于实体。我获取的资源是一个数组: 然后我需要查询数据库以获取一些数据以添加到资源数组中。 所以我在中创建了它: 但是现在,我希望我的api返回json api响应格式:https://jsonapi.org/. 基于实体的资源,api平台完全支持。我不需要做太多。我只是在实体类中添加“key”并配

  • 炼金台与平台方合作,帮助核心企业实施上下游贷款业务。通过风险清洗筛掉不良客户,并将合格客户的不规则数据“冶炼” 成标准的风控半成品,批量推送给金融机构。