Почему не работает валидатор файлов Symfony
Я хочу использовать file validator для ограничения типов mime для ввода файлов. К сожалению, это ограничение никогда не используется, и все файлы были приняты.
namespace WNCSoldierBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
/**
* WNCSoldierBundleEntitySoldier
*
* @ORMTable(name="soldier")
* @ORMEntity(repositoryClass="WNCSoldierBundleEntitySoldierRepository")
* @ORMHasLifecycleCallbacks()
*/
class Soldier
{
/**
* @var string $picture
* @AssertImage()
* @ORMColumn(name="picture", type="string", length=255)
*/
private $picture;
/**
* @var string $file
*
* @AssertImage()
* @AssertNotBlank()
*/
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';
}
/**
* @ORMPrePersist()
* @ORMPreUpdate()
*/
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();
}
}
/**
* @ORMPostPersist()
* @ORMPostUpdate()
*/
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);
}
/**
* @ORMPostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
}
форма строителя:
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' => 'SymfonyComponentHttpFoundationFileFile',
'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('ApplicationSonataUserBundleEntityUser'))
->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';
}
:
/**
* 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(),
);
}
3 ответов
проверьте этот предыдущий вопрос SO:проверка Symfony2 с использованием аннотации Assert не работает. Возможно, вам захочется убедиться, что вы выполнили все рекомендуемые конфигурации для использования Symfony2.
кроме того, нет необходимости проверять $picture
С Image
ограничение, потому что это не файл/изображение.
/**
* @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;
Я действительно смог проверить, что загруженный файл является изображением, используя альтернативу YAML, поэтому вы также можете попробовать это, если ничего придумать.
Я нашел решение. В определении формы я использую "validation_groups' = > array ('Registration'). Я думал, что когда нет группы для валидатора, она будет соответствовать любому из них в определении формы.
когда я добавил свойство groups в валидатор, все работало окончательно. Так, например, используя validation.yml
:
WNC\SoldierBundle\Entity\Soldier:
properties:
file:
- Image: {groups: [Registration]}
вы используете ограничение, которое не подходит для вашей области. Просто придерживайтесь ограничения файла на свойство $file.