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

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

Как правильно реорганизовать этот класс:

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

Должен ли я использовать View Helper Factory для внедрения сервисного локатора и, если да, как это должно быть сделано?

1

Решение

Нет, ты должен НЕ использовать фабрику, чтобы ввести 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'
)
),

//...
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]