我刚刚从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)。在过去的四个小时中,我尝试了很多不同的尝试,但是我真的无法使它起作用。