我可以在服务中执行重定向到另一个控制器吗?
我已经根据@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)
从架构的角度来看,不应该在服务中创建redirectResponse.一种方法是,在服务中抛出异常,这可以在控制器操作中捕获,您可以轻松地创建RedirectResponse.
可以在此处找到一个示例:从Symfony2中的服务重定向
| 归档时间: |
|
| 查看次数: |
13849 次 |
| 最近记录: |