user3793667
user3793667

Reputation: 321

Symfony2: Can't create new entity with form

I am having problem with creating new Collection entity with Form. I want to create new Collection entity with form and then to be redirected to collections page with 'collection_user_collections' route, and be able to see new collection in user's collections list. But instead when I press submit button on form, I get following error:

      No route found for "POST /profile/": Method Not Allowed (Allow: GET, HEAD)

Below is my code:

class Collection{
/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

private $name;

private $url;

private $type;

const STATUS_PRIVATE = 0;
const STATUS_PUBLIC = 1;

/**
 * @ORM\ManyToOne(targetEntity="MyMini\UserBundle\Entity\User", inversedBy="collections")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
private $user;

private $date_created;

private $date_modified;

/* getters and setters are here*/
}

I am using CollectionType to build form:

class CollectionType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name','text')
        ->add('type', 'choice', array('choices' => array(
            Collection::STATUS_PRIVATE => 'Private',
            Collection::STATUS_PUBLIC => 'Public',
        )))
        ->add('save', 'submit', array('label' => 'Create Collection'))
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyMini\CollectionBundle\Entity\Collection'
    ));
}

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

This is createAction, here I tried to insert current user's username and date when entity was created. I am using FOSUserBundle to manage app users:

 /**
 * @Route("/create-collection/", name="collection_create_collection")
 * @Template()
 */
public function createAction(Request $request)
{

    $collection = new Collection();

    $user = $this->get('security.token_storage')->getToken()->getUser();

    $username = $user->getUsername();

    $form = $this->createForm(new CollectionType(), $collection);

    $form->handleRequest($request);
    if ($form->isValid() && $form->isSubmitted()) {

        $em = $this->getDoctrine()->getManager();
        $collection->setUser($user);
        $collection->setDateCreated(new \DateTime());
        $em->persist($collection);
        $em->flush();

        return $this->redirectToRoute('collection_user_collections', array('username' => $username));
    }

    return array('collection'=>$collection, 'form' => $form->createView());
}

Twig for form:

  <div class="collection-create">
    <h3 id="create-collection">Create a collection</h3>
    <a class="close-reveal-modal" aria-label="Close">&#215;</a>
    {{ form(form) }}
</div>

Upvotes: 0

Views: 458

Answers (1)

tftd
tftd

Reputation: 17032

The exception you're receiving is expected. You are calling the createForm method without passing all necessary arguments. The right way to create a form is:

$this->createForm(
    new CollectionType(),
    $collection,
    array(
        'action' => $this->generateUrl('collection_create_collection') ),
        'method' => 'PUT', // or 'POST'
    )
);

Upvotes: 1

Related Questions