【问题标题】:Symfony2: Handling form submissionsSymfony2:处理表单提交
【发布时间】:2013-07-14 19:22:32
【问题描述】:

这是我第一次尝试处理表单,我正在关注官方documentation for Symfony 2.3。显示表单已成功,但我无法处理。

我收到以下错误:

可捕获的致命错误:参数 2 传递给 Symfony\Component\Validator\Mapping\ClassMetadata::addPropertyConstraint() 必须是 Symfony\Component\Validator\Constraint 的实例,数组 给定的,调用的 /home/torob/lampstack-5.4.16-0/apache2/htdocs/A/vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php 在第 90 行并在 /home/torob/lampstack-5.4.16-0/apache2/htdocs/A/vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/ClassMetadata.php 第 193 行

500 内部服务器错误 - ContextErrorException

这是我的控制器:

public function newIdeaPostAction(Request $request){
    $idea = new Idea();

    $form = $this->createFormBuilder($idea)
        ->add('title', 'text')
        ->add('shortDescription', 'text')
        ->add('valueDescription', 'text')
        ->add('description', 'textarea')
        ->add('Next', 'submit')
        ->getForm();

    $form->handleRequest($request);

    if($form->isValid()){
        return $this->redirect($this->generateUrl('ideside_idea_success'));
    }
}

我知道是方法调用$form->handleRequest($request) 造成了错误。我还尝试使用 2.1 文档中的“旧方式”(他们说 handleRequest 方法是新的):

if ($request->isMethod('POST')) {
    $form->bind($request);
    if ($form->isValid()) {
        // perform some action, such as saving the task to the database
        return $this->redirect($this->generateUrl('task_success'));
    }
}

这给了我同样的错误。

额外信息:

路线如下:

ideside_newidea_post:
  path: /post/idea
  defaults:  { _controller: IdesideIdeaBundle:Default:newIdeaPost }
  methods:  [POST]

这里是堆栈跟踪(...nameofproject/vendor/symfony/symfony/src/Symfony/Component/Validator/Mapping/ClassMetadata.php):

 *
 * @return ClassMetadata This object
 */
public function addPropertyConstraint($property, Constraint $constraint)
{
    if (!isset($this->properties[$property])) {
        $this->properties[$property] = new PropertyMetadata($this->getClassName(), $property);

这是我的 validation.yml(虽然我不知道它是否相关,因为错误发生在我的控制器中调用 isValid 函数之前):

Ideside\IdeaBundle\Entity\Idea:
    properties:
        title:
            - NotBlank: {message: "blabla"}
        shortDescription:
            - NotBlank: {message: "blabla"}
            - Length: {max: 115, maxMessage: "blabla", min: 6, minMessage: "blabla"}
        valueDescription:
            -Length: {max: 115, maxMessage: "blabla", min: 5, minMessage: "blabla"}
        description:
            - Length: {max: 5000, maxMessage: "blabla"}

如果这被证明是某种愚蠢的错误,很抱歉打扰你们。 如果你们中的任何人可以帮助我解决这个问题,那么您将是对我的很大帮助(如果我们的项目按预期进行,可能还会帮助整个世界)。

【问题讨论】:

  • bind() 被称为submit(),因为我认为是 Symfony 2.2
  • 谢谢你的提示!
  • 在重试旧的做事方式时,我尝试将 $form->bind($request) 替换为 $form->submit($request),但我仍然遇到同样的错误。 (顺便说一句,如果你觉得这很有趣:似乎他们仍然在 2.2 文档中使用 bind(),但是现在在 Php-storm 中键入 bind() 时,我被告知它已被贬值。)

标签: symfony


【解决方案1】:

哇,这个我花了一段时间才弄明白......你只是在你的 valueDescription 长度属性中错过了破折号和“L”之间的空格。

Ideside\IdeaBundle\Entity\Idea:
    properties:
        title:
            - NotBlank: {message: "blabla"}
        shortDescription:
            - NotBlank: {message: "blabla"}
            - Length: {max: 115, maxMessage: "blabla", min: 6, minMessage: "blabla"}
        valueDescription:
            // This is the original line
            // You do not have a space between the dash and Length
            // -Length: {max: 115, maxMessage: "blabla", min: 5, minMessage: "blabla"}
            // It should be this
            - Length: {max: 115, maxMessage: "blabla", min: 5, minMessage: "blabla"}
        description:
            - Length: {max: 5000, maxMessage: "blabla"}

【讨论】:

  • 谢谢!!这解决了问题。好吧,我当然不会再犯那个错误了。不知道如果没有像你这样的好人的帮助,我会做什么。如果您在特隆赫姆想喝啤酒,请告诉我。
  • 没问题,总是乐于提供帮助!
  • 我遇到了同样的错误,无法弄清楚。一个类似的解决方案对我有用。我在 yaml 文件中缺少 groups 属性的缩进。
猜你喜欢
  • 2015-03-26
  • 2017-01-26
  • 2016-11-10
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2014-02-03
相关资源
最近更新 更多