Скрипты командной строки Zend Framework 2 - PullRequest
3 голосов
/ 22 февраля 2012

Как выполнить сценарий php через командную строку в Zend Framework 2, который обходит все функциональные возможности MVC, но чтобы у сценария был доступ к ресурсам, созданным модулем, таким как соединения с базой данных или Doctrine EntityManager?

Для справки вот как выглядит моя точка входа index.php

<?php
chdir(dirname(__DIR__));
require_once (getenv('ZF2_PATH') ?: 'vendor/ZendFramework/library') . '/Zend/Loader    /AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array()));

$appConfig = include 'config/application.config.php';

$listenerOptions  = new Zend\Module\Listener\ListenerOptions($appConfig['module_listener_options']);
$defaultListeners = new Zend\Module\Listener\DefaultListenerAggregate($listenerOptions);
$defaultListeners->getConfigListener()->addConfigGlobPath('config/autoload/*.config.php');

$moduleManager = new Zend\Module\Manager($appConfig['modules']);
$moduleManager->events()->attachAggregate($defaultListeners);
$moduleManager->loadModules();

// Create application, bootstrap, and run
$bootstrap   = new Zend\Mvc\Bootstrap($defaultListeners->getConfigListener()->getMergedConfig());
$application = new Zend\Mvc\Application;
$bootstrap->bootstrap($application);
$application->run()->send();

1 Ответ

2 голосов
/ 24 февраля 2012

Для модуля есть несколько параметров для настройки ресурсов, например, соединение с базой данных.Для ZF2 DoctrineModule и DoctrineORMModule поддерживаются самим Doctrine, и Entity Manager создается только на , когда вы хотите его использовать.Вместо подхода ZF1, когда соединения с базой данных создаются во время начальной загрузки, эти модули имеют своего рода своевременность: создайте экземпляр непосредственно перед тем, как он вам понадобится.

Итак: вам нужно настроить менеджер соединений и сущностей в модуле, который выполняется с помощью контейнера внедрения зависимостей.Эта конфигурация выполняется модулем, поэтому вам следует убедиться, что модуль настроен правильно.Затем в своем сценарии вы извлекаете диспетчер сущностей из DIC, и создается экземпляр EM, именно то, что вам нужно.

Как настроить модули?Сначала модули загружаются , затем инициируются .Это делается в вызове $moduleManager->loadModules() из-за того, что несколько слушателей прослушивают событие загрузки, таким образом создавая экземпляры модулей и выполняя метод init() для этих модулей.Также имеется прослушиватель для настройки модулей, поэтому DI может быть настроен правильно.В настоящее время модули настроены, но не всегда готовы к работе.Последний готовый шаг - это начальная загрузка , которая выполняется Zend\Mvc\Bootstrap, начальной загрузкой Zend\Mvc\Application.

Это означает, что если вы копируете этот скрипт index.php, но только удалить последнюю строку ($application->run()->send()), модули загружены, контейнер DI настроен и приложение загружено.Теперь вы можете получить локатор DI и захватить менеджер сущностей:

$em = $application->getLocator()->get('doctrine_em');

Обратите внимание на функцию CLI в zf2, которая появится в некоторых следующих бета-версиях. RFC готов в данный момент, и когда он будет готов к экспериментам, он будет объединен с мастером zf2.Это облегчает создание приложений CLI намного .У вас есть одна точка входа (например, app.php), и «настоящая работа» подобна приложениям http MVC, выполняемым контроллерами.Если у вас есть этот app.php, вам будет очень легко добавить больше функций CLI, поскольку это так же просто, как добавить еще несколько контроллеров с действиями и (возможно) маршрут к этой точке.

...