如何使用控制器作为服务,在没有注释的情况下配置yaml中的路由

时间:2017-03-09 09:42:39

标签: php symfony fosuserbundle

到目前为止,我一直在为我的路线使用注释,但对于一个新项目,我将开始使用yaml路线。

问题是我不知道如何使用控制器作为服务。我有我的控制器:

final class SuspendController extends Controller
{

    /** @var UserManagerInterface */
    private $userManager;

    public function __construct(
        UserManagerInterface $userManager    
    ) {
        $this->userManager = $userManager;
    }

    /**
     * @return Response
     */
    public function suspendAction() : Response
    {
        /** @var User $user */
        $user = $this->getUser();

        $user->setStatus(User::STATUS_SUSPENDED);

        $this->get('fos_user.user_manager')->updateUser($user);

        return $this->redirectToRoute('fos_user_security_logout');
    }
}

我的routing.yml:

suspend_session:
    path:      /suspend
    defaults:  { _controller: UserBundle:Suspend:suspend }

我包括以下服务定义:

services:

  controller.suspend_account:
      class: UserBundle\Controller\SuspendController
      arguments:
          - '@fos_user.user_manager'

问题是fos_user_manager永远不会被注入控制器。是否有任何注释我应该包含在路由中以指定该控制器是服务(等同于@Route服务注释)?

2 个答案:

答案 0 :(得分:2)

如果您将Controller用作服务,则无法使用基类的辅助方法getUser,因为您还没有注入容器。 对于重定向路由,您还需要路由器依赖项。

因此,您应该注入所有必要的依赖项(也是令牌管理器)并使用它们拨号。

  controller.suspend_account:
      class: UserBundle\Controller\SuspendController
      arguments:
          - '@fos_user.user_manager'
          - '@router'
          - '@security.token_storage'

然后您的实现如下所示:

/**
 * @return Response
 */
public function suspendAction() : Response
{
    /** @var User $user */
    $user = $this->securityTokenStorage->getToken()->getUser();

    $user->setStatus(User::STATUS_SUSPENDED);

    $this->userManager->updateUser($user);

    return $this->redirect($this->router->generate('fos_user_security_logout'), 200);
}

修改

然后按如下方式定义路线:

suspend_session:
    path:      /suspend
    defaults:  { _controller: controller.suspend_account:suspendAction  }

doc中所述。

希望这个帮助

答案 1 :(得分:0)

您需要更改路由以包含完整的控制器功能 E.g。

suspend_session:
    path:      /suspend
    defaults:  { _controller: UserBundle:Suspend:suspendAction }