Service 在服务类内重定向?

Service 在服务类内重定向?,service,zend-framework2,Service,Zend Framework2,我已经创建了自己的服务类,其中有一个函数,handleRedirect(),它应该在选择重定向到哪个路由之前执行一些最小的逻辑检查 class LoginService { private $CartTable; private $SessionCustomer; private $Customer; public function __construct(Container $SessionCustomer, CartTable $CartTable, Cus

我已经创建了自己的服务类,其中有一个函数,
handleRedirect()
,它应该在选择重定向到哪个路由之前执行一些最小的逻辑检查

class LoginService
{
    private $CartTable;
    private $SessionCustomer;
    private $Customer;

    public function __construct(Container $SessionCustomer, CartTable $CartTable, Customer $Customer)
    {
        $this->SessionCustomer  = $SessionCustomer;
        $this->CartTable        = $CartTable;
        $this->Customer         = $Customer;

        $this->prepareSession();
        $this->setCartOwner();
        $this->handleRedirect();
    }

    public function prepareSession()
    {
        // Store user's first name
        $this->SessionCustomer->offsetSet('first_name', $this->Customer->first_name);
        // Store user id
        $this->SessionCustomer->offsetSet('customer_id', $this->Customer->customer_id);
    }

    public function handleRedirect()
    {
        // If redirected to log in, or if previous page visited before logging in is cart page:
        //      Redirect to shipping_info
        //  Else
        //      Redirect to /
    }

    public function setCartOwner()
    {
        // GET USER ID FROM SESSION
        $customer_id = $this->SessionCustomer->offsetGet('customer_id');
        // GET CART ID FROM SESSION
        $cart_id = $this->SessionCustomer->offsetGet('cart_id');
        // UPDATE
        $this->CartTable->updateCartCustomerId($customer_id, $cart_id);
    }
}
成功登录或注册后,将在控制器中调用此服务。我不确定访问
redirect()->toRoute()的最佳方式是什么从这里开始(或者如果我应该在这里执行)


此外,如果您对我的代码的结构有其他意见,请随时留下。

在您的服务中使用插件是个坏主意,因为它们需要设置控制器。当创建服务并插入插件时,它不知道控制器实例,因此将导致错误异常。如果要重定向用户,可以像重定向插件那样编辑响应对象

请注意,我剥离了代码以保持示例的清晰和简单

类LoginServiceFactory实现FactoryInterface
{
公共函数调用(ContainerInterface$container,$requestedName,数组$options=null)
{
返回新的LoginService($container->get('Application')->getMvcEvent());
}
}
类登录服务
{
/**
*@var\Zend\Mvc\MvcEvent
*/
私人活动;
/**
*重定向服务构造函数。
*@param\Zend\Mvc\MvcEvent$事件
*/
公共函数构造(\Zend\Mvc\MvcEvent$event)
{
$this->event=$event;
}
/**
*@return Response |\Zend\Stdlib\ResponseInterface
*/
公共函数handleRedirect()
{
//条件检查
如果(真){
$url=$this->event->getRouter()->assembly([],['name'=>'home']);
}否则{
$url=$this->event->getRouter()->assembly([],['name'=>'cart/shipping info']);
}
/**@var\Zend\Http\Response$Response*/
$response=$this->event->getResponse();
$response->getHeaders()->addHeaderLine('Location',$url);
$response->setStatusCode(302);
返回$response;
}
}
现在,您可以在控制器中执行以下操作:

return$loginService->handleRedirect()