为什么在使用Symfony2绑定请求时会得到一个字符串?

时间:2013-02-07 17:08:54

标签: php forms validation symfony

我正在尝试更新对象:

public function editAction(Artist $artist)
    {

        if (!$artist) {
            throw $this->createNotFoundException('Unable to find Artist entity.');
        }

        // We create the form from the external re-usable form made in TestBundle/Form/artist.php
        $form = $this->createForm( new ArtistType, $artist);

        // We get the request type
        $request = $this->get('request');

        // If it is a POST request, the user validated the form
        if ($request->isMethod('POST')) {
          // We make the link Request <-> Form
          // Now, $request = Values entered by the user
          $form->bind($request);

          // We validate the values
          if ($form->isValid()) {
            // We save $artist in the DB
            $em = $this->getDoctrine()->getManager();
            $em->persist($artist);
            $em->flush();

            $this->get('session')->getFlashBag()->add('info', 'Artist edited successfully'); 

          // Everything is fine, we redirect the user
          return $this->redirect($this->generateUrl('ymtest_Artist'));
          }
        }

        // We pass the createView() form method to the viexw so that it can print the form if the user arrived on this page with a GET method (he didnt validate the form yet)
        return $this->render('YMTestBundle:Musician:edit.html.twig', array(
          'form' => $form->createView(),
          'artist' => $artist
        ));
    }

但是当我验证表格时,我得到一个例外:

  

类型对象或数组的预期参数,给定的字符串

我的表单如下:

{# src/YM/TestBundle/Resources/views/Musician/add.html.twig #}

{% extends "YMTestBundle::layout.html.twig" %}

{% block bodyAdmin %}

<div class="container">
    <form action="{{ path('ymtest_EditArtist', {'id': artist.id}) }}" method="post" {{ form_enctype(form) }}>
        <div class="row">
            {% if form_errors(form)|length != 0 %}
                <div class="span12 alert alert-error" style="margin-left:0px">
                    {# Les erreurs générales du formulaire. #}
                    {{ form_errors(form) }}
                </div>
            {% endif %}
        </div>


        <div class="row">
            <div class="span10 BoxesW">
                <div>
                    {{ form_label(form.name, "Artist Name") }}
                    {{ form_errors(form.name) }}
                    {{ form_widget(form.name) }}
                </div>
                <div>
                    {{ form_label(form.biography, "Artist Biography") }}
                    {{ form_errors(form.biography) }}
                    {{ form_widget(form.biography, {'attr':{'class': 'span10' }, 'id': 'wysiwyg' }) }}
                </div>
                {{ form_rest(form) }}
                </br>
                <div>
                    <input type="submit" class="btn btn-primary" />
                </div>
            </div>
        </div>
    </form>
</div>

{% endblock %}

路由是正确的,因为我在验证之前得到了表格。

感谢您的帮助

更新: 这是我的新控制器:

<?php

namespace YM\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityRepository;
use YM\TestBundle\Entity\Artist;
use YM\TestBundle\Form\ArtistType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

class MusicianController extends Controller
{
    /**
     * @Route("/Artist/edit/{id}")
     * @ParamConverter("artist", class="YMTestBundle:Artist")
     */
    public function editAction(Artist $artist)
    {

        if (!$artist) {
            throw $this->createNotFoundException('Unable to find Artist entity.');
        }

        // We create the form from the external re-usable form made in TestBundle/Form/artist.php
        $form = $this->createForm( new ArtistType, $artist);

        // We get the request type
        $request = $this->get('request');

        // If it is a POST request, the user validated the form
        if ($request->isMethod('POST')) {
          // We make the link Request <-> Form
          // Now, $request = Values entered by the user
          $form->bind($request);

          // We validate the values
          if ($form->isValid()) {
            // We save $artist in the DB
            $em = $this->getDoctrine()->getManager();
            $em->persist($artist);
            $em->flush();

            $this->get('session')->getFlashBag()->add('info', 'Artist edited successfully'); 

          // Everything is fine, we redirect the user
          return $this->redirect($this->generateUrl('ymtest_Artist'));
          }
        }

        // We pass the createView() form method to the viexw so that it can print the form if the user arrived on this page with a GET method (he didnt validate the form yet)
        return $this->render('YMTestBundle:Musician:edit.html.twig', array(
          'form' => $form->createView(),
          'artist' => $artist
        ));
    }
}

1 个答案:

答案 0 :(得分:1)

修改

我们在聊天中发现问题出在实体注释中 @Assert\Valid()变量上使用了string

你有这个action="{{ path('ymtest_EditArtist', {'id': artist.id}) }}"我想要生成一个像editArtist/1234这样的网址(所以传递一个字符串)。
然后你有public function editAction(Artist $artist)这个需要Artist类型的对象。

您应该将其更改为:

public function editAction($artistid)
{
    $em = $this->getDoctrine()->getManager();
    $artist= $em->getRepository('YourBundle:Artist')->find($artistid);

    if (!$artist) {
        throw $this->createNotFoundException('No artist found for id '.$artistid);
    }

    //Do whatever you want
}

<击>

备注:更新对象(http://symfony.com/doc/current/book/doctrine.html#updating-an-object)时无需致电$em->persist($artist);