У меня есть помощник вида из 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 для внедрения сервисного локатора и, если да, как это должно быть сделано?
Нет, ты должен НЕ использовать фабрику, чтобы ввести 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'
)
),
//...
Других решений пока нет …