1

オブジェクトを更新しようとしています:

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
        ));
    }
}
4

1 に答える 1

1

編集

問題はエンティティの注釈にあることがチャットでわかりました。変数
@Assert\Valid()で使用されました。string

あなたはこれを持っているので、(文字列を渡す)のaction="{{ path('ymtest_EditArtist', {'id': artist.id}) }}"ようなURLを生成すると思います。 そして、type のオブジェクトを必要とするこれがあります。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
}

注意:$em->persist($artist);オブジェクトを更新するときに呼び出す必要はありません( http://symfony.com/doc/current/book/doctrine.html#updating-an-object )。

于 2013-02-07T17:31:23.683 に答える