2012-05-16 24 views
7

Bir sayfaya ilişkin verileri görüntüleyen bir hizmetim var, ancak bu veri bulunamazsa, ana sayfaya yönlendirmelisiniz. Hayatım boyunca bunu Sf2'de nasıl yapacağımı anlayamıyorum. Servis ve yönlendirici ile çalışmak için pek çok farklı yol var, ancak hiçbiri işe yaramıyor.Symfony2'deki bir Hizmetten Yeniden Yönlendirme

Symfony2'de
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); 
     } 
} 

cevap

6

, hizmetler yönlendirmeler için yapılmış değildir. Eğer hizmetlerini arayın kontrolör sonra

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

ve yeniden yönlendirme yapmak: Böyle hizmetinizi değiştirmeye çalışmalısınız

Eğer hizmetinde bu yapabileceğini
//in the controller file 

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

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

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

Teşekkür ederiz. Sorun şu ki bu hizmeti birçok yerde kullanıyorum, bu yüzden denetleyicide yeniden yönlendirme yapan bir çok kod çoğaltması var. – Acyra

+0

Sallly haklı, kontrol cihazınızda herhangi bir yönlendirme yapmalısınız, hizmetinizde değil. –

+3

@ChrisMcKinnel çünkü? Çok fazla kullanıcım var, eğer kullanıcı giriş yapmamışsa, giriş sayfasına yönlendirin gerçekten? Bunu 100 kere kopyalamak zorunda mıyım? kötü kötü kötü – Toskan

4

(kafamdan yazma) Bu rağmen

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

kesinlikle

2

hizmetinizdedir yönlendirici hizmeti enjekte edin. Daha sonra bir yeni RedirectResponse'u döndürebilirsiniz. here'a bakın.

İlgili konular