【发布时间】:2021-04-19 19:54:17
【问题描述】:
我配置了以下 UserDataPersister(直接取自 tutorial):
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 实现与this 相同。
【问题讨论】:
-
您能否编辑您的问题以包含
App\DataPersister\UserDataPersister的源代码? -
@ArleighHix,我添加了一个指向我复制的代码的链接。
-
idk 为什么他们在模型中使用字段,最好的方法是将模型与您的数据对象分开。这样,您始终可以利用良好的旧数据结构,然后将数据对象从端点分别传入和传出。 DTO / Normalizers 是实现这一点的最佳方式。我不明白为什么作者选择这样做,这似乎从字面上滥用框架和学说。
-
这个错误的产生是因为你的fixture代码不会触发encodePassword,你的持久化器只有在通过端点真正请求时才会被调用。根据代码,每当请求到来并且 api paltform 捕获事件时,密码字段都来自 DataPersistor。 Fixtures 不会生成将触发此持久器的内核事件,因为它不是框架的一部分。你可以在你的夹具中调用编码密码方法来通过自定义 Faker 或其他方法解决这个问题。
-
@MaulikParmar 本教程是从旧的 Symfony 版本发展而来的,所以我想他们太“懒惰”了,无法修改它以适应新的模式和实践。
标签: symfony fixtures api-platform.com alice