重定向服务 - symfony2

Abd*_*el5 6 symfony

我可以在服务中执行重定向到另一个控制器吗?

我已经根据@Artamiel提供的示例实现了一项服务.

我的控制器执行的功能代码如下所示:

 public function verifyanddispatch() {
        $session = $this->request->getSession();
        if(!$session->get("App_Books_Chosen_Lp")) return new RedirectResponse($this->router->generate('app_listbooks'));
    }
Run Code Online (Sandbox Code Playgroud)

我已经检查过并且!$session->get("App_Books_Chosen_Lp")是真的.尽管如此,我没有被重定向到app_listbooks控制器.

我认为这是因为我不直接在控制器而不是服务中返回重定向响应.

Ben*_*der 14

我不知道你如何定义你的服务,但下面的例子工作正常.假设您正在从控制器调用服务.

services.yml

services:
    application_backend.service.user:
        class: Application\BackendBundle\Service\UserService
        arguments:
            - @router
Run Code Online (Sandbox Code Playgroud)

服务类

namespace Application\BackendBundle\Service;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;

class UserService
{
    private $router;

    public function __construct(
        RouterInterface $router
    ) {
        $this->router = $router;
    }

    public function create()
    {
        $user = new User();
        $user->setUsername('hello');
        $this->entityManager->persist($user);
        $this->entityManager->flush();

        return new RedirectResponse($this->router->generate('application_frontend_default_index'));
    }
}
Run Code Online (Sandbox Code Playgroud)

调节器

public function createAction(Request $request)
{
    //.........

    return $this->userService->create();
}
Run Code Online (Sandbox Code Playgroud)

UPDATE


虽然上面的原始答案回答了原始问题,但这不是最佳实践,如果您想要更好的方法,请执行以下操作.首先,不要注入@router服务并进行以下更改.

// Service
public function create()
{
    .....
    $user = new User();
    $user->setUsername('hello');
    $this->entityManager->persist($user);
    $this->entityManager->flush();
    .....
}

// Controller
public function createAction(Request $request)
{
    try {
        $this->userService->create();

        return new RedirectResponse($this->router->generate(........);
    } catch (......) {
        throw new BadRequestHttpException(.....);    
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 有人勇敢地否决了这个答案,但没有足够的人来解释原因,以便我们都能了解它有什么问题! (2认同)

Mor*_*itz 5

从架构的角度来看,不应该在服务中创建redirectResponse.一种方法是,在服务中抛出异常,这可以在控制器操作中捕获,您可以轻松地创建RedirectResponse.

可以在此处找到一个示例:从Symfony2中的服务重定向