Почему ajax возвращает код 500 [ symfony3 ]

Добрый день всем. У меня проблема с запросом ajax в symfony3. В этом случае он возвращает код 200 и все в порядке. Это «грязный» пример кода, но с «хорошим» кодом я получаю ответ с кодом 500. Я знаю, что этот синтаксис более уместен. Итак, вопрос в том, как исправить синтаксис, который применяется к документации Symfony.

 /**
 * @Route("/ajax", name="ajax_handler")
 */
public function ajaxAction(Request $request) {

    if ($request->isXMLHttpRequest()) {
        if(isset($_POST['secret']))
        echo json_encode(array('ok'=>1));
        exit;
    }
}

Почему, если я напишу соответствующий "всем известному" синтаксису код, он вернет код 500?

  /**
     * @Route("/ajax", name="ajax_handler")
     */
    public function ajaxAction(Request $request) {

        if ($request->isXMLHttpRequest()) {
//            echo json_encode(array('ok' => 1));
//            exit;

            $response = new Response(json_encode(array('name' => $name)));
            $response->headers->set('Content-Type', 'application/json');

            return $response;
        }
    }

введите здесь описание изображения

JavaScript:

$(document).ready(function () {

                $(".add-one-email").click(function () {

                    var data = {"test": 1};

                    data = $.param(data);

                    $.ajax({
                    type:"POST",
                            dataType:"JSON",
                            url:"/ajax",
                            data: data,
                            success:function (s) {
                                alert(s['ok']);
                                }
                    });
                });

            });

if ($request->isXMLHttpRequest()) {
        $response = new Response('sadasdasd');
        return $response;
    }

In upper case it returns 500 StuckTrace:The controller must return a response | in vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php at line 171 |  if (null === $response) {
                    $msg .= ' Did you forget to add a return statement somewhere in your controller?';
                }
                throw new \LogicException($msg);

person Yevhenii Shashkov    schedule 26.08.2016    source источник
comment
Основное эмпирическое правило: если вы получаете 500, ваша ПЕРВАЯ остановка — это журналы ошибок сервера, чтобы получить подробную информацию о 500. Пока у вас нет этого, нет смысла возиться с вашим кодом или спрашивать, почему он не работает — есть просто НЕТ способа сказать, что вызвало 500. Возможно, приведенный выше код на 100% идеален, но у вас есть синтаксическая ошибка в файле .htaccess.   -  person Marc B    schedule 26.08.2016
comment
все в порядке, если я использую echo json_encode(); die();   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
Что находится в теле ответа AJAX?   -  person Jonnix    schedule 26.08.2016
comment
html страница с ошибками   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
@fonjeekay .. а ошибки есть?   -  person Jonnix    schedule 26.08.2016
comment
/enterBundle/Controller/DefaultController.php в строке 273 (строка 273: `$response = new Response(json_encode(array('name' =› $name)));`)   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
Полную ошибку пожалуйста. :)   -  person Jonnix    schedule 26.08.2016
comment
и, возможно, как обновление вопроса ...   -  person Jakumi    schedule 26.08.2016
comment
Возможно, потому что $name не существует.   -  person Jonnix    schedule 26.08.2016
comment
нет, $name=1; проверено... уже...   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
попробую очистить кеш   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
В описании вашего вопроса var $name не существует. Пожалуйста, проверьте это.   -  person yceruto    schedule 26.08.2016
comment
Вы действительно уверены в этом? Откуда такое значение? Кроме того, JsonResponse все упрощает, вы должны это проверить.   -  person Emanuel Oster    schedule 26.08.2016
comment
Не удается получить доступ к защищенному свойству Symfony\Component\BrowserKit\Response::$headers (внутренняя ошибка сервера 500)   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
BrowserKit\Response? Если это не изменилось для Symfony3, я бы ожидал тип HttpFoundation\Response... Похоже, вы могли импортировать неправильное пространство имен.   -  person Jonnix    schedule 26.08.2016
comment
используйте enterBundle\Entity\Users; используйте Symfony\Bundle\FrameworkBundle\Controller\Controller; используйте Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
используйте Symfony\Component\HttpFoundation\Request; используйте Symfony\Component\Form\Extension\Core\Type\PasswordType; используйте Symfony\Component\Form\Extension\Core\Type\RepeatedType; используйте Symfony\Component\Form\Extension\Core\Type\TextType; используйте Symfony\Component\Form\Extension\Core\Type\SubmitType; использовать PHPMailer; используйте enterBundle\Repository\usersRepository; используйте Doctrine\ORM\Query; используйте Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; используйте Symfony\Component\BrowserKit\Response;   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
Так что Symfony\Component\BrowserKit\Response; , вероятно, ошибается. Наверное, хочет быть Symfony\Component\HttpFoundation\Response   -  person Jonnix    schedule 26.08.2016
comment
в любом случае echo json_encode(array('ok'=>1)); покажите 200 в браузере, я могу использовать его, пока не решу BrowserKit   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
@fonjeekay Это работает только потому, что вы exit впоследствии, иначе у вас будет другая ошибка. Попробуйте исправить проблемы, а не просто обходить их   -  person Jonnix    schedule 26.08.2016
comment
используйте Symfony\Component\HttpFoundation\JsonResponse; вернуть новый JsonResponse(массив('ok' => 1)); работает хорошо   -  person Yevhenii Shashkov    schedule 26.08.2016
comment
Из Symfony 3.1 используйте: return $this->json(array('ok' => 1));   -  person malcolm    schedule 27.08.2016
comment
Я предлагаю использовать пакет FOSJSRouting   -  person Imanali Mamadiev    schedule 28.08.2016
comment
/ajax выглядит так, как будто он, вероятно, будет в производственной версии, вы уверены, что кеш очищен для производственной версии, если это так? Из-за этого у меня иногда возникает ошибка 500.   -  person Scott Flack    schedule 29.08.2016


Ответы (1)


Этот синтаксис работает хорошо

use Symfony\Component\HttpFoundation\JsonResponse;

  return new JsonResponse(array('ok' => 1));

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

person Yevhenii Shashkov    schedule 26.08.2016