Различные правила проверки для одного и того же объекта в Symfony2

Администратор сможет редактировать пользователей своего сайта, но не пароль. Итак, я создал этот EditUserFormType:

namespace CAPUserBundle\Form\Type;

use CAPShopAdminBundle\Repository\DiscountGridRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class EditUserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('email', EmailType::class);
$builder->add('discountGrid', EntityType::class, array(
'class' => 'CAPShopAdminBundle:DiscountGrid',
'choice_label' => 'name',
'placeholder' => '-- Aucune --',
'required' => false,
'query_builder' => function (DiscountGridRepository $r) {
$qb = $r->createQueryBuilder('d');
$qb->orderBy('d.name', 'ASC');
return $qb;
},
'attr' => array("autocomplete" => "off"),
));
$builder->add('isActive', ChoiceType::class, array(
'choices' => array(
'Actif' => '1',
'Désactivé' => '0'
),
));
$builder->add('name', TextType::class);
$builder->add('firstname', TextType::class);
$builder->add('company', TextType::class);
$builder->add('address', TextType::class);
$builder->add('postcode', TextType::class);
$builder->add('city', TextType::class);
$builder->add('phone', TextType::class);
$builder->add('fax', TextType::class);

$builder->add('save', SubmitType::class);
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'CAPUserBundle\Entity\User',
]);
}

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

Но когда я проверяю форму, возникает ошибка с полем plainPassword от моей сущности User.

This value should not be blank.     edit_user
Symfony\Component\Validator\ConstraintViolation

Object(Symfony\Component\Form\Form).data.plainPassword =

Действительно, существует ограничение проверки NotBlank, чтобы заставить пользователя устанавливать пароль при регистрации.

Мой вопрос: как я могу обойти это ограничение для редактирования моего пользователя? Поле пароля отсутствует в EditUserFormType, поэтому plainPassword бесполезен. Но я застрял, потому что я использую ту же сущность пользователя, где установлено значение NotBlank.

На данный момент я заставляю поле plainPassord:

$user->setPlainPassword('Ap@ssw0rd');

Но это ужасный способ обойти ограничение …

2

Решение

использование Группы проверки для различения правил проверки.

В этом случае plainPassword необходим для регистрации, а не для редактирования.

Итак, установите группу «регистрация» для ограничения NotBlank.

3

Другие решения

И я выбрал совершенно другой подход, отказавшись от правил валидации в моделях данных, подобных аннотациям, и вместо этого использовал ограничения в классах форм. Например:

/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{

$dateConstraintFrom = new Date();
$notBlankDateFrom = new NotBlank();

$builder->add('date_from', TextType::class, array(
'required' => true,
'label' => 'bookform.place.date_from',
'constraints' => array($notBlankDateFrom, $dateConstraintFrom),

'attr' => array(
'placeholder' => 'bookform.place.date_from',
'id' => 'bookform_place_date_from',
'required' => 'required',
),
));
...........
}

Я привык к такому способу ведения дел, и он намного удобнее, чем аннотации и группы проверки.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector