簡體   English   中英

具有依賴項的silex表單驗證

[英]silex form validation with dependencies

我已經使用silex框架構建了一個表單,該表單包含一些復選框和一個文本字段。 用戶必須至少選中一個復選框或在文本字段中寫一些東西。 現在,我不知道如何驗證這種依賴關系,或者更好地將驗證邏輯放在哪里。 我可以在單個字段中添加約束,但是如何實現復選框經過驗證或文本字段的依賴關系?

這是我在控制器類中的驗證代碼。

public function validateAction(Request $request, Application $app)
{
    $form = $app['form.factory']->create(new ApplicationForm());
    $form->bind($request);
    if ($form->isValid()) {
        return $app->json(array(
            'success' => true,
        ));
    }
}

ApplicationForm類如下所示(簡化):

class ApplicationForm extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('crafts', 'choice', array(
                'choices' => array(
                    array('drywall'     => 'Drywall'),
                    array('painter'     => 'Painter'),
                    array('plasterer'   => 'Plasterer'),
                    array('carpenter'   => 'Carpenter'),
                    array('electrician' => 'Electrician'),
                    array('plumber'     => 'Plumber'),
                    array('tiler'       => 'Tiler'),
                    array('bricklayer'  => 'Bricklayer'),
                ),
                'multiple' => true,
                'expanded' => true,
                'required' => false,
            ))
            ->add('craftsOther', 'text', array(
                'attr' => array('class' => 'textinput', 'placeholder' => 'Other', 'maxlength' => 256),
                'constraints' => array(
                    new Assert\Length(array('max' => 256, 'maxMessage' => $this->_errorMessages['crafts_other_max'])),
                ),
                'required' => false,
            ));
    }
}

任何想法如何以一種優雅的方式做到這一點?

您可以向表單本身添加約束,而不僅僅是單個字段。 您可以在選項中傳遞一組約束:

這是一個工作示例,檢查提交時兩個字段是否相等。

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Silex\Application;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;

$app = new Application();

$app['debug'] = true;
$app->register(new \Silex\Provider\FormServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array('translator.domains' => array(),));
$app->register(new Silex\Provider\ValidatorServiceProvider());
$app->register(new Silex\Provider\TwigServiceProvider());

class ExampleFormType extends AbstractType
{

    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('apple')
            ->add('banana')
            ->add('submit', SubmitType::class);
    }

    public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'constraints' => [
                new Assert\Callback(function (array $data, ExecutionContextInterface $context) {
                    if ($data['apple'] === $data['banana']) {
                        $context
                            ->buildViolation('Apple and Banana cannot be the same')
                            ->atPath('apple')
                            ->addViolation();
                    }
                }),
            ],
        ]);
    }
}

$app->match('/', function (Request $request, Application $app) {
    $form = $app['form.factory']->create(ExampleFormType::class)->handleRequest($request);
    if ($form->isValid()) {
        echo "Valid Submission";
    }

    return $app['twig']->createTemplate('{{ form(form) }}')->render([
        'form' => $form->createView(),
    ]);
})->method('GET|POST');

$app->run();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM