Symfony2断言大于没有工作

时间:2014-03-18 18:02:48

标签: forms validation symfony doctrine

我实际上有一个问题。 物业"数量" Invetory实体不应该是否定的。

所以我尝试在我的实体声明中使用GreaterThan或GreaterThanOrEqual断言。

事实上,我可以验证负数量。 我不明白。

实体:

/* src/Clicproxy/***Bundle/Entity/Inventory.php */
<?php

namespace Clicproxy\***Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;


/**
 * Inventory
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Clicproxy\***Bundle\Entity\InventoryRepository")
 * @UniqueEntity(fields="audit, name", message="entity.inventory.unique")
 */
class Inventory
{
    /* [...] */

    /**
     * @var integer
     *
     * @ORM\Column(name="quantity", type="integer", nullable=true)
     * @Assert\GreaterThan(value = 1)
     */
    private $quantity;

[...]

FormType:

/* src/Clicproxy/***Bundle/Form/InventoryCollabType.php */
<?php

namespace Clicproxy\***Bundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class InventoryCollabType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('quantity', null, array('label' => 'entity.inventory.quantity'))
            ->add('pageCostBlack', null, array('label' => 'entity.inventory.pagecostblack'))
            ->add('pageCostColor', null, array('label' => 'entity.inventory.pagecostcolor'))
            ->add('avMonthPagesBlack', null, array('label' => 'entity.inventory.avmonthpagesblack'))
            ->add('avMonthPagesColor', null, array('label' => 'entity.inventory.avmonthpagescolor'))
        ;
    }

    /* [...] */
}

控制器:

public function configAction (Request $request, $slug)
{
    $em = $this->getDoctrine()->getManager();
    $audit = $em->getRepository('Clicproxy***Bundle:Audit')->findOneBy(array('slug' => $slug));

    if (!$audit instanceof Audit) {
        throw $this->createNotFoundException('wizard.config.notfound');
    }

    $audit->addInventoriesFromEquipments($em->getRepository('Clicproxy***Bundle:Equipment')->findBy(array(), array('optimized' => 'ASC', 'name'=> 'ASC')));

    $form = $this->createCreateConfigForm($audit);

    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($audit);
        foreach ($audit->getInventories() as $inventory) {
            $inventory->setAudit($audit);
            $em->persist($inventory);
        }
        $em->flush();

        /* [...] */

        return $this->redirect($this->generateUrl('wizard_result', array('slug' => $audit->getSlug())));
    }

    /* [...] */

    return array(
        'audit' => $audit,
        'form'   => $form->createView(),
        'tabactive' => 2,
    );
}

有没有人对我的背景有所了解?

感谢您的支持, 大卫。

编辑: 最后,我在下面写下这段代码,您的意见?

public function configAction (Request $request, $slug)
{
    $em = $this->getDoctrine()->getManager();
    $audit = $em->getRepository('Clicproxy***Bundle:Audit')->findOneBy(array('slug' => $slug));

    if (!$audit instanceof Audit) {
        throw $this->createNotFoundException('wizard.config.notfound');
    }

    $audit->addInventoriesFromEquipments($em->getRepository('Clicproxy***Bundle:Equipment')->findBy(array(), array('optimized' => 'ASC', 'name'=> 'ASC')));

    $form = $this->createCreateConfigForm($audit);

    $form->handleRequest($request);

    if ($form->isValid()) {
        $validator = $this->get('validator');
        $errors_messages = array();
        foreach ($audit->getInventories() as $inventory)
        {
            $violations = $validator->validate($inventory);
            if (0 < $violations->count()) 
            {
                $error_message = substr($violations, strpos($violations, ':')+2);
                if (! in_array($error_message, $errors_messages, true)) {
                    $errors_messages[] = $error_message;
                    $this->get('session')->getFlashBag()->add('error', $error_message);
                }

            }
        }
        if (! $this->get('session')->getFlashBag()->has('error'))
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($audit);
            foreach ($audit->getInventories() as $inventory) {
                $inventory->setAudit($audit);
                $em->persist($inventory);
            }
            $em->flush();

            /* [...] */

            return $this->redirect($this->generateUrl('wizard_result', array('slug' => $audit->getSlug())));
        }
    }


    return array(
        'audit' => $audit,
        'form'   => $form->createView(),
        'tabactive' => 2,
    );
}

感谢您的支持。

1 个答案:

答案 0 :(得分:0)

您没有验证您的实体,只是您的表单。

当你打电话给$form->isValid()表明你的学说实体正在被证实时,这是一个常见的错误,但事实并非如此。

您需要显式调用验证器服务并将其与表单验证分开处理。

这看起来像这样:

$validator = $this->get('validator');
$errors = $validator->validate($inventory);

if (count($errors) > 0) {
    // Handle errors here
}

有关详细信息,请查看validation documentation