- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个相当简单的实体,具有 UniqueEntity
验证:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\ManyToOne;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity("email", message="Email already in use")
*
*
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $email;
表单(故意删除所有其他表单字段)
namespace App\Form;
use App\Entity\Company;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class UserType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add( 'email', EmailType::class,[
'label' => 'Email'
] );
$builder->add( 'save', SubmitType::class, [
'attr' => [
'class' => 'btn btn-primary',
'id' => 'btn-user-form'
],
'label' => 'Save'
] );
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults( [
'data_class' => 'App\Entity\User'
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'user';
}
}
和 Controller :
public function edit(User $user, RequestStack $request)
{
$em = $this->getDoctrine()->getManager();
$form = $this->createForm( UserType::class, $user);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()){
$em->persist( $user);
$em->flush();
$this->addFlash('success', 'User updated.');
return $this->redirectToRoute('user_index');
}
return $this->render('user/update.html.twig', [
'form' => $form->createView(),
'deleteForm' => $this->createDeleteForm($user)->createView()
]);
}
当我保存现有记录时,收到错误消息“电子邮件已在使用中”(由我指定)
以下查询显示在 Symfony Profiler 中:
SELECT t0.id AS id_1, t0.email AS email_2, t0.firstname AS firstname_3, t0.lastname AS lastname_4, t0.roles AS roles_5, t0.last_ip_address AS last_ip_address_6, t0.last_active AS last_active_7, t0.password AS password_8, t0.reset_token AS reset_token_9, t0.company_id AS company_id_10 FROM user t0 WHERE t0.id = ?
Parameters:
[▼
1
]
View formatted query View runnable query Explain query
2 0.44 ms
SELECT t0.id AS id_1, t0.email AS email_2, t0.firstname AS firstname_3, t0.lastname AS lastname_4, t0.roles AS roles_5, t0.last_ip_address AS last_ip_address_6, t0.last_active AS last_active_7, t0.password AS password_8, t0.reset_token AS reset_token_9, t0.company_id AS company_id_10 FROM user t0 WHERE t0.id = ?
Parameters:
[▼
"100"
]
View formatted query View runnable query Explain query
3 0.43 ms
SELECT t0.id AS id_1, t0.name AS name_2 FROM company t0 WHERE t0.id = ?
Parameters:
[▼
17
]
View formatted query View runnable query Explain query
4 0.56 ms
SELECT c0_.id AS id_0, c0_.name AS name_1 FROM company c0_ WHERE c0_.id IN (?) ORDER BY c0_.name ASC
Parameters:
[▼
[▼
"17"
]
]
View formatted query View runnable query Explain query
5 0.76 ms
SELECT u0_.id AS id_0, u0_.email AS email_1, u0_.firstname AS firstname_2, u0_.lastname AS lastname_3, u0_.roles AS roles_4, u0_.last_ip_address AS last_ip_address_5, u0_.last_active AS last_active_6, u0_.password AS password_7, u0_.reset_token AS reset_token_8, u0_.company_id AS company_id_9 FROM user u0_ LEFT JOIN company c1_ ON u0_.company_id = c1_.id
Parameters:
[]
View formatted query View runnable query Explain query
6 0.31 ms
SELECT c0_.id AS id_0, c0_.name AS name_1 FROM company c0_ ORDER BY c0_.name ASC
Parameters:
[]
View formatted query View runnable query Explain query
7 0.14 ms
"START TRANSACTION"
Parameters:
[]
View formatted query View runnable query Explain query
8 0.49 ms
UPDATE user SET last_active = ? WHERE id = ?
Parameters:
[▼
"2020-01-18 07:56:51"
1
]
View formatted query View runnable query Explain query
9 0.77 ms
"COMMIT"
Parameters:
[]
View formatted query View runnable query Explain query
10 0.15 ms
"START TRANSACTION"
Parameters:
[]
View formatted query View runnable query Explain query
11 0.23 ms
INSERT INTO usage_log (logged, url, user_id, file_type_id) VALUES (?, ?, ?, ?)
Parameters:
[▼
1 => "2020-01-18 07:56:51"
2 => "/user/100/edit"
3 => 1
4 => null
]
View formatted query View runnable query Explain query
12 0.38 ms
"COMMIT"
Parameters:
[]
有一个监听器导致了
update last_active... and
insert into usage_log
查询。可以肯定的是,这个问题不仅限于User实体,我在另一个实体公司上创建记录时也遇到了同样的问题。
实体:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\ManyToMany;
use Doctrine\ORM\Mapping\JoinColumn;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\CompanyRepository")
* @UniqueEntity("name", message="Company already saved")
*/
class Company
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=100, unique=true)
*/
private $name;
/**
* @OneToMany(targetEntity="User", mappedBy="Company")
*/
private $Users;
/**
* @ManyToMany(targetEntity="ModelFile", inversedBy="Companies")
* @JoinColumn(nullable=true)
*/
private $ModelFile;
Controller :
public function create(RequestStack $request)
{
$company = new Company();
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(CompanyType::class, $company);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()){
$em->persist($company);
$em->flush();
$this->addFlash('success', 'Company created.');
return $this->redirectToRoute('company_index');
}
return $this->render('company/create.html.twig', [
'form' => $form->createView()
]);
}
我创建公司时的查询日志是
1 0.84 ms
SELECT t0.id AS id_1, t0.email AS email_2, t0.firstname AS firstname_3, t0.lastname AS lastname_4, t0.roles AS roles_5, t0.last_ip_address AS last_ip_address_6, t0.last_active AS last_active_7, t0.password AS password_8, t0.reset_token AS reset_token_9, t0.company_id AS company_id_10 FROM user t0 WHERE t0.id = ?
Parameters:
[▼
1
]
View formatted query View runnable query Explain query
2 1.22 ms
SELECT c0_.id AS id_0, c0_.name AS name_1 FROM company c0_ ORDER BY c0_.name ASC
Parameters:
[]
View formatted query View runnable query Explain query
3 0.47 ms
SELECT m0_.id AS id_0, m0_.name AS name_1, m0_.display_name AS display_name_2, m0_.file AS file_3 FROM model_file m0_
Parameters:
[]
View formatted query View runnable query Explain query
4 0.13 ms
"START TRANSACTION"
Parameters:
[]
View formatted query View runnable query Explain query
5 0.51 ms
UPDATE user SET last_active = ? WHERE id = ?
Parameters:
[▼
"2020-01-18 07:44:29"
1
]
View formatted query View runnable query Explain query
6 0.55 ms
"COMMIT"
Parameters:
[]
View formatted query View runnable query Explain query
7 0.14 ms
"START TRANSACTION"
Parameters:
[]
View formatted query View runnable query Explain query
8 0.34 ms
INSERT INTO usage_log (logged, url, user_id, file_type_id) VALUES (?, ?, ?, ?)
Parameters:
[▼
1 => "2020-01-18 07:44:29"
2 => "/company/create"
3 => 1
4 => null
]
View formatted query View runnable query Explain query
9 0.30 ms
"COMMIT"
Parameters:
[]
我还在这里提供了监听器代码:
<?php
namespace App\Listener;
use App\Entity\UsageLog;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use \Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class LastActivityListener implements EventSubscriberInterface
{
private $tokenStorage;
private $em;
private $router;
public function __construct(TokenStorageInterface $tokenStorage, EntityManagerInterface $em, RouterInterface $router)
{
$this->tokenStorage = $tokenStorage;
$this->em = $em;
$this->router = $router;
}
public function onResponse(FilterResponseEvent $event)
{
$token = $this->tokenStorage->getToken();
if ($token && $token->isAuthenticated() && is_a($token->getUser(), User::class) ) {
$token->getUser()->setLastActive(new \DateTime());
$this->em->persist($token->getUser());
$this->em->flush($token->getUser());
if ($event->getRequest()->get('_route')) {
$usageLog = new UsageLog();
$usageLog
->setUrl($this->router->generate($event->getRequest()->get('_route'), $event->getRequest()->attributes->get('_route_params')))
->setUser($token->getUser())
->setLogged(new \DateTime());
$this->em->persist($usageLog);
$this->em->flush($usageLog);
}
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => 'onResponse',
];
}
}
我已经注释掉了 onResponse 中的所有内容,但问题仍然存在。
我觉得奇怪的是我保存公司时验证失败的描述。它将所有公司列为失败原因:
它肯定已经存在,但是在同一个记录上。我是否应该使用不同的实体进行插入和更新,或者 UniqueEntity
是如何设计使用的?
Symfony 4.2
最佳答案
将实体加载到表单中时应该非常小心:
$form = $this->createForm( UserType::class, $user);
$form->handleRequest($request->getCurrentRequest());
if ($form->isSubmitted() && $form->isValid()) {
即使您的表单无效,handleRequest
也会更改您的实体,并且它将在代码中的第一个 ->flush()
处更新,除非您使用@ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
位于实体顶部。
除此之外,您的代码完全有效,恐怕您需要向我们提供更多背景信息。
如果您有疑问,可以尝试运行以下示例:
src/Entity/Test.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\TestRepository")
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
* @UniqueEntity("test")
*/
class Test
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, unique=true)
*/
private $test;
public function getId(): ?int
{
return $this->id;
}
public function getTest(): ?string
{
return $this->test;
}
public function setTest(string $test): self
{
$this->test = $test;
return $this;
}
}
src/Controller/TestController.php
<?php
namespace App\Controller;
use App\Entity\Test;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class TestController extends Controller
{
/**
* @Route(path="/test/{id}", name="test")
*
* @param string $code
* @param int $action
*
* @return Response
*/
public function testAction(Test $test, Request $request)
{
$form = $this->createFormBuilder($test, ['data_class' => Test::class])
->add('test', TextType::class)
->add('save', SubmitType::class)
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($test);
$em->flush();
return $this->redirectToRoute('test', [
'id' => $test->getId(),
]);
}
return $this->render('test.html.twig', [
'form' => $form->createView(),
]);
}
}
templates/test.html.twig
{{ form(form) }}
这可能是一个愚蠢的言论,但是您是否检查过唯一索引是否已正确插入到您的数据库架构中?如果没有,您可能有另一个用户拥有相同的电子邮件地址,解释了验证失败的原因。
关于php - Symfony UniqueEntity 在更新现有实体时显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723946/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!