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

How to use controllers as services configuring the routing in yaml without annotations

到目前为止,我一直在为我的路线使用注释,但对于一个新项目,我将开始使用 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 服务注释)吗?

您需要更改路由以包含完整的控制器功能。
例如

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

如果您将控制器用作服务,则不能使用基础 class 的辅助方法 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 中所述。

希望对您有所帮助