Контроллер должен вернуть ответ, действие никогда не выполняется

У меня есть этот код в моем контроллере:

/**
 * Displays a form to create a new Bank Account
 *
 * @Route("/account/new", name="wba_new")
 * @Method("GET")
 * @Template("BankBundle:BankAccount:new.html.twig")
 */
public function newBankAccountAction() {
    $entity = new Account();
    $form = $this->createForm(new AccountType(), $entity);

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

/**
 * Handle bank account creation
 *
 * @Route("/", name="wba_create")
 * @Method("POST")
 */
public function createAction(Request $request) {
    $entity = new Account();
    $form = $this->createForm(new AccountType(), $entity);
    $form->handleRequest($request);

    print_r($request);
    exit;

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('wba_list'));
    }

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

Когда я вызываю /account/new, форма отображается без проблем, и действие переходит к /, но когда я отправляю форму, я получаю эту ошибку:

Контроллер должен вернуть ответ (Array(entity => Object(BankBundle\Entity\AccountType), form => Object(Symfony\Component\Form\FormView)) задан).

Почему? Что не так в моем коде?

ОБНОВЛЕНИЕ

Я нашел, в чем проблема, у меня есть два маршрута с одинаковым определением в двух разных контроллерах:

/**
 * Handle bank account creation
 *
 * @Route("/", name="wba_create")
 * @Method("POST")
 */

После устранения проблемы все работает


person Reynier    schedule 05.08.2013    source источник
comment
Разве действие контроллера не должно возвращать какой-то объект Response?   -  person Joachim Isaksson    schedule 05.08.2013
comment
@JoachimIsaksson не всегда, см. мой выпуск   -  person Reynier    schedule 05.08.2013
comment
@JoachimIsaksson прав. Вы забыли аннотацию @Template поверх вашей функции createAction().   -  person cheesemacfly    schedule 05.08.2013
comment
Контроллер всегда должен возвращать ответ. Аннотация шаблона обеспечивает визуализацию шаблона и построение ответа (и, в конечном итоге, его возврат).   -  person Jakub Zalas    schedule 05.08.2013
comment
пожалуйста, добавьте свое решение (имеющее два маршрута с одинаковым определением) в качестве ответа и примите его, чтобы вопрос был помечен как решенный. Хотя это было решением в вашем случае... я думаю, 95% людей, столкнувшихся с этой проблемой, забыли аннотацию SensioFramworkExtraBundle @Template или забыли активировать прослушиватель ответа представления FOSRestBundle... или любой другой прослушиватель, преобразующий данные, возвращаемые действием контроллера, в объект ответа автоматически.   -  person Nicolai Fröhlich    schedule 06.08.2013
comment
@nifr Я добавил, но не могу принять ответ до двух дней, поэтому я подожду и вернусь, чтобы принять ответ   -  person Reynier    schedule 06.08.2013


Ответы (1)


Прочитав код еще раз и попытавшись найти, где была моя ошибка, я, наконец, нашел. У меня было два контроллера: AccountController.php и TestController.php, и в обоих я определил (моя ошибка, потому что я просто скопировал AccountController.php в TestController.php) те же маршруты, что и в этой функции:

/**
 * Handle bank account creation
 *
 * @Route("/", name="wba_create")
 * @Method("POST")
 */
public function createAction(Request $request) {
    ...
}

По этой причине, как я понимаю, данные были потеряны, когда Symfony пытается вызвать маршрут wba_create. Я не добавил аннотацию @Template(""). Это решение, надеюсь, работает для всех, кто работает с той же проблемой.

person Reynier    schedule 06.08.2013