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

Re direccionar en servicio

Estas en el tema de Re direccionar en servicio en el foro de Symfony en Foros del Web. Hola. Alguno sabrá como se puede hacer un “redirect()” desde un servicio? Que parámetros he de pasar al servicio?. Tengo esto. Services.yml Código PHP: services ...
  #1 (permalink)  
Antiguo 05/08/2014, 16:48
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 10 meses
Puntos: 0
Re direccionar en servicio

Hola.
Alguno sabrá como se puede hacer un “redirect()” desde un servicio? Que parámetros he de pasar al servicio?. Tengo esto.

Services.yml
Código PHP:
services:
    
mi_acceso:
        class:        
SistemaMasterBundleControllerMyServicioController
        calls
:
         - [
setUserFromSecurityContext, ["@security.context"]]
         - [
setEntityManager, ["@doctrine.orm.entity_manager"]]
         - [
setRequest, [@request_stack]] 
MyServicio.php
Código PHP:
public function setEntityManager(ObjectManager $em)
{
   
$this->em $em;
}

public function 
setUserFromSecurityContext(SecurityContext $securityContext)
{
    
# notice, there are a cases when `getToken()` returns null, so improve this
    
$this->user $securityContext->getToken()->getUser();
}

 public function 
setRequest(RequestStack $request_stack)
{
    
$this->request $request_stack->getCurrentRequest();


Los tres "seters" me funcionan bien. No se como hacerle para el redirect(). Alguno me echa una mano? Todo esto en Symfony 2.4 :P

Última edición por Esdras_mtz; 05/08/2014 a las 17:06
  #2 (permalink)  
Antiguo 06/08/2014, 08:55
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Re direccionar en servicio

Extiende el ContainerAware y en donde defines el servicio usa el metodo setContainer y pasa como argumento el @service_container. con eso dispones de los servicios que requieres.
Para la redirección solo crea una instancia de RedirectResponse.
Código PHP:
Ver original
  1. use Symfony\Component\HttpFoundation\RedirectResponse;
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 06/08/2014, 11:45
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Re direccionar en servicio

Gracias hhs me has ayudado bastante no me marca ningún error, pero por alguna razón no me re direcciona, el código quedo as:
Services.yml
Código PHP:
services:
    
my_acceso:
        class:        
SistemaMasterBundleControllerServicioAccesoController
        calls
:
         - [
setUserFromSecurityContext, ["@security.context"]]
         - [
setEntityManager, ["@doctrine.orm.entity_manager"]]
         - [
setRequest, [@request_stack]]
         - [
setRouter, [@router]] // para poder utilizar el "generate('my_route')", segun yo :P 
         
- [setContainer, [@service_container]] 
MyServico
Código PHP:
//...
use SymfonyComponentRoutingGeneratorUrlGeneratorInterface;
use 
SymfonyComponentHttpFoundationRedirectResponse;
use 
SymfonyComponentDependencyInjectionContainerAware;

class 
ServicioAccesoController extends ContainerAware {
    
//...
    
protected $router;

public function 
AccesoAction($Seccion){
       
$this->Redireccionar($Seccion);
        return 
"$variable";
}

public function 
Redireccionar($Seccion){
    if(
$Seccion){
    
$url$this->router->generate('Mostrar_Usuarios');
     return new 
RedirectResponse($url);    //Aqui deberia redireccionarme pero pasa de esto XD
    
}
}


 public function 
setRouter(UrlGeneratorInterface $router)
{
    
$this->router $router;
}

//.....

Sera que estoy llamando mal el RedirectResponse?
  #4 (permalink)  
Antiguo 06/08/2014, 16:49
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Re direccionar en servicio

Solo necesitas el setContainer en las llamadas
Código PHP:
Ver original
  1. services:
  2.     my_acceso:
  3.         class:        SistemaMasterBundle\ControllerServicio\AccesoController
  4.         calls:
  5.          - [setContainer, [@service_container]]
Para direccionar
Código PHP:
Ver original
  1. $url = $this->get('router')->generate(
  2.         'Mostrar_Usuarios'
  3.     ));
  4. return new RedirectResponse($url);

Por cierto es términos generales los servicios no gestionan por ellos mismos la redirección lo mas común es que se delega la responsabilidad a quien tiene la información para hacerlo como el controller o un evento.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 06/08/2014, 18:15
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Re direccionar en servicio

Hola hhs
Te refieres a que los servicios no deben o simplemente no pueden?.

Coloque tal cual me indicas y me marca error:” FatalErrorException: Error: Call to undefined method Sistema\MasterBundle\Controller\ServicioAccesoCont roller::get()”.

Llame el get() mediante el container y ya no marcó error pero me sigue sin reedireccionar, quite todo el código innecesario para realizar lo que quiero y me sigue sin funcionar lo tengo asi:

services.yml
Código PHP:
services:
    
my_acceso:
        class:        
SistemaMasterBundleControllerServicioAccesoController
        calls
:  
         - [
setContainer, [@service_container]] 
ServicioAcceso
Código PHP:
use SymfonyComponentHttpFoundationRedirectResponse;
use 
SymfonyComponentDependencyInjectionContainerAware;


class 
ServicioAccesoController extends ContainerAware {

  public function 
AccesoAction($Seccion){
            
        
$this->AccesobySeecionAction($Seccion);
        return 
$Seccion;
   }

public function 
AccesobySeecionAction($Seccion){
        
$url $this->container->get('router')->generate('Mostrar_Usuarios');
         return new 
RedirectResponse($url);
}

Controlador
Código PHP:
public function EditarTiendaAction(Request $request) {
//....
$UT=$this->get('my_acceso')->AccesoAction('ConfigurarOpciones');
echo 
"NO hace la re-direccion y sigue el corriendo el codigo como si nada XD";
//....

Tendrás alguna idea de como ejecutar la instrucción desde el servicio?

Al final tendré que hacerle como dices, mandar la variable por el return y validar en el controlador si se debe re-direccionar y posteriormente hacerlo a la sección correspondiente. Es sol que tendré que modificar todos los controladores donde mando llamar mi servicio y quería gestionar todo mediante el servicio, y poder facilitar el mantenimiento de la aplicación.
  #6 (permalink)  
Antiguo 07/08/2014, 11:54
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Re direccionar en servicio

El servicio puede redireccionar pero no es lo común.
El problema a simple vista parece estar aqui:
Código PHP:
Ver original
  1. public function AccesoAction($Seccion){
  2.            
  3.         $this->AccesobySeecionAction($Seccion);
  4.         return $Seccion;
  5. }

El metodo devuelve $seccion y no el objeto RedirectResponse de tal forma que no obtienes lo que esperas en:
Código PHP:
Ver original
  1. public function EditarTiendaAction(Request $request) {
  2. //....
  3. $UT=$this->get('my_acceso')->AccesoAction('ConfigurarOpciones');
  4. echo "NO hace la re-direccion y sigue el corriendo el codigo como si nada XD";
  5. //....
  6. }
$UT contiene el valor de $seccion y aparte el método EditarrTiendaAction debe de devolver en el return el RedirectResponse.
Código PHP:
Ver original
  1. public function EditarTiendaAction(Request $request) {
  2. //....
  3. return $this->get('my_acceso')->AccesoAction('ConfigurarOpciones');
  4. echo "NO hace la re-direccion y sigue el corriendo el codigo como si nada XD";
  5. //....
  6. }

Puedes evaluar si te sirve usar eventos para lo que necesitas: http://isometriks.com/symfony2-custom-events
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: direccionar, servicio
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:29.