【问题标题】:Validation doesn't work on relation fields验证不适用于关系字段
【发布时间】:2017-07-19 13:17:25
【问题描述】:

我在用户和文件之间有 OnetoOne 关系,问题是每次我通过嵌入表单发布新文件时,验证都不起作用。
我尝试了 symfony doc 中提到的这个解决方案@为了防止对 嵌入的对象进行验证作为正在验证的对象的属性,我们需要在第一个字段中添加 @Assert\Valid。
我也试图验证一个字符串而不是一个文件,但这没有用。
顺便说一句,用户类中提到的任何验证都可以正常工作。
文件.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)

文件类型.php

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


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

        ]);



}

【问题讨论】:

  • @Assert\Valid() on Users:$cv 没有用?
  • 用户工作但文件不工作
  • 是在UsersTypeFilesType 上设置的data_class 选项?
  • 没有设置任何数据类!!
  • 尝试设置并再次测试?

标签: symfony symfony-forms


【解决方案1】:

@Assert\Valid() 在 cv 属性之上缺失

/**
 * 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;
    /**
     * @Assert\Valid() 
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\Files",cascade={"persist"})
     * @ORM\JoinColumn(name="file_id", referencedColumnName="id")
     */
    public $cv;

【讨论】:

    【解决方案2】:

    我找到了解决方案,但我仍然不知道为什么通过注释进行验证确实有效。 解决办法是通过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,
    
                ]
        );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多