从Symfony2中的服务重定向

Acy*_*yra 7 symfony

我有一个查找页面数据的服务,但是如果找不到该数据,则应该重定向到主页.对于我的生活,我无法弄清楚如何在Sf2中做到这一点.有许多不同的方法可以使用服务和路由器,但似乎都没有.

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);
        }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

在Symfony2中,不会为重定向提供服务.您应该尝试更改您的服务:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中你调用你的服务并进行重定向:

// in the controller file

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

if (!$nodefinder->getNode($slug)) {
    $this->redirect('homepage');
}
Run Code Online (Sandbox Code Playgroud)

  • @ChrisMcKinnel因为?我有很多次`如果用户没有登录,重定向到登录页面`真的吗?我必须复制这100次?坏坏 (3认同)
  • 谢谢.问题是我在很多地方使用这个服务,因此在控制器中进行重定向时会有很多代码重复. (2认同)

Tos*_*kan 5

你可以在你的服务中做到这一点(写出我的头脑)

class MyException extends \Exception
{
    /**
     * @var \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public $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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这并不完美,但它肯定比试图做的好多了