2016-09-12 1 views
1

Ich habe View-Helfer von ZF2, die nicht mehr mit ZF3 wegen ServiceLocatorAwareInterface Veraltetes funktioniert.Was ist der beste Weg, um ZF2 ServiceLocatorAwareInterface in View Helper mit ZF3 zu refaktorieren?

Was ist der richtige Weg, um die Klasse Refactoring:

<?php 

namespace Site\View\Helper; 

use Zend\View\Helper\AbstractHelper; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class SlidersList extends AbstractHelper implements ServiceLocatorAwareInterface 
{ 
    protected $_serviceLocator; 

    public function __invoke() 
    { 
     return $this->getView()->render(
      'partials/sliders', 
      array('sliders' => $this->getServiceLocator()->getServiceLocator()->get('Sliders/Model/Table/SlidersTable')->fetchAll(true)) 
     ); 
    } 

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) 
    { 
     $this->_serviceLocator = $serviceLocator; 
    } 

    public function getServiceLocator() 
    { 
     return $this->_serviceLocator; 
    } 
} 

Sollte ich View Helfer Fabrik verwenden Service-Locator zu injizieren, und wenn ja, wie es getan werden sollte?

+0

Warum benötigen Sie den Service Locator in Ihrem View Helper? Das Problem ist hier, nicht, wie man den Service-Locator Ihrem View-Helfer gibt. – Unex

+1

Ich habe eine Antwort gegeben, wo [Sie erstellen eine Factory-Klasse, um Abhängigkeiten aufzulösen] (http://stackoverflow.com/questions/38696620/zf3-controller-not-able-to-access-the-model-class-table -located-in-einem anderen Modul/38703223 # 38703223). Die Frage bezieht sich eher auf einen Controller als auf einen View-Helper, der Prozess ist jedoch immer noch der gleiche. – AlexP

Antwort

3

Nein, Sie sollten NICHT Verwenden Sie eine Fabrik, um eine ServiceLocator Instanz injizieren (nie), stattdessen sollten Sie die Abhängigkeiten direkt injizieren. In Ihrem Fall sollten Sie Ihren SlidersTable Service injizieren. Sie sollten wie folgt tun:

1) Machen Sie Ihre Klassenkonstruktors abhängig von Ihrem SlidersTable Service:

<?php 

namespace Site\View\Helper; 

use Zend\View\Helper\AbstractHelper; 
use Sliders\Model\Table\SlidersTable; 

class SlidersList extends AbstractHelper 
{ 
    protected $slidersTable; 

    public function __construct(SlidersTable $slidersTable) 
    { 
     return $this->slidersTable = $slidersTable; 
    } 

    public function __invoke() 
    { 
     return $this->getView()->render(
      'partials/sliders', 
      array('sliders' => $this->slidersTable->fetchAll(true)) 
     ); 
    } 
} 

2) eine Fabrik erstellen, wo Sie Ihre Abhängigkeit injizieren:

<?php 
namespace Site\View\Helper\Factory; 

use Site\View\Helper\SlidersList; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class SlidersListFactory implements FactoryInterface 
{ 
    /** 
    * @param ContainerInterface $container 
    * @param string $requestedName 
    * @param array|null $options 
    * @return mixed 
    */ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $serviceManager = container 
     $slidersTable= $container->get('Sliders/Model/Table/SlidersTable'); 
     return new SlidersList($slidersTable); 
    } 
} 

3) registrieren Sie Ihre Ansicht Helfer in Ihrem module.config.php:

//... 

'view_helpers' => array(
    'factories' => array(
     'Site\View\Helper\SlidersList' => 'Site\View\Helper\Factory\SlidersListFactory' 
    ) 
), 

//... 
+0

Danke für die Antwort. Es funktioniert perfekt. – Botman

Verwandte Themen