2012-05-16 8 views
7

Ich habe einen Dienst, der Daten für eine Seite sucht, aber wenn diese Daten nicht gefunden werden, sollte auf die Homepage umgeleitet werden. Für das Leben von mir kann ich nicht herausfinden, wie man das in Sf2 macht. Es gibt so viele verschiedene Möglichkeiten, mit Diensten und Routern zu arbeiten, aber keine scheint zu funktionieren.Redirect von einem Dienst in 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); 
     } 
} 

Antwort

6

In Symfony2 sind Dienste für Umleitungen nicht vorgesehen. Sie sollten versuchen, Ihren Dienst wie das zu ändern:

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; 
} 

dann in Sie Sie Ihren Service Controller anrufen und die Umleitung machen:

//in the controller file 

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

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

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

Vielen Dank. Das Problem ist, dass ich diesen Dienst an vielen Orten benutze, so dass es viele Code-Duplizierungen gibt, die die Weiterleitung im Controller machen. – Acyra

+0

Sally hat Recht, Sie sollten alle Weiterleitungen in Ihrem Controller vornehmen, nicht in Ihrem Dienst. –

+3

@ChrisMcKinnel weil? Ich habe viele Male 'wenn Benutzer nicht eingeloggt ist, Umleitung zur Anmeldeseite 'wirklich? Ich muss das 100 Mal duplizieren? schlecht schlecht schlecht – Toskan

4

Sie dies in Ihrem Dienst tun konnten (aus meinem Kopf zu schreiben

)
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; 
} 
} 

das ist zwar nicht perfekt, es ist sicherlich viel besser als das, was sllly versucht

2

Injizieren Sie die Router Service in Ihren Diensten. Dann können Sie eine neue RedirectResponse zurückgeben. Look here.

Verwandte Themen