2017-07-19 70 views
0

我有用户和文件之间的OnetoOne关系,问题是每次我通过嵌入表单发布新文件时验证都不起作用。
我试过在symfony中提到的这个解决方案doc为了防止验证对象嵌入作为被验证对象的属性,我们需要在第一个字段中添加@Assert \ Valid。
另外我试图验证一个字符串,而不是一个文件,这没有奏效。
顺便说一句,在用户类中提到的任何验证,工作正常。
Files.php验证不适用于关系字段

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\File; 
use Vich\UploaderBundle\Mapping\Annotation as Vich; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 

/** 
* Files 
* @ORM\Table(name="files") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\FilesRepository") 
* 
* @Vich\Uploadable 
*/ 
class Files implements \Serializable 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
* 
* @Assert\NotBlank() 
* @Assert\File(
*  maxSize = "1024k", 
*  mimeTypes = {"application/pdf", "application/x-pdf"}, 
*  mimeTypesMessage = "Please upload a valid PDF" 
*) 
* @Assert\File(maxSize="1M") 
* @Vich\UploadableField(mapping="upload_files", fileNameProperty="imageName", size="imageSize") 
* 
* @var File 
*/ 
protected $imageFile; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * 
    * @var string 
    */ 
    protected $imageName; 

    /** 
    * @ORM\Column(type="datetime") 
    * 
    * @var string 
    */ 
    protected $updatedAt; 
    /** 
    * @ORM\Column(type="datetime") 
    * 
    * @var string 
    */ 
    protected $createdAt; 
    public function getId() 
    { 
     return $this->id; 
    } 





    /** 
    * 
    * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image 
    * 
    * 
    */ 
    public function setImageFile(File $image = null) 
    { 
     $this->imageFile = $image; 
     $this->createdAt = new \DateTimeImmutable(); 

     if ($image) { 
      // It is required that at least one field changes if you are using doctrine 
      // otherwise the event listeners won't be called and the file is lost 
      $this->updatedAt = new \DateTimeImmutable(); 
     } 

     return $this; 
    } 

    /** 
    * @return File|null 
    */ 
    public function getImageFile() 
    { 
     return $this->imageFile; 
    } 

    /** 
    * @param string $imageName 
    * 
    * 
    */ 
    public function setImageName($imageName) 
    { 
     $this->imageName = $imageName; 

     return $this; 
    } 

    /** 
    * @return string|null 
    */ 
    public function getImageName() 
    { 
     return $this->imageName; 
    } 

    /** @see \Serializable::serialize() */ 
    public function serialize() 
    { 
     return serialize(array(
      $this->id, 
      $this->imageName, 

     )); 
    } 

    /** @see \Serializable::unserialize() */ 
    public function unserialize($serialized) 
    { 
     list (
      $this->id, 

     ) = unserialize($serialized); 
    } 

    /** 
    * @return string 
    */ 
    public function getUpdatedAt() 
    { 
     return $this->updatedAt; 
    } 

    /** 
    * @param string $updatedAt 
    */ 
    public function setUpdatedAt($updatedAt) 
    { 
     $this->updatedAt = $updatedAt; 
    } 


} 

Users.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface; 
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass; 
use Symfony\Component\Security\Core\User\UserInterface; 
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUser; 
use Symfony\Component\Validator\Constraints as Assert; 


/** 
* Users 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UsersRepository") 
* 
*/ 
class Users extends OAuthUser 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * 
    * @ORM\OneToOne(targetEntity="AppBundle\Entity\Files",cascade={"persist"}) 
    * @ORM\JoinColumn(name="file_id", referencedColumnName="id") 
    */ 
    public $cv; 

UsersType.php

class UsersType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder-> 
->add('cv',FilesType::class) 

FilesType.php

/** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder -> 
    add('imageFile', 


VichFileType::class, [ 
      'required' => false, 
      'allow_delete' => true, 
      'download_link' => true, 
      'label' => false, 

     ]); 



} 
+0

@assert \有效()上的用户:$ CV没有效? –

+0

在用户上工作,但文件不是 – ahmedbhs

+0

是'UsersType'和'FilesType'上设置的'data_class'选项? –

回答

0

我发现了一个slution但我仍然不知道为什么通过注释进行验证没有作用。 解决的办法是过时了验证通过formType限制:

/** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    {$builder-> 
     add('imageFile', 


      VichFileType::class, [ 



      'constraints' => array(
       new Image(array('minWidth' => 500,'minHeight' => 350,'mimeTypes'=> 
        array(
        'image/jpeg', 
        'image/png', 
        'image/jpg', 
        'image/gif', 
        ), 
        )), 
       new File(array('maxSize' => 1024000,'mimeTypes'=> 
        array(
        'application/pdf', 

        ),)),), 











'required' => false, 

      'allow_delete' => true, 
      'download_link' => true, 
      'label' => false, 

      ]); 

}