Как получить IP-адрес пользователя в контроллере Symfony2?

51

Мне нужно сохранить IP-адрес пользователей, которые комментируют, в базе данных после отправки формы.

Есть ли какая-либо функция symfony2 для получения IP? Или любой другой способ получить IP?

Теги:
ip-address

6 ответов

124
Лучший ответ

Вы можете получить IP-адрес клиента с помощью службы запроса:

$this->container->get('request')->getClientIp();
  • 0
    Спасибо за быстрый ответ. Могу ли я узнать, откуда берется контейнер?
  • 14
    Хорошо, получилось так: $ ip = $ this-> container-> get ('request') -> getClientIp ();
38

В 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();
  • 0
    Я использую Symfony 2.3.11, но мои подзапросы по-прежнему возвращают 127.0.0.1 (мы не используем встроенное кэширование), поэтому мне кажется, что он все еще не исправлен.
  • 0
    @Shinhan Я изучил связанный код и обнаружил, что они приняли другой подход. Теперь внутренние подзапросы должны работать так же, как и внутренний HTTP-кеш. Я обновил ответ, но я не проверял решение.
Показать ещё 5 комментариев
17

FYI, Начиная с Symfony 2.0 Request::getClientIp параметр $proxy устаревший. Он будет удален в Symfony 2.3.

Вы можете использовать

$container->get('request')->server->get("REMOTE_ADDR");

или как @meze answer

$container->get('request')->getClientIp();
  • 0
    Только аргумент "proxy" для getClientIp устарел. github.com/symfony/symfony/compare/922c201...e5536f0.patch
  • 0
    Я обновляю свой ответ. Спасибо
Показать ещё 1 комментарий
6

Для Symfony 2.6+ используйте следующий код (в вашем контроллере:

      $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
  • 0
    Это для Symfony 2.4+ уже на самом деле.
0

есть еще один способ вставить текущий IP-адрес клиента в любой вызов службы или метода:

acme.currentIP:
    class: some\service\className
    arguments:
        - "@=service('request_stack').getCurrentRequest().getClientIp()"
  • 3
    это плохой подход. лучше внедрить стек запросов самостоятельно и захватить IP в конструкторе
  • 0
    @ Sharpy35 нет причин избегать такого подхода, я сомневаюсь, что IP-адрес клиента изменяется во время запроса?
-3

Вы можете использовать следующее:

$request->server->get('REMOTE_ADDR');

Где $request - это объект запроса класса http://api.symfony.com/2.8/Symfony/Component/HttpFoundation/Request.html

Ещё вопросы

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