Я читал раздел "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
Любой совет будет принят во внимание. Спасибо.
Чтобы переопределить методы 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
Для тех, кто заинтересован в переопределении базового класса 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();
Вы можете заметить разницу?
create
и __construct
для класса RequestЧтобы включить переопределение метода HTTP в symfony, вы должны определить http_method_override в config.yml
framework:
http_method_override: true