如何在没有注释的情况下将控制器用作在 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 中所述。
希望对您有所帮助
到目前为止,我一直在为我的路线使用注释,但对于一个新项目,我将开始使用 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 中所述。
希望对您有所帮助