Как объект ответа Symfony устанавливает заголовки http?

Я использую фреймворк Sliex. У меня была проблема с перенаправлением при использовании \Silex\Application::redirectметод. Я обнаружил, что когда я пытаюсь перенаправить с помощью http-заголовков, вместо symfony «send» ответ кажется вызывающим __toString метод.

Это мой вывод curl:

bash-4.2$ curl -v http://127.0.0.1:8082/
* About to connect() to 127.0.0.1 port 8082 (#0)
*   Trying 127.0.0.1...
* Adding handle: conn: 0x1ea0970
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x1ea0970) send_pipe: 1, recv_pipe: 0
* Connected to 127.0.0.1 (127.0.0.1) port 8082 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.32.0
> Host: 127.0.0.1:8082
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 20 Sep 2014 08:02:52 GMT
* Server Apache/2.4.10 (Fedora) PHP/5.5.15 is not blacklisted
< Server: Apache/2.4.10 (Fedora) PHP/5.5.15
< X-Powered-By: PHP/5.5.15
< Set-Cookie: PHPSESSID=*****; path=/
< Content-Length: 116
< Content-Type: text/html; charset=UTF-8
<
HTTP/1.0 302 Found
Cache-Control: no-cache
Date:          Sat, 20 Sep 2014 08:02:52 GMT
Location:      /login

* Connection #0 to host 127.0.0.1 left intact

Я не могу понять почему, но это перекликается с http-заголовками.

ОБНОВИТЬ

Мой сценарий выглядит примерно так:

<?php class Contorller {
public action( \Silex\Application $app ){
return $app->redirect('/login');
}
}

Маршрутный скрипт:

<?php
$core = new \Silex\Application;
$core->get("/another/action", "\\Controller::action")
$core->match("/login","\\AnotherController::login")->method('POST|GET');

Действие входа не имеет логики, и оно просто отображает шаблон ветки.

4

Решение

Вызов $ app-> redirect () возвращает новый RedirectResponse объект со статусом по умолчанию 302.

Следующее взято непосредственно из Документация по объекту ответа Symfony

Чтобы установить заголовки на объекте Symfony Response, используйте headers->set метод.

use \Symfony\Component\HttpFoundation\RedirectResponse;

class Controller {
public function action( \Silex\Application $app ){

$response = new RedirectResponse('/login', 302);

// the headers public attribute is a ResponseHeaderBag
$response->headers->set('Content-Type', 'text/plain');

return $response;
}
}

Ваш код работал отлично после того, как опечатки в именах методов были исправлены (Contorller изменился на Controller).

class Controller {
public function action( \Silex\Application $app ){
return $app->redirect('/login', 302);
}
}

class AnotherController {
public function login( \Silex\Application $app ){
return new Response($app['twig']->render('blank.html.twig'));
}
}

$app->get("/another/action", "\Controller::action");
$app->match("/login","\AnotherController::login")->method('POST|GET');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]