Контроллер должен вернуть ответ - PullRequest
6 голосов
/ 30 января 2012

Это мой контроллер:

    /**
 * Finds and displays a Formacion entity.
 *
 * @Route("/{id}/show", name="curso_show")
 * @Template()
 */
public function showAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $curso = $em->getRepository('GitekUdaBundle:Curso')->find($id);

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

    $deleteForm = $this->createDeleteForm($id);             

    // Detalle Formación
    $detcurso = new Detcurso();
    $formdetcurso   = $this->createForm(new DetcursoType(), $detcurso);

    return array(
        'curso'      => $curso,
        'delete_form' => $deleteForm->createView(),  
        'detcurso'      => $detcurso,
        'formdetcurso' => $formdetcurso,
        );
}

В моей среде разработки работает нормально (Mac), но когда я перехожу в производственную среду (сервер CentOS), я получаю

The controller must return a response (Array(curso => Object(Gitek\UdaBundle\Entity\Curso), delete_form => Object(Symfony\Component\Form\FormView), detcurso => Object(Gitek\UdaBundle\Entity\Detcurso), formdetcurso => Object(Symfony\Component\Form\Form)) given).

500 Внутренняя ошибка сервера - LogicException

Любая подсказка?

Ответы [ 7 ]

47 голосов
/ 30 января 2012

Похоже, анотация @Template не работает для вас. Проверьте конфигурацию http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/annotations/view.html, http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/index.html

20 голосов
/ 30 января 2012

Symfony2 ожидает, что объект Response будет возвращен из действия контроллера.Я предполагаю, что вы, вероятно, хотите что-то вроде следующего:

return $this->render(
    "YourBundlePath:Something:template.html.twig",
    array(
        'curso'        => $curso,
        'delete_form'  => $deleteForm->createView(),  
        'detcurso'     => $detcurso,
        'formdetcurso' => $formdetcurso,
    )
);

Метод $this->render() отрендерит предоставленное имя шаблона и в примере выше передаст шаблону ваш массив параметров.Он будет обернут этот сгенерированный контент в объект Response, что и ожидает Symfony2.

Вы также можете напрямую вернуть новый объект Response, например, return new Response('Hello, world'), если необходимо.

См. документация для более подробной информации.

5 голосов
/ 24 ноября 2012

Ну, у меня тоже была эта проблема, и этот пост был ближайшим к моей проблеме, но не решил ее, тогда я хочу написать здесь свое решение на случай, если у некоторых людей тоже возникнет моя проблема.

Кажетсячто есть проблема с аннотацией шаблона, как некоторые люди говорили выше, вы можете обойти эту проблему, используя функцию рендера, но я думаю, что это не очень хорошее решение, потому что аннотация @template пытается упростить управление этим шаблоном и используется по умолчаниюв генераторе Symfony Crud.

Итак, моя проблема была в том, что у меня установлен FosRestBundle, и мне пришлось отключить аннотации шаблонов при его установке, добавив следующие строки в config.yml:

#The view_annotations flag must be false to work with FOSRestBundle
sensio_framework_extra:
    view:
        annotations: false   

Вы должны удалить эти строки, чтобы аннотация @template снова заработала.Это странно, потому что у меня была эта проблема только после последнего обновления композитора, но не раньше.

Это проблема следования документации по установке пакета без понимания того, что вы делаете вообще, хе-хе ^ _ ^!

Надеюсь, это кому-нибудь поможет

3 голосов
/ 11 июля 2014

обновить файл конфигурации

sensio_framework_extra:
   view:
      annotations: true
1 голос
/ 30 января 2012

Как сказали Kox и Inori в комментарии, возврат $ this-> render - это не решение, а просто избежание проблемы.

Есть 2 варианта:

  • Шаблонная аннотация не импортируется. У вас есть заявление об использовании?
  • Шаблон не известен в производстве. CaseSensitive проблема? CentOs чувствителен к регистру, где Mac OS и Windows нет. template и Template - это не одно и то же.
  • Шаблон не импортируется. Вы запускали bin vendors/update в рабочем режиме в последнее время?
0 голосов
/ 06 июля 2016

Просто добавьте следующее в верхнюю часть вашего контроллера:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
0 голосов
/ 29 февраля 2012

Я только что столкнулся с той же проблемой после развертывания, и мне пришлось очистить кэш, чтобы symfony2 обратил внимание на мою недавно добавленную аннотацию @Template (переключено с $ this-> render ()). Убедитесь, что все в порядке с очисткой производственного кэша, прежде чем пытаться это сделать.

Из вашего каталога Symfony: Кэш приложения / консоли php: очистить --no-warmup --env = prod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...