2017-12-28 34 views
2

Ich habe meine eigene Serviceklasse erstellt und ich habe eine Funktion darin, handleRedirect(), die eine minimale logische Überprüfung durchführen sollte, bevor Sie auswählen, welche Route umgeleitet werden soll.Umleiten innerhalb einer Serviceklasse?

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); 
    } 
} 

Dieser Dienst wird nach einer erfolgreichen Anmeldung oder Registrierung im Controller aufgerufen. Ich bin mir nicht sicher, was ist der beste Weg, um von hier auf redirect()->toRoute(); zuzugreifen (oder wenn ich es hier tun sollte).

Auch wenn Sie andere Kommentare haben, wie mein Code strukturiert ist, zögern Sie nicht, sie zu verlassen.

Antwort

0

Die Verwendung von Plugins innerhalb Ihrer Dienste ist eine schlechte Idee, da sie erfordern, dass ein Controller gesetzt wird. Wenn ein Dienst erstellt wird und Sie ein Plugin injizieren, hat er keine Ahnung von der Controller-Instanz, so dass es zu einer Fehlerausnahme kommt. Wenn Sie den Benutzer umleiten möchten, bearbeiten Sie das Antwortobjekt möglicherweise wie das Redirect-Plugin.

Beachten Sie, dass ich den Code entfernt, um das Beispiel klar und einfach zu halten.

class LoginServiceFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     return new LoginService($container->get('Application')->getMvcEvent()); 
    } 
} 

class LoginService 
{ 
    /** 
    * @var \Zend\Mvc\MvcEvent 
    */ 
    private $event; 

    /** 
    * RedirectService constructor. 
    * @param \Zend\Mvc\MvcEvent $event 
    */ 
    public function __construct(\Zend\Mvc\MvcEvent $event) 
    { 
     $this->event = $event; 
    } 

    /** 
    * @return Response|\Zend\Stdlib\ResponseInterface 
    */ 
    public function handleRedirect() 
    { 
     // conditions check 
     if (true) { 
      $url = $this->event->getRouter()->assemble([], ['name' => 'home']); 
     } else { 
      $url = $this->event->getRouter()->assemble([], ['name' => 'cart/shipping-info']); 
     } 

     /** @var \Zend\Http\Response $response */ 
     $response = $this->event->getResponse(); 
     $response->getHeaders()->addHeaderLine('Location', $url); 
     $response->setStatusCode(302); 

     return $response; 
    } 
} 

Jetzt aus Ihrem Controller können Sie folgendes tun:

return $loginService->handleRedirect();

+0

Klare und einfache Tat, danke! – herondale

Verwandte Themen