Переопределить метод HTTP для запросов GET в symfony2

0

Я читал раздел "Faking the method with _method" по следующему URL-адресу: http://symfony.com/doc/current/cookbook/routing/method_parameters.html

После некоторых экспериментов я понял, что документация неясна или неточна. Можно переопределить HTTP-метод с помощью параметра _method, если браузер использует POST (а не GET) для выполнения запроса.

Symfony\Component\HttpFoundation\Запрос

public function getMethod()
    {
        if (null === $this->method) {
            $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));

            if ('POST' === $this->method) {
                if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
                    $this->method = strtoupper($method);
                } elseif (self::$httpMethodParameterOverride) {
                    $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST')));
                }
            }
        }

        return $this->method;
    }

В нашем приложении мы хотели бы переопределить метод HTTP для запросов GET, потому что мы используем JSONP. В нашем случае это не проблема безопасности, поскольку запросы подписываются с использованием токена CSRF.

Я нашел решение для этого в разделе "Переопределение запроса" здесь:

http://symfony.com/doc/current/components/http_foundation/introduction.html

Это потребует создания подкласса Symfony\Component\HttpFoundation\Request, перетаскивания метода getMethod() и установки его с помощью Request :: setFactory().

use Symfony\Component\HttpFoundation\Request;

Request::setFactory(function (
    array $query = array(),
    array $request = array(),
    array $attributes = array(),
    array $cookies = array(),
    array $files = array(),
    array $server = array(),
    $content = null
) {
    return SpecialRequest::create(
        $query,
        $request,
        $attributes,
        $cookies,
        $files,
        $server,
        $content
    );
});

$request = Request::createFromGlobals();

Мой вопрос:

Единственное, что я могу сделать для этого, - это app.php/app_dev.php/app_test.php. Например:

require_once __DIR__.'/../app/AppKernel.php';

$kernel = new AppKernel($env, $is_debug);
$kernel->loadClassCache();

// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
//Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

Будет ли это подходящим местом для этого?

Я посмотрел на события ядра, такие как kernel.request, но на данный момент кажется слишком поздно, чтобы событие было полезным:

"1) Ядро. Задание Событие. Типичные цели. Чтобы добавить дополнительную информацию в запрос, инициализировать части системы или, если возможно, вернуть ответ (например, уровень безопасности, который запрещает доступ)".

http://symfony.com/doc/current/components/http_kernel/introduction.html

Любой совет будет принят во внимание. Спасибо.

Теги:

3 ответа

1

Чтобы переопределить методы HTTP в symfony, это не так сложно, сначала добавьте метод параметра в свою маршрутизацию:

blog_update:
    path:     /blog/{slug}
    defaults: { _controller: AcmeDemoBundle:Blog:update }
    methods:   [PUT]

Далее, в зависимости от того, какую версию symfony вы используете, включите переопределение параметра параметра Http, как вы можете это сделать: (из файла symfony doc)

The _method functionality shown here is disabled by default in Symfony 2.2 and enabled by default in Symfony 2.3. To control it in Symfony 2.2, you must call Request::enableHttpMethodParameterOverride before you handle the request (eg in your front controller). In Symfony 2.3, use the http_method_override option.

теперь, если вы используете symfony FormBuilder, он должен добавить скрытый ввод с именем "_method", или вы можете добавить его самостоятельно, если вы не используете построитель форм symfony.

здесь полный документ: http://symfony.com/doc/current/cookbook/routing/method_parameters.html

  • 0
    Привет teeyo, я попробовал обе эти вещи. Это решение работает только в том случае, если браузер отправляет POST-запрос к серверу (см. Первый фрагмент кода выше). Мне нужно решение, которое работает с GET-запросами. Чтобы уточнить, запрос POST может быть преобразован с помощью _method в любой другой метод, но запрос GET не может.
  • 0
    Боюсь, что нет никакого способа сделать это, потому что symfony говорит, что это работает только с post, это как если метод GET не проверяет boder, если вы хотите переопределить метод.
Показать ещё 1 комментарий
0

Объект Overriding Request

Для тех, кто заинтересован в переопределении базового класса Request.

В документе есть ошибка, я пошлю PR для этого.


Следующий (см. Пример) неверен:

use Symfony\Component\HttpFoundation\Request;

Request::setFactory(function (
    array $query = array(),
    array $request = array(),
    array $attributes = array(),
    array $cookies = array(),
    array $files = array(),
    array $server = array(),
    $content = null
) {
    return SpecialRequest::create(
        $query,
        $request,
        $attributes,
        $cookies,
        $files,
        $server,
        $content
    );
});

$request = Request::createFromGlobals();

Правильно:

use Symfony\Component\HttpFoundation\Request;

Request::setFactory(function (
    array $query = array(),
    array $request = array(),
    array $attributes = array(),
    array $cookies = array(),
    array $files = array(),
    array $server = array(),
    $content = null
) {
    return new SpecialRequest(
        $query,
        $request,
        $attributes,
        $cookies,
        $files,
        $server,
        $content
    );
});

$request = Request::createFromGlobals();

Вы можете заметить разницу?

0

Чтобы включить переопределение метода HTTP в symfony, вы должны определить http_method_override в config.yml

framework:
    http_method_override: true

kernel.http_method_override

Ещё вопросы

Сообщество Overcoder
Наверх
Меню