2012-08-28 20 views
9

Quiero utilizar el validador de archivos para restringir los tipos de mime para la entrada de archivos. Lamentablemente, esta restricción nunca se utiliza y todos los archivos fueron aceptados.Por qué Symfony File Validator no funciona

namespace WNC\SoldierBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* WNC\SoldierBundle\Entity\Soldier 
* 
* @ORM\Table(name="soldier") 
* @ORM\Entity(repositoryClass="WNC\SoldierBundle\Entity\SoldierRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Soldier 
{ 

    /** 
    * @var string $picture 
    * @Assert\Image() 
    * @ORM\Column(name="picture", type="string", length=255) 
    */ 
    private $picture; 

    /** 
    * @var string $file 
    * 
    * @Assert\Image() 
    * @Assert\NotBlank() 
    */ 
    public $file; 


    public function getAbsolutePath() 
    { 
     return null === $this->picture ? null : $this->getUploadRootDir().'/'.$this->picture; 
    } 

    public function getWebPath() 
    { 
     return null === $this->picture ? null : $this->getUploadDir().'/'.$this->picture; 
    } 

    protected function getUploadRootDir() 
    { 
     // the absolute directory path where uploaded documents should be saved 
     return __DIR__.'/../../../../web/'.$this->getUploadDir(); 
    } 

    protected function getUploadDir() 
    { 
     // get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view. 
     return 'uploads/pictures'; 
    } 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpload() 
    { 

     if($this->picture && file_exists($this->getAbsolutePath())) { 
      unlink($this->getAbsolutePath()); 
     } 

     if (null !== $this->file) { 
      // do whatever you want to generate a unique name 
      $this->picture = uniqid().'.'.$this->file->guessExtension(); 
     } 

    } 

    /** 
    * @ORM\PostPersist() 
    * @ORM\PostUpdate() 
    */ 
    public function upload() 
    { 
     if (null === $this->file) { 
      return; 
     } 


     // if there is an error when moving the file, an exception will 
     // be automatically thrown by move(). This will properly prevent 
     // the entity from being persisted to the database on error 
     $this->file->move($this->getUploadRootDir(), $this->picture); 

    } 

    /** 
    * @ORM\PostRemove() 
    */ 
    public function removeUpload() 
    { 
     if ($file = $this->getAbsolutePath()) { 
      unlink($file); 
     } 
    } 
} 

creador de formularios:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('mothers_name') 
     ->add('service_end_date', 'date',array(
      'widget' => 'single_text', 
      'format' => 'MM/dd/yyyy', 
      'attr' => array('class' => 'date six columns') 
     )) 
     ->add('army_unit') 
     ->add('city', 'city_selector') 
     ->add('gender', 'choice', array(
      'choices' => array(0 => 'Male', 1 => 'Female'), 
      'required' => false, 
      'expanded' => true, 
      'label' => 'Male/Female', 
      'data' => 0 
     )) 
     ->add('file','file', array(
      'data_class' => 'Symfony\Component\HttpFoundation\File\File', 
      'label' => 'Picture' 
     )) 
     ->add('self_description', 'textarea') 
     ->add('video', null, array(
      'attr' => array(
      'placeholder' => 'some link here' 
     ))) 
     ->add('wants_to_contact', null, array(
      'label' => Soldier::getLabel('wants_to_contact') 
     )) 
     ->add('comments', 'textarea') 
     ->add('user', new NameFormType('Application\Sonata\UserBundle\Entity\User')) 
     ->add('city', 'city_selector') 

    ; 


} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => array('Registration'), 
     'cascade_validation' => true, 
    )); 


} 

public function getName() 
{ 
    return 'wnc_soldierbundle_soldiertype'; 
} 

controlador:

/** 
* Creates a new Soldier entity. 
* 
* @Route("/create", name="soldier_create") 
* @Method("POST") 
* @Template("WNCSoldierBundle:Soldier:new.html.twig") 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new Soldier(); 
    $form = $this->createForm(new SoldierType(), $entity); 
    $form->bind($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('soldier_show', array('id' => $entity->getId()))); 
    } 

    return array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    ); 
} 
+0

Tema diferente: Me he dado cuenta de que está teniendo el mismo problema que tengo con las rutas, puede consultar esto: http://stackoverflow.com/questions/12168086/how-to-deal-with-relative-paths -in-symfony-2 – ChocoDeveloper

+0

gracias, pero el ahorro funciona sin problemas, pero no puedo encontrar un motivo por el que la validación no funciona. Tal vez porque es solo un campo virtual no usado como columna db? –

+0

Acabo de crear una aplicación de prueba que utiliza esta afirmación y funcionó bien. Las imágenes no daban un error y las imágenes pasaban. Esto está en Symfony2.1. ¿Cómo se ve tu creador de formularios? – Kris

Respuesta

3

Encontré la solución. En la definición de formulario, estoy usando `'validation_groups' => array ('Registro'). Pensé que cuando no hay un grupo para el validador, coincidirá con cualquiera de ellos en la definición del formulario.

Cuando he agregado la propiedad de grupos al validador, todo funcionaba finalmente. Así, por ejemplo usando validation.yml:

WNC\SoldierBundle\Entity\Soldier: 
    properties: 
     file: 
      - Image: {groups: [Registration]} 
5

Control hacia fuera este SO anterior pregunta: Symfony2 validation using Assert annotation does not work. Es posible que desee asegurarse de haber cumplido con todas las configuraciones recomendadas para usar Symfony2.

Además, no es necesario validar $picture con Image restricción porque no es un archivo/imagen.

/** 
* @var string $picture 
* @Assert\Image()          <-- Should be removed 
* @ORM\Column(name="picture", type="string", length=255) 
*/ 
private $picture; 

/** 
* @var string $file          <-- @var UploadedFile $file 
* 
* @Assert\Image() 
* @Assert\NotBlank() 
*/ 
public $file; 

que en realidad era capaz de validar que un archivo subido es una imagen utilizando la alternativa YAML así que puede que desee probar que si no aparece nada.

+0

Gracias por responder, desafortunadamente, sus sugerencias no solucionaron el problema. El enlace que proporcionó está relacionado con otro validador que estoy usando. No tengo ningún problema con los validadores estándar como obligatorio, no vacío, etc. Comprobé VichUploaderBundle y eliminé las anotaciones del ciclo de vida, pero no hace la diferencia. ¿Qué versión de Symfony estás usando? –

+0

por otro lado, el archivo de validación yml también fue ineficaz en este caso –

+0

Hola @LukeAdamczewski, sí, soy consciente de que el enlace que proporcioné fue sobre un validador diferente. Lo que creo que fue útil allí fue en realidad esta respuesta http://stackoverflow.com/a/7946408/1349295 con respecto a la extensión intl. Tal vez, ¿se aseguran de que se cumplan todas las configuraciones recomendadas para sf2? Por cierto, tengo esto trabajando en sf2.0. He estado portando algún código de 2.1 a 2.0 y encontré algunos cambios significativos (y aún estoy cambiando). Por cierto, sf2.1 ya no está en beta! Acabo de comprobar en este momento. Tal vez intente actualizar a la última distribución. :) –

0

Usted mediante restricción que no es adecuado para su campo. Simplemente mantente con la restricción de archivo en la propiedad $ file.

Cuestiones relacionadas