Я новичок в Zend Framework.
Есть ли способ получить доступ к таблице классов модели, которая находится в другом модуле, с моего активного контроллера? Так как пока в сервисе ZF3, я не могу получить доступ к таблице классов модели, расположенной в других модулях.
Ранее в контроллере ZF2
private configTable;
public function getConfigTable()
{
if (!$this->configTable) {
$sm = $this->getServiceLocator();
$this->configTable = $sm->get('Config\Model\ConfigTable'); // <-- HERE!
}
return $this->configTable;
}
public function indexAction(){
$allConfig = $this->getConfigTable()->getAllConfiguration();
......
}
В качестве локатора службы было достаточно вызвать функцию от контроллера к классу модели, расположенному в другом модуле.
Есть ли способ добиться чего-то подобного в ZF3 без сервисного локатора?
Заранее спасибо, ребята.
До свидания!
его пока пока сервисный локатор в ZF3
Сервисный локатор не был удален из ZF3. Тем не менее, новая версия фреймворка внесла некоторые изменения, которые сломают существующий код если вы полагались на ServiceLocatorAwareInterface
и / или наличие менеджера сервисов в ваших контроллерах / сервисах.
В ZF2 Контроллер действий по умолчанию реализовал этот интерфейс и позволил разработчикам получать диспетчер сервисов из контроллера, как в вашем примере. Вы можете найти больше информации об изменениях в руководство по миграции.
Рекомендуемое решение — разрешить все зависимости вашего контроллера в фабрике сервисов и внедрить их в конструктор.
Во-первых, обновите контроллер.
namespace Foo\Controller;
use Config\Model\ConfigTable; // assuming this is an actual class name
class FooController extends AbstractActionController
{
private $configTable;
public function __construct(ConfigTable $configTable)
{
$this->configTable = $configTable;
}
public function indexAction()
{
$config = $this->configTable->getAllConfiguration();
}
// ...
}
Затем создайте новую фабрику сервисов, которая будет вводить зависимость таблицы конфигурации в контроллер (используя новый заводской интерфейс ZF3)
namespace Foo\Controller;
use Foo\Controller\FooController;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\FactoryInterface;
class FooControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$configTable = $container->get('Config\Model\ConfigTable');
return new FooController($configTable);
}
}
Затем обновите конфигурацию, чтобы использовать новую фабрику.
use Foo\Controller\FooControllerFactory;
'factories' => [
'Foo\\Controller\\Foo' => FooControllerFactory::class,
],
Других решений пока нет …