我实际上有一个问题。 物业"数量" 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,
);
}
感谢您的支持。
答案 0 :(得分:0)
您没有验证您的实体,只是您的表单。
当你打电话给$form->isValid()
表明你的学说实体正在被证实时,这是一个常见的错误,但事实并非如此。
您需要显式调用验证器服务并将其与表单验证分开处理。
这看起来像这样:
$validator = $this->get('validator');
$errors = $validator->validate($inventory);
if (count($errors) > 0) {
// Handle errors here
}
有关详细信息,请查看validation documentation。