J'ai besoin de stocker l'adresse IP des utilisateurs qui commentent, dans la base de données après la soumission du formulaire.
Existe-t-il une fonction symfony2 pour obtenir l'adresse IP? Ou tout autre moyen d'obtenir l'IP?
Vous pouvez obtenir l'adresse IP du client à l'aide du service de demande:
$this->container->get('request')->getClientIp();
Dans Symfony avant la version 2.3 $this->container->get('request')->getClientIp()
ne fonctionne que dans le contrôleur de requête principal. Dans le contrôleur de sous-requête, cela retourne toujours 127.0.0.1
. Si votre projet utilise des sous-requêtes avec Symfony 2.2, la solution à toute épreuve consiste à créer kernel.request
écouteur et enregistrez l'IP de la requête principale.
Dans Symfony 2.3 , ceci a été corrigé. Ainsi, pour les sous-requêtes internes, l'adresse IP réelle est poussée dans la liste des serveurs proxy, voir https: // github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Vous devez donc ajouter 127.0.0.1
à trusted_proxies
paramètre de configuration pour obtenir l'ip du client à partir de la requête dans les sous-requêtes dans Symfony 2.3+, mais vous ne devriez pas le faire sur un hébergement partagé pour des raisons de sécurité.
Également, 127.0.0.1
devait être ajouté à trusted_proxies
explicitement si cache HTTP intégré (AppCache
dans web/app.php
) a été utilisé avant Symfony 2.3.20. Ce cache tente de ressembler à un véritable proxy inverse et modifie certains en-têtes de la demande principale. Correction dans https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9
Depuis Symfony 2.4 et dans 3.x le moyen préféré d’accéder au courant demande est soit en utilisant request_stack
un service
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
ou en injectant une demande dans le contrôleur, voir http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument
public function indexAction(Request $request)
{
$ip = $request->getClientIp();
}
Mais le problème concernant l'exclusion de 127.0.0.1 lorsqu'il est utilisé dans des sous-requêtes reste valable, mais vous pouvez maintenant essayer de faire explicitement référence à la demande principale à l'aide de
$this->container->get('request_stack')->getMasterRequest()->getClientIp();
Pour Symfony 2.6+, utilisez le code suivant (dans votre contrôleur:
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
il existe également un autre moyen d'injecter l'IP du client actuel dans tout appel de service ou de méthode:
acme.currentIP:
class: some\service\className
arguments:
- "@=service('request_stack').getCurrentRequest().getClientIp()"