回调约束所针对的方法不是有效的可调用方法

时间:2019-01-14 15:31:22

标签: php symfony silex

我刚刚从Silex 1.3迁移到2.2.4,但我的表单不再起作用。

这是曾经起作用的代码:

控制器

$inscriptionForm = $app['form.factory']->create(InscriptionType::class, $user, array('app' => $app));
$inscriptionForm->handleRequest($request);

类型

namespace citations\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class InscriptionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $options['app']; 
        //$this->app = $options['app'];

        $builder
            ->add('username', TextType::class, array(
                'constraints' => array(
                    new Assert\NotBlank(array('message' => 'Veuillez choisir un nom d\'utilisateur.')),
                    new Assert\Regex('/[a-zA-Z0-9_]/'),
                    new Assert\Length(array(
                        'min' => 5,
                        'max' => 30,
                        'minMessage' => 'Votre nom d\'utilisateur doit contenir au minimum 5 caractères.',
                        'maxMessage' => 'Votre nom d\'utilisateur ne doit pas dépasser 30 caractères.'
                    )),
                    new Assert\Callback(array(
                        'methods' => array(function ($username, ExecutionContextInterface $context) use ($app) {
                            if ($app['dao.user']->isUserUnique($username)) {
                                $context->addViolation('Ce nom d\'utilisateur est déjà utilisé.');
                            }
                        }),
                    )),
                ),
                'label' => 'Nom d\'utilisateur'
            ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'app' => null,
        ));
    }

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

似乎Callback约束存在问题,可能是因为Symfony版本也发生了变化(旧版本:2.7,新版本:3.4)。在过去的四个小时中,我尝试了很多不同的尝试,但是我真的无法使它起作用。

0 个答案:

没有答案