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