es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Las aserciones revisan datos de la base de datos o datos enviados a través de formularios?

Tengo un campo de entrada de archivo que no quiero que sea nulo cuando actualizo el formulario (cuando lo creo, el valor predeterminado es nulo, por eso permito que sea nulo en la base de datos).

Esto es cómo se ve mi entidad:

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
#[Assert\NotNull]
private $idCard;

public function getIdCard(): ?string
{
    return $this->idCard;
}

public function setIdCard(?string $idCard): self
{
    $this->idCard = $idCard;

    return $this;
}

Y este es mi tipo de formulario:

->add('idCard', FileType::class, [
    'mapped' => false,
    'required' => true,
    'label' => 'Choose a file'
])

En mi base de datos, esta propiedad es nula porque aún no se ha cargado nada. Pero cuando intento cargar algo, me arroja el error “Este valor no debe ser nulo”. Intenté hacer lo mismo reemplazando NULL por ” (en blanco) en la base de datos y funcionó. Es como si las restricciones estuvieran verificando la base de datos en lugar de los datos enviados por el formulario. Si este es el caso, ¿cómo puedo verificar solo si los datos de mi campo no son nulos (en el lado del servidor) y arrojar un error si lo son?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para comprobar si los datos del formulario enviados para la entrada de archivos no son nulos (lado del servidor) y lanzar un error si lo son, puedes modificar tu tipo de formulario para incluir una restricción personalizada en el campo ‘idCard’.

    Primero, crea una clase de restricción personalizada que compruebe si la entrada del archivo no es nula:

    // src/Validator/Constraints/FileNotNull.php
    namespace App\Validator\Constraints;
    
    use Symfony\Component\Validator\Constraint;
    
    /**
     * @Annotation
     */
    class FileNotNull extends Constraint
    {
        public $message = 'El archivo no puede ser nulo.';
    
        public function validatedBy()
        {
            return \get_class($this).'Validator';
        }
    
        public function getTargets()
        {
            return self::PROPERTY_CONSTRAINT;
        }
    }
    

    Luego, crea el validador para la restricción:

    // src/Validator/Constraints/FileNotNullValidator.php
    namespace App\Validator\Constraints;
    
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
    
    class FileNotNullValidator extends ConstraintValidator
    {
        public function validate($value, Constraint $constraint)
        {
            if (null === $value) {
                $this->context->buildViolation($constraint->message)
                    ->addViolation();
            }
        }
    }
    

    Finalmente, agrega la restricción personalizada ‘FileNotNull’ a tu tipo de formulario:

    use App\Validator\Constraints\FileNotNull;
    
    // ...
    
    ->add('idCard', FileType::class, [
            'mapped' => false,
            'required' => true,
            'label' => 'Elige un archivo',
            'constraints' => [
                new FileNotNull(),
            ],
    ])
    

    Esto comprobará si los datos del formulario enviados para la entrada de archivos son nulos y lanzará un mensaje de error si lo son. No comprobará el valor en la base de datos.

Comments are closed.