Как я могу создать контроллер / URL-адрес действия Zend Framework вне контроллера? - PullRequest
4 голосов
/ 09 февраля 2011

Я использую Zend Framework 1.11.2.Я хочу создать URL-адреса для действий контроллера, которые можно использовать в текстах электронной почты.

В контроллерах я сделал это с Zend_View_Helper_ServerUrl и Zend_View_Helper_Url, например:

$serverUrlHelper = new Zend_View_Helper_ServerUrl();
$unsubscribeUrl = $serverUrlHelper->serverUrl(
    $this->getHelper('url')->url(
       array(
           'module' => $this->getFrontController()->getDefaultModule(),
           'controller' => 'newsletter',
           'action' => 'unsubscribe',
           'email' => $email
       ),
       'default',   // the route
       true));

Теперь я хочу сделать этоне внутри контроллера, а вместо командной строки.Мне уже удалось запустить Zend-контроллер / действие, выполнив шаги, описанные здесь Запуск действия Zend Framework из командной строки .Но Application_Router_Cli не имеет реализации для функции assemble.Я никогда не делал что-то глубоко с Zend Routing.Может ли кто-нибудь дать мне подсказку, как это реализовать?

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011

Я не уверен, что означает default маршруты в вашем application.ini, но я знаю, что ваш код должен быть таким:

   $serverUrlHelper = new Zend_View_Helper_ServerUrl();
   $unsubscribeUrl = $serverUrlHelper->serverUrl(
    $this->getHelper('url')->url(
       array(
           'module' => $this->getFrontController()->getDefaultModule(),
           'controller' => 'newsletter',
           'action' => 'unsubscribe',
           'email' => $email
       ),
       null,   // the route 
       true));

, поскольку вы собираете маршрут вручную, используя массив module , controller , view

так что второй параметр справки по представлению URL должен быть нулевым, и если в вашем application.ini есть маршрут, и вы хотите, чтобы эта ссылка следовала по этому маршруту, ваша функция должна быть такой:

 $serverUrlHelper = new Zend_View_Helper_ServerUrl();
   $unsubscribeUrl = $serverUrlHelper->serverUrl(
    $this->getHelper('url')->url(
        null,
       "email",   // aka the route name
       true));

надеюсь, я объясню это просто

1 голос
/ 14 марта 2013

ответ 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() для меня.

1 голос
/ 18 мая 2012

Вместо подклассов из Zend_Controller_Router_Abstract в Application_Router_Cli (как указано в этом руководстве), подкласс из Zend_Controller_Router_Rewrite. Это должно дать вам функцию assembly () и позволить вам использовать URL Helper, как вы обычно используете его в веб-контексте.

0 голосов
/ 09 февраля 2011

Если в вашем скрипте CLI вы обязательно загрузите ресурс вида:

$application->getBootstrap()->bootstrap(array('db', 'mail', 'view'));

, тогда вы можете использовать те же помощники вида, что и всегда, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...