Я новичок в 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, ],