2012-08-28 13 views
9

Chcę użyć walidatora plików do ograniczenia typów MIME do wprowadzania plików. Niestety to ograniczenie nigdy nie jest używane i wszystkie pliki zostały zaakceptowane.Dlaczego narzędzie Valfator pliku Symfony nie działa

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); 
     } 
    } 
} 

Form Builder:

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'; 
} 

Kontroler:

/** 
* 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

Inny temat: Zauważyłem, że masz ten sam problem ze ścieżkami, możesz to sprawdzić: http://stackoverflow.com/questions/12168086/how-to-deal-with-relative-paths -in-symfony-2 – ChocoDeveloper

+0

dziękuję, ale oszczędzanie działa bezbłędnie, ale nie mogę znaleźć powodu, dla którego sprawdzanie poprawności nie działa. Może dlatego, że jest to tylko wirtualne pole nie używane jako kolumna db? –

+0

Właśnie stworzyłem aplikację testową, która korzysta z tego potwierdzenia i działała dobrze. Brak obrazów powodował błąd i obrazy przechodziły. To jest na Symfony2.1. Jak wygląda twój kreator formularzy? – Kris

Odpowiedz

3

Znalazłem rozwiązanie. W definicji formularza używam `'validation_groups' => array ('Registration'). Pomyślałem, że gdy nie ma grupy dla walidatora, dopasuje się ona do dowolnego z nich w definicji formy.

Po dodaniu właściwości grup do walidatora wszystko działało w końcu. Tak na przykład przy użyciu validation.yml:

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

Sprawdź ten poprzedni SO pytanie: Symfony2 validation using Assert annotation does not work. Być może zechcesz upewnić się, że znasz wszystkie zalecane konfiguracje do korzystania z Symfony2.

Ponadto nie jest konieczne sprawdzanie $picture z ograniczeniem Image, ponieważ nie jest to plik/obraz.

/** 
* @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; 

I był rzeczywiście w stanie potwierdzić, że przesłany plik jest obrazem przy użyciu alternatywę YAML więc można również spróbować, że jeśli nic nie wyjdzie.

+0

Dzięki za odpowiedź, niestety Twoje sugestie nie rozwiązały problemu. Podany link jest powiązany z innym weryfikatorem, niż używam. Nie mam problemu ze standardowymi weryfikatorami, takimi jak wymagane, niepuste itp. Sprawdziłem VichUploaderBundle i usunąłem adnotacje z cyklu życia, ale to nie robi różnicy. Jakiej wersji symfony używasz? –

+0

z drugiej strony plik sprawdzania poprawności w yml był również nieskuteczny w tym przypadku –

+0

Hi @LukeAdamczewski, tak wiem, że podany link dotyczył innego walidatora. To, co myślę, że było użyteczne, to w rzeczywistości ta odpowiedź http://stackoverflow.com/a/7946408/1349295 dotycząca rozszerzenia wewnętrznego. Być może upewnij się, że wszystkie zalecane konfiguracje dla sf2 są spełnione? BTW, mam to działa na sf2.0. Przesyłałem pewien kod z wersji 2.1 do 2.0 i napotkałem kilka istotnych zmian (i wciąż się zmienia). Nawiasem mówiąc, sf2.1 nie jest już w wersji beta! Właśnie sprawdziłem teraz. Może spróbuj uaktualnić do najnowszej dystrybucji. :) –

0

używasz Wiązanie, które nie są odpowiednie dla danej dziedzinie. Po prostu trzymaj się ograniczenia pliku na własności $ pliku.

Powiązane problemy