2012-05-16 12 views
7

Tengo un servicio que busca datos para una página, pero si esos datos no se encuentran, debe redireccionar a la página de inicio. Por mi vida, no puedo entender cómo hacer esto en Sf2. Hay tantas formas diferentes de trabajar con servicios y enrutadores, pero ninguno parece funcionar.Redirigir desde un servicio en Symfony2

namespace Acme\SomeBundle\Services; 

use Acme\SomeBundle\Entity\Node; 
use \Doctrine\ORM\EntityManager; 
use \Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use \Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use \Symfony\Bundle\FrameworkBundle\Routing\Router; 
use \Symfony\Component\Routing\Generator\UrlGenerator; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class NodeFinder 
{ 

    private $em; 
    private $router; 

    public function __construct(EntityManager $em, Router $router) 
    { 

     $this->em = $em; 
     $this->router = $router; 

    } 

    public function getNode($slug) 
    { 

     $node = $this->em->getRepository('SomeBundle:Node')->findOneBy(array('slug' => $slug)); 

     if (!$node) { //if no node found 

       return $this->router->redirect('homepage', array(), true); 
     } 
} 

Respuesta

6

En Symfony2, los servicios no están hechos para las redirecciones. Usted debe tratar de cambiar su servicio como eso:

namespace Acme\SomeBundle\Services; 

use Acme\SomeBundle\Entity\Node; 
use \Doctrine\ORM\EntityManager; 

class NodeFinder 
{ 

    private $em; 

    public function __construct(EntityManager $em) 
    { 

     $this->em = $em; 

    } 

    public function getNode($slug) 
    { 

     $node = $this->em->getRepository('SomeBundle:Node')->findOneBy(array('slug'=>$slug)); 

     return ($node)?true:false; 
} 

después en su controlador llama a su servicio y hacer el cambio de dirección:

//in the controller file 

$nodefinder = $this->container->get('your_node_finder_service_name'); 

if(!$nodefinder->getNode($slug)){ 

    $this->redirect('homepage'); 
} 
+2

Gracias. El problema es que utilizo este servicio en muchos lugares, por lo que hay mucha duplicación de código haciendo la redirección en el controlador. – Acyra

+0

Está bien, debería hacer cualquier redirección en su controlador, no en su servicio. –

+3

@ChrisMcKinnel porque? Tengo muchas veces 'si el usuario no está conectado, redirigir a la página de inicio de sesión' realmente? Tengo que duplicar esto 100 veces? malo malo malo – Toskan

4

que podría hacer esto en su servicio (escritura de la cabeza)

class MyException extends \Exception{ 
public $redirectResponse; //is a \Symfony\Component\HttpFoundation\RedirectResponse 
} 
class MyService { 

public function doStuff(){ 
if ($errorSituation){ 
    $me = new MyException() 
    $me->redirectResponse = $this->redirect($this->generateUrl('loginpage')); 
    throw $me; 
} 
} 

} 

class MyController extends Controller{ 

public function doAction(){ 
try{ 
    //call myservice here 
}catch (MyException e){ 
    return $e->redirectResponse; 
} 
} 

Aunque esto no es perfecta, es sin duda mucho mejor que lo que sllly estaba tratando de hacer

2

inyectar el enrutador servicio en su servicio. De lo que puede devolver new RedirectResponse. Mire here.

Cuestiones relacionadas