Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Symfony 2.3 Conocer la IP en las retrollamadas

Estas en el tema de Symfony 2.3 Conocer la IP en las retrollamadas en el foro de Symfony en Foros del Web. Hola gente. Resulta que estoy armando una entidad a la cuál he configurado el ciclo de vida de las retrollamadas y en ella he configurado ...
  #1 (permalink)  
Antiguo 04/02/2014, 20:15
 
Fecha de Ingreso: julio-2011
Ubicación: Bogotá
Mensajes: 34
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Symfony 2.3 Conocer la IP en las retrollamadas

Hola gente.

Resulta que estoy armando una entidad a la cuál he configurado el ciclo de vida de las retrollamadas y en ella he configurado el evento de vida prePersist para que antes de insertar me diligencie la fecha del sistema y también para que me diligencie la ip desde la cual realizan el cambio y he ahí el problema.

No he podido capturar la IP en esta Entidad.

Alguien me podría ayudar por favor, adjunto el código de mi entidad.

<?php

namespace ANM\PruebasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\Request;

/**
* ANM\PruebasBundle\Entity\TipoIdentificacion
*
* @ORM\Table(name="prb_tipo_identificacion")
* @ORM\Entity(repositoryClass="ANM\PruebasBundle\Ent ity\TipoIdentificacionRepository")
* @ORM\HasLifecycleCallbacks()
*/
class TipoIdentificacion
{

/**
* @ORM\PrePersist
*/
public function prePersist()
{
$this->setFechaHoraModificacion (new \DateTime);
$ip=$this->container->get('request')->getClientIp();
//$container = new Request();
//$ip=$container->get('request')->server->getClientIp();
// $ip = $container->get('request')->server->get("REMOTE_ADDR");
$this->setIp ($ip);
}

/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

.....

}
  #2 (permalink)  
Antiguo 05/02/2014, 05:55
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

Exponer el container a una entidad es mala practica, para lo que quieres lograr deberias utilizar(cuando no...) un listener http://symfony.com/doc/master/cookbo...bscribers.html, ten en cuenta que en tu caso al listener tienes que inyectarle el request ;), e.g:
Código PHP:
Ver original
  1. class RegisterIPListener
  2. {
  3.     protected $request;
  4.    
  5.     public function __construct(Request $request)
  6.     {
  7.       $this->request = $request;
  8.     }
  9.    
  10.     public function prePersist(LifecycleEventArgs $args)
  11.     {
  12.         $entity = $args->getEntity();
  13.         if ($entity instanceof MyAwesomeEntity) {//
  14.           $entity->setIp($request->getClientIp());              
  15.         }
  16.     }
  17. }
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 05/02/2014, 10:27
 
Fecha de Ingreso: julio-2011
Ubicación: Bogotá
Mensajes: 34
Antigüedad: 12 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

masterpuppet muchas gracias por tu respuesta.

Intentaré realizar tus instrucciones y te cuento. (Implementaré mi primer escucha en la vida jejeje)

Un abrazo desde Bogotá.

  #4 (permalink)  
Antiguo 06/02/2014, 15:49
 
Fecha de Ingreso: julio-2011
Ubicación: Bogotá
Mensajes: 34
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

Cita:
Iniciado por masterpuppet Ver Mensaje
Exponer el container a una entidad es mala practica, para lo que quieres lograr deberias utilizar(cuando no...) un listener [URL]http://symfony.com/doc/master/cookbook/doctrine/event_listeners_subscribers.html[/URL], ten en cuenta que en tu caso al listener tienes que inyectarle el request ;), e.g:
Código PHP:
Ver original
  1. class RegisterIPListener
  2. {
  3.     protected $request;
  4.    
  5.     public function __construct(Request $request)
  6.     {
  7.       $this->request = $request;
  8.     }
  9.    
  10.     public function prePersist(LifecycleEventArgs $args)
  11.     {
  12.         $entity = $args->getEntity();
  13.         if ($entity instanceof MyAwesomeEntity) {//
  14.           $entity->setIp($request->getClientIp());              
  15.         }
  16.     }
  17. }
Hola de nuevo, te cuento que ya he logrado crear el servicio que hace que el prePersist se encargue de actualizar la entidad.

Definí el servicio, pero vaya problema en el que me he metido al intentar inyectarle el Request

Llevo ya casi 14 horas intentando solucionarlo y no he podido, me he leído cuanta cosa encuentro, he probado muchas cosas pero la verdad siempre obtengo la misma ScopeWideningInjectionException.

Mira, mi archivo de configuración en YAML para el servicio es el siguiente:

Código:
services:
    mi.escucha:
        class: ANM\PruebasBundle\EventListener\RegisterIPListener
        tags:
                - { name: doctrine.event_listener, event: prePersist }
        scope: request
Y mi archivo del servicio es este:

Código:
<?php

namespace ANM\PruebasBundle\EventListener;

use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Event\LifecycleEventArgs;

class RegisterIPListener
{
    protected $request;
   
    public function __construct(Request $request)
    {
      $this->request = $request;
    }
   
    public function prePersist(LifecycleEventArgs $args)
    {
        
        $entity = $args->getEntity();
          $entity->setIp($request->getClientIp());              
    }
    
}
Mil gracias por su ayuda.

Última edición por aprendiz7; 06/02/2014 a las 15:51 Razón: corregí el nombre de bundle de pruebas pues lo copie mal
  #5 (permalink)  
Antiguo 06/02/2014, 16:39
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

Cierto, inyecta el container y accede al request a traves de este , lejos esta de ser lo ideal pero inyectar el request puede ser un dolor de eggs, esto esta solucionado en la versión 2.4 donde se puede inyectar el request_stack ;) , también ten en cuenta que instanceof en el persist es importante, sin este va a intentar inyectar la ip en cualquier entity.

Saludos
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 06/02/2014, 16:49
 
Fecha de Ingreso: julio-2011
Ubicación: Bogotá
Mensajes: 34
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

Hola a todos, me respondo, resulta que lo pude hacer por fin,

lo dejo documentado por si alguien llega a necesitarlo:

CAPTURAR LA IP Y EL USUARIO EN UNA RETROLLAMADA:
Código:
<?php

namespace ANM\PruebasBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;

class RegisterIPListener
{
    protected $container;
   
    public function __construct(ContainerInterface $container)
    {
      $this->container = $container;
    }
   
    public function prePersist(LifecycleEventArgs $args)
    {
        
        $entity = $args->getEntity();
        $entity->setIp($this->container->get('request')->getClientIp());                         
        $entity->setFechaHoraModificacion (new \DateTime);  
    $entity->setUsuarioModificacion($this->container->get('security.context')->getToken()->getUser() );              
        }
    }
    
}
Y ahora les dejo la configuración del servicio para este caso:

Código:
    mi.escucha:
        class: ANM\PruebasBundle\EventListener\RegisterIPListener
        tags:
                - { name: doctrine.event_listener, event: prePersist }
        arguments: ["@service_container"]
Hasta una nueva oportunidad
  #7 (permalink)  
Antiguo 06/02/2014, 16:53
 
Fecha de Ingreso: julio-2011
Ubicación: Bogotá
Mensajes: 34
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Symfony 2.3 Conocer la IP en las retrollamadas

Cita:
Iniciado por masterpuppet Ver Mensaje
Cierto, inyecta el container y accede al request a traves de este , lejos esta de ser lo ideal pero inyectar el request puede ser un dolor de eggs, esto esta solucionado en la versión 2.4 donde se puede inyectar el request_stack ;) , también ten en cuenta que instanceof en el persist es importante, sin este va a intentar inyectar la ip en cualquier entity.

Saludos
Sí señor, así lo hice, mil gracias!

Etiquetas: conocer, ip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:56.