2015-10-23 8 views
0

У меня возникла проблема с созданием нового объекта Collection с формой. Я хочу создать новый объект Collection с формой, а затем перенаправить на страницу коллекций с помощью маршрута 'collection_user_collections' и увидеть новую коллекцию в списке коллекций пользователей. Но вместо того, чтобы при нажатии кнопки отправки на форме, я получаю следующее сообщение об ошибке:Symfony2: Невозможно создать новый объект с формой

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

Ниже мой код:

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*/ 
} 

Я использую CollectionType построить форму:

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'; 
} 
} 

Этот is createAction, здесь я попытался вставить имя пользователя пользователя и дату, когда была создана сущность. Я использую FOSUserBundle для управления пользователями приложения:

/** 
* @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 для формы:

<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> 
+0

Можете ли вы дать нам веточку, где вы визуализируете форму? – AndreaPosadino

ответ

1

Исключение вы получаете, как ожидается. Вы вызываете метод createForm без передачи всех необходимых аргументов. Правильный способ создания формы:

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

Я не думаю, что это правильное решение. Для createForm «действие» и «метод» необязательны. Исключение составляет другой маршрут (с «/ profile /»). – AndreaPosadino

+0

@tftd спасибо, это действительно помогло, теперь создается новая сущность. Но теперь я перенаправлен не на страницу профиля со всеми коллекциями, а на голой шаблон твига createAction ( – user3793667

+1

Это потому, что вам нужно исправить свой контроллер, чтобы перенаправить на правильный маршрут - 'return $ this-> redirectToRoute ('the_profile_route_name')' :) – tftd

Смежные вопросы