Мне нужно сохранить IP-адрес пользователей, которые комментируют, в базе данных после отправки формы.
Есть ли какая-либо функция symfony2 для получения IP? Или любой другой способ получить IP?
Мне нужно сохранить IP-адрес пользователей, которые комментируют, в базе данных после отправки формы.
Есть ли какая-либо функция symfony2 для получения IP? Или любой другой способ получить IP?
Вы можете получить IP-адрес клиента с помощью службы запроса:
$this->container->get('request')->getClientIp();
В Symfony до 2.3 $this->container->get('request')->getClientIp()
работает только внутри контроллера основного запроса. В подчиненном контроллере всегда возвращается 127.0.0.1
. Если ваш проект использует подзапросы с Symfony 2.2, пуленепробиваемым решением является создание kernel.request
прослушивателя и сохранение IP-адреса из основного запроса в нем.
В Symfony 2.3 это было исправлено, поэтому для внутренних подпроцессов реальный IP-адрес переводится в список прокси-серверов, см. https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c
Поэтому вам нужно добавить параметр конфигурации 127.0.0.1
в trusted_proxies
, чтобы получить клиентский ip из запроса в подзапросах в Symfony 2.3+, но вы не должны этого делать на общем хостинге по соображениям безопасности.
Кроме того, 127.0.0.1
должен был быть добавлен в trusted_proxies
явно, если встроенный HTTP-кеш (AppCache
в web/app.php
) использовался до Symfony 2.3.20. Этот кеш пытается выглядеть как реальный обратный прокси и изменяет некоторые заголовки главного запроса. Исправлено в https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9
С Symfony 2.4 и в 3.x предпочтительный способ доступа к текущему запросу - либо использовать request_stack
service
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
или ввод запроса в контроллер, см. http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument
public function indexAction(Request $request)
{
$ip = $request->getClientIp();
}
Но проблема по поводу исключения 127.0.0.1 при использовании в подзапросах все еще применяется, но теперь вы можете попытаться явно ссылаться на главный запрос, используя
$this->container->get('request_stack')->getMasterRequest()->getClientIp();
FYI, Начиная с Symfony 2.0 параметр Request::getClientIp
$proxy
устаревший. Он будет удален в Symfony 2.3.
Вы можете использовать
$container->get('request')->server->get("REMOTE_ADDR");
или как @meze answer
$container->get('request')->getClientIp();
Для Symfony 2.6+ используйте следующий код (в вашем контроллере:
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
есть еще один способ вставить текущий IP-адрес клиента в любой вызов службы или метода:
acme.currentIP:
class: some\service\className
arguments:
- "@=service('request_stack').getCurrentRequest().getClientIp()"
Вы можете использовать следующее:
$request->server->get('REMOTE_ADDR');
Где $request - это объект запроса класса http://api.symfony.com/2.8/Symfony/Component/HttpFoundation/Request.html