Symfony 验证器的注释返回“注释从未导入异常”

Posted

技术标签:

【中文标题】Symfony 验证器的注释返回“注释从未导入异常”【英文标题】:Annotation for Symfony validator returns "annotation was never imported exception" 【发布时间】:2020-11-10 04:32:12 【问题描述】:

我正在尝试在 Symfony 控制器上使用验证器服务,特别是 uniqueEntity 约束来检查具有相同 id 的对象是否已经在数据库中。我之前在同一个项目上成功地使用了验证器的 de UUID 约束,也使用了注释。因此,使用相同的方法行不通似乎很奇怪。

我的注释实体如下所示:

 <?php
//src/Entity/Usuarios.php
    
    namespace App\Entity;
    
    use App\Repository\UsuariosRepository;
    use Doctrine\ORM\Mapping as ORM;
    
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    /**
     * @ORM\Entity(repositoryClass=UsuariosRepository::class)
     * @UniqueEntity("idUsuario")
     */
    class Usuarios
    
        /**
         * @ORM\Id() @ORM\Column(name="idUsuario",type="integer", unique=true) 
         * @Assert\IdUsuario
         */
        private $idUsuario;

\** etc.**\

?>

我的控制器如下所示:

//src/Entity/Usuarios.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpClient\HttpClient;
use Doctrine\ORM\EntityManagerInterface;


use App\Entity\Empleados;
use App\Entity\Productos;
use App\Entity\ProductoOrden;
use App\Entity\Ordenes;
use App\Entity\Usuarios;
use App\Entity\Ventas;
use App\Entity\Periodos;


require_once('/Users/jaumaf/clases/2020-1/incentivos/src/testData.php');

use const testData\USUARIOS_T;
use const testData\EMPLEADOS_T;
use const testData\PRODUCTOS_T;
use const testData\ORDENES_T;
use const testData\PERIODOS_T;
use const testData\VENTAS_T;

use Psr\Log\LoggerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;



class LoadDataController extends AbstractController

    /**
     * @Route("/load/data", name="load_data")
     */
  public function index(LoggerInterface $logger, ValidatorInterface $validator)  

  //los json estan en testData.php

   $usuariosArray = json_decode(USUARIOS_T, TRUE);
   $empleadosArray = json_decode(EMPLEADOS_T,TRUE);
   $productosArray = json_decode(PRODUCTOS_T,TRUE);
   $ordenesPorEmpleadoArray = json_decode(ORDENES_T,TRUE);
   $periodosArray = json_decode(PERIODOS_T, TRUE);
   $ventasPorVendedorArray= json_decode(VENTAS_T, TRUE);

   $logger->info('Test constants loaded');

     
  $entities = $this -> mapArraysToObjects($usuariosArray, $empleadosArray, $productosArray,  $ordenesPorEmpleadoArray,$ventasPorVendedorArray,$periodosArray);
  $logger->info('Entities loaded to memory');

  $cont = 0;
  $logtable =  $this -> logLoadedEntities($cont, $entities);
  

  // Persistencia
  $entityManager = $this->getDoctrine()->getManager();

  $logger->info('ORM loaded');


  // Validator test

  $usuario = $entities[0];


  $validation = $validator -> validate($usuario);

// this should make the validator throw a uniqueEntity exception, but it throws an annotation exception. 

我得到的例外是:

[Semantical Error] The annotation "@Symfony\Component\Validator\Constraints\IdUsuario" in property App\Entity\Usuarios::$idUsuario was never imported. Did you maybe forget to add a "use" statement for this annotation?

我已经尝试在我的控制器上为Symfony\Component\Validator\Constraints\IdUsuario 添加一个use 语句,因为异常消息似乎暗示了(但是,Symfony 指南没有提到这个步骤,所以它应该是不必要的)。但它显示完全相同的错误。

我还尝试进行学说迁移,希望注释使用的元数据以某种方式自我更新,但它在命令行中引发了相同的异常。


bash-3.2$  php bin/console make:migration

In AnnotationException.php line 54:
                                                                                     
  [Semantical Error] The annotation "@Symfony\Component\Validator\Constraints\IdUsu  
  ario" in property App\Entity\Usuarios::$idUsuario was never imported. Did you may  
  be forget to add a "use" statement for this annotation?                            
                                                             

我是 php 新手,我不太了解注释的工作原理。但我遵循了https://symfony.com/doc/current/reference/constraints/UniqueEntity.html 中的指南。我很确定我已经彻底检查了语法,正如我之前所说的那样,它在不同的约束下工作。此外,当我调用validate() 函数时,控制器内部会引发异常。也许我在控制器端缺少某些东西,或者我不知道 Symfony 框架系统上的某些东西可能会影响验证服务的行为?

我将不胜感激任何指导。在此期间,我将尝试将注意力集中在注释上。

谢谢

【问题讨论】:

【参考方案1】:

从类Usuarios中删除注释@Assert\IdUsuario

你从https://symfony.com/doc/current/reference/constraints/UniqueEntity.html复制粘贴它 它与 UniqueEntity 验证无关。它只是检查该字段是否是有效的电子邮件。

【讨论】:

谢谢小妖精。我认为 @Assert 对于验证器检查类中的特定字段是必要的。

以上是关于Symfony 验证器的注释返回“注释从未导入异常”的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2中组序列验证器的问题

Symfony 5 / 使用 API 编写自定义身份验证总是返回我无效的凭据

Symfony UniqueEntity vs UniqueConstraint vs unique=true

Symfony 2中的kernel.request事件中的身份验证令牌始终为空?

用 phpunit 模拟 symfony 安全,返回空值而不是布尔值(不使用预言)

Symfony 安全返回 401 响应而不是重定向