Разные правила проверки одной и той же сущности в 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';
    }
} 

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

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

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

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

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

На данный момент я форсирую поле plainPassord с помощью:

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

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

Author: Gaius, 2016-03-08

2 answers

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

В этом случае обычный пароль требуется для регистрации и не требуется для редактирования.

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

 3
Author: Artur Vesker, 2016-03-08 15:54:23

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

/**
 * @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
Author: RadaRada, 2016-08-04 09:04:23