2016-09-12 7 views
1

У меня есть помощник по представлению от ZF2, который больше не работает с ZF3 из-за ServiceLocatorAwareInterface усталости.Каков наилучший способ для рефакторинга ZF2 ServiceLocatorAwareInterface для работы с ZF3 в качестве помощника?

Что такое правильный способ реорганизовать этот класс:

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

Должен ли я использовать вспомогательный вид фабрики, чтобы ввести локатор сервиса и если да, то каким образом это должно быть сделано?

+0

Зачем вам нужен локатор обслуживания в вашем браузере? Проблема здесь, а не о том, как предоставить локатор сервиса вашему помощнику вида. – Unex

+1

Я дал ответ, где [вы создаете фабричный класс для разрешения зависимостей] (http://stackoverflow.com/questions/38696620/zf3-controller-not-able-to-access-the-model-class-table -Расположенный-в-другом-MODUL/38703223 # 38703223). Вопрос в том, что контроллер, а не помощник вида, однако процесс все тот же. – AlexP

ответ

3

Нет, вы должны NOT использовать фабрику для ввода экземпляра ServiceLocator (никогда), вместо этого вы должны вводить зависимости напрямую. В вашем случае вы должны ввести свой сервис SlidersTable. Вы должны сделать так:

1) Сделайте свой конструктор класса зависит от вашего SlidersTable службы:

<?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) Создать фабрику, где вы впрыснуть вашу зависимость:

<?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) Зарегистрируйте свое мнение помощник внутри вашего module.config.php:

//... 

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

//... 
+0

Благодарим вас за ответ. Он работает отлично. – Botman

 Смежные вопросы

  • Нет связанных вопросов^_^