ответ optima1 помог мне начать работу в правильном направлении, но я хотел бы поделиться некоторыми дополнительными шагами, необходимыми для работы помощников вида url()
и serverUrl()
в скрипте CLI.
Определить среду
Первая задача - определить среду сервера.Это часто в переменной среды .htaccess или FastCGI, поэтому она не загружается в CLI.Я использую INI-файл для сопоставления имени сервера с окружением.
[ServerEnvironments]
PROD-SERVER = "production"
STAGE-SERVER = "staging"
MY-LOCAL-VM = "development"
Затем мой сценарий CLI соответственно устанавливает постоянную APPLICATION_ENV
.
$iniConfig = parse_ini_file(rtrim(dirname(__FILE__), '\/') . '/servers.ini', TRUE);
$environment = isset($iniConfig['ServerEnvironments'][getenv('COMPUTERNAME')])
? $iniConfig['ServerEnvironments'][getenv('COMPUTERNAME')]
: 'production';
defined('APPLICATION_ENV') || define('APPLICATION_ENV', $environment);
Заполните сервер Superglobal
Остальная часть сценария продолжается в обычном режиме, как показано в примере Дэвида .Тем не менее, я загружаю все ресурсы (пустой вызов bootstrap()
).Я также включаю дополнительный файл INI при создании экземпляра Zend_Application
, например так:
$application = new Zend_Application(
APPLICATION_ENV,
array('config' => array(APPLICATION_PATH . '/configs/application.ini',
APPLICATION_PATH . '/configs/cli.ini')));
В файле CLI INI будет храниться информация запроса, которая обычно предоставляется веб-сервером.
[production]
cli.request.serverVars.HTTPS = "on"
cli.request.serverVars.HTTP_SCHEME = "https"
; Host name, including port if non-standard.
cli.request.serverVars.HTTP_HOST = "example.com"
; Absolute path to the web root. Exclude trailing slash.
cli.request.serverUrl = "https://example.com"
; Relative path from web root to the Zend Framework application. Include leading slash.
cli.request.baseUrl = "/ZF"
[staging : production]
cli.request.serverUrl = "https://stage.example.com"
cli.request.serverVars.HTTP_HOST = "stage.example.com"
[development : production]
cli.request.serverUrl = "https://dev.example.com:4433"
cli.request.serverVars.HTTP_HOST = "dev.example.com:4433"
После вызова bootstrap()
скрипт CLI заполняет $_SERVER
суперглобальный.Обратите внимание, что во время начальной загрузки я сохраняю конфигурацию приложения в Zend_Registry
.
$config = Zend_Registry::get('config');
foreach($config->cli->request->serverVars as $name => $value) {
$_SERVER[$name] = $value;
}
Создание URI и диспетчеризация
Последнее препятствие - использование пользовательских маршрутов вместо /module/controller/action
,и последний формат отключен (Zend_Controller_Router_Rewrite::removeDefaultRoutes()
).Таким образом, сценарию CLI необходимо указать маршрут, а не модуль, контроллер и действие.
$route = 'My/Custom/Route';
$spoofedUri = $config->cli->request->serverUrl
. rtrim($config->cli->request->baseUrl, '/') . '/'
. $route;
$request = new Zend_Controller_Request_Http($spoofedUri);
$request->setBaseUrl($config->cli->request->baseUrl);
$front = Zend_Controller_Front::getInstance();
$front->setRequest($request)
->setResponse(new Zend_Controller_Response_Cli())
->dispatch();
Это может не устранить все расхождения между веб-запросами и запросами CLI (может потребоваться заполнить больше переменных $_SERVER
) но он исправил url()
и serverUrl()
для меня.