【问题标题】:How to valid a form which has collections in Symfony2?如何验证在 Symfony2 中有集合的表单?
【发布时间】:2014-07-23 15:47:25
【问题描述】:

我需要验证我的表格。我的表格有两个集合,但我无法验证它们...... 你知道我是怎么做到的吗?

卡入口类型:

namespace Dim\RestaurantBundle\Form\Type;
class CardEntryType extends AbstractType
{

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder->add('cardEntryContent', 'collection', array(
               'type'   => 'text',
               'prototype' => true,
               'allow_add'    => true,
               'allow_delete' => true,
               'by_reference' => false,
               'options'  => array(
                 'required'  => false,
                 'attr'      => array(
                   'class' => 'text',
                   'placeholder' => 'Nom de l\'entrée...',
                   'pattern' => '.{0,55}'),
               ),
             ))

             ->add('cardEntryPrice', 'collection', array(
               'type'   => 'text',
               'allow_add'    => true,
               'prototype' => true,
               'options'  => array(
                 'required'  => false,
                 'attr'      => array(
                   'class' => 'text',
                   'placeholder' => 'Prix de l\'entrée...',
                   'pattern' => '.{0,10}'),
               ),
             ));
  }

  public function getDefaultOptions(array $options)
  {
    return array(
      'data_class' => 'Dim\RestaurantBundle\Entity\TCardEntry',
    );
  }

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

}

实体的模型:

namespace Dim\RestaurantBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * TCardEntry
 *
 * @ORM\Table(name="t_card_entry")
 * @ORM\Entity
 */
class TCardEntry
{
    /**
     * @var integer
     *
     * @ORM\Column(name="card_entry_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $cardEntryId;

    /**
     * @var string
     *
     * @Assert\Length(
     *      min = "0",
     *      max = "55",
     *      minMessage = "Votre nom ne peut faire moins de {{ limit }} caractères.",
     *      maxMessage = "Votre nom ne peut faire plus de  {{ limit }} caractères."
     * )
     *
     * @ORM\Column(name="card_entry_content", type="text", nullable=false)
     */
    private $cardEntryContent;

    /**
     * @var string
     *
     * @Assert\Length(
     *      min = "0",
     *      max = "10",
     *      minMessage = "Votre nom ne peut faire moins de {{ limit }} caractères.",
     *      maxMessage = "Votre nom ne peut faire plus de  {{ limit }} caractères."
     * )
     *
     * @ORM\Column(name="card_entry_price", type="string", length=10, nullable=false)
     */
    private $cardEntryPrice;



    /**
     * Get cardEntryId
     *
     * @return integer 
     */
    public function getCardEntryId()
    {
        return $this->cardEntryId;
    }

    /**
     * Set cardEntryContent
     *
     * @param string $cardEntryContent
     * @return TCardEntry
     */
    public function setCardEntryContent($cardEntryContent)
    {
        $this->cardEntryContent = $cardEntryContent;

        return $this;
    }

    /**
     * Get cardEntryContent
     *
     * @return string 
     */
    public function getCardEntryContent()
    {
        return $this->cardEntryContent;
    }

    /**
     * Set cardEntryPrice
     *
     * @param string $cardEntryPrice
     * @return TCardEntry
     */
    public function setCardEntryPrice($cardEntryPrice)
    {
        $this->cardEntryPrice = $cardEntryPrice;

        return $this;
    }

    /**
     * Get cardEntryPrice
     *
     * @return string 
     */
    public function getCardEntryPrice()
    {
        return $this->cardEntryPrice;
    }
}

我的控制器:

namespace Dim\RestaurantBundle\Controller;

class AdministrationController extends Controller
{
    public function indexAction()
    {
      return $this->render('DimRestaurantBundle:Administration/Home:index.html.twig');
    }

    public function cardEntryAction(Request $request)
    {
      $TCardEntry = new TCardEntry();

      $form = $this->createForm(new CardEntryType(), $TCardEntry);

      if($request->isMethod('POST')) 
      {

        $form->bind($request);
        if($form->isValid()) 
        {

          die('form valid');

        }
      }

      return $this->render('DimRestaurantBundle:Administration/CardEntry:index.html.twig', array('form' => $form->createView()));
    }
}

当我提交表单时,我总是遇到同样的错误:

给定“字符串”、“数组”类型的预期参数

我很困惑...你有什么想法吗??

非常感谢!

【问题讨论】:

  • private $cardEntryPrice; 没有定义为集合(如ArrayCollection),而是定义为string
  • 感谢您的回复,但我不知道如何解决我的问题...

标签: validation symfony doctrine-orm


【解决方案1】:

这个错误实际上是 Symfony 2.5 的一个错误。

bug #11117 [Validator] 修复数组符号 PropertyPath::append() (jakzal)

更新日志:http://symfony.com/blog/symfony-2-5-1-released

为了解决这个问题,我已将 Symfony 2.5 更新为 Symfony 2.5.1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多