2013-02-21 6 views
1

В моем приложении с несколькими модулями у меня есть метод, который отправляет электронное письмо, а текст использует помощник просмотра URL для создания ссылки. Если я выполнить этот метод с помощью браузера все работает правильно, но если я запускаю этот метод через хрон с помощью оболочки я получаю эту ошибку:Zend_Controller_Router_Exception: Маршрут по умолчанию не определен

Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'Route default is not defined' in /path/ZendFramework-1.12.1/library/Zend/Controller/Router/Rewrite.php on line 318 

Zend_Controller_Router_Exception: Route default is not defined in /path/ZendFramework-1.12.1/library/Zend/Controller/Router/Rewrite.php on line 318 

Сидя в Интернете, я нашел это решение: http://www.dragonbe.com/2012/11/route-default-is-not-defined.html

Если я то, что я сказал в ошибке блога, больше не происходит, но в этот момент сгенерированная ссылка и «отсутствие протокола и имени хоста» записывает мне ссылку только на контроллер и действие, например «/ controller/action/foo/bar»,

Не могли бы вы мне помочь?

благодаря


Редактировать

Это, как я запускаю хрон рабочих мест:

структура:

app/ 
app/application 
.. stuff ... 
app/scripts/ 
app/scripts//bootstrap.php 
app/scripts//cronjobs.php 

приложение/скрипты // bootstrap.php

<?php 
// Define path to application directory 
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/')); 

// Ensure library/ is on include_path 
set_include_path(
    implode(PATH_SEPARATOR, 
     array(
      realpath(APPLICATION_PATH . '/../library'), 
      get_include_path()))); 

if (isset($zendOptions)) { 

    // using Zend_Console_Getopt to parse environment to load 
    require_once 'Zend/Console/Getopt.php'; 

    try { 
     $getOpt = new Zend_Console_Getopt($zendOptions); 
     $getOpt->parse(); 
    } catch (Zend_Console_Getopt_Exception $e) { 
     echo $e->getMessage() . PHP_EOL; 
     echo $e->getUsageMessage(); 
     exit(1); 
    } 

    if ($getOpt->getOption('h')) { 
     echo $getOpt->getUsageMessage(); 
     exit(0); 
    } 
    // Define application environment 
    define('APPLICATION_ENV', 
    $getOpt->getOption('e') ? $getOpt->getOption('e') : 'production'); 
} else { 
    // Define application environment using getenv 
    define('APPLICATION_ENV', 
    getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'); 
} 

// define APPLICATION_BOOTSTRAP if not defined 
if (!defined('APPLICATION_BOOTSTRAP')) { 
    define('APPLICATION_BOOTSTRAP', true); 
} 

// Define standard config file 
define('APPLICATION_CONFIG', APPLICATION_PATH . '/configs/application.ini'); 

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Init a Zend_Application 
$zendApplication = new Zend_Application(APPLICATION_ENV, APPLICATION_CONFIG); 
if (APPLICATION_BOOTSTRAP) { 
    $zendApplication->bootstrap(); 
} 

приложение/скрипты/cronjobs.php

<?php 
// define options for script 
$zendOptions = array(
    'environment|e=w' => 'Environment to use as specified in application.ini (default production)', 
    'test|t' => 'test cron', 
    'help|h' => 'Show program usage'); 

// bootstrap application object (default true, put to false 
// if you need to bootstrap only single resources 
define('APPLICATION_BOOTSTRAP', true); 

// parse the options and bootstrap application if required 
require_once realpath(dirname(__FILE__) . '/bootstrap.php'); 

/* start your script here, you'll have the following vars: */ 
/* @var $zendApplication Zend_Application initialized Zend_Application object */ 
/* @var $getOpt Zend_Console_Getopt a getopt parsed object */ 

error_reporting(E_ALL); 

if ($getOpt->getOption('t')) { 

    $vhUrl = new Zend_View_Helper_Url(); 
    $url = $vhUrl->url(array('controller' => 'foo', 'action' => 'bar')); 
    Zend_Debug::dump($url); 
} 

отладочная печать '/ Foo/бар'

+0

это может помочь некоторым также http://stackoverflow.com/questions/2325338/running-a-zend-framework-action-from-command-line – RockyFord

+0

для запуска моего cron, используйте Zend_Console_Getopt, я знаю, как он работает , Я не понимаю, почему в сгенерированной ссылке отсутствует имя хоста? – JellyBelly

+0

Можете ли вы изменить свой вопрос, чтобы включить больше информации о вашем скрипте cron - запускает ли он загрузку приложения? И можете ли вы показать, как вы называете помощника URL? –

ответ

0

По умолчанию помощник Zend_View_Helper_Url использует Zend_Controller_Router_Rewrite, который не включает в себя имя хоста и протокол (см Zend_Controller_Router_Rewrite::assemble) ,

Однако, если вы хотите передать $_SERVER['HTTP_HOST'] при выполнении скриптов из командной строки это можно сделать, используя следующую конструкцию:

HTTP_HOST=example.com php /path/to/cronjob.php 

Позже, если вы хотите, чтобы получить текущий URL-адрес сервера, вы можете использовать Zend_View_Helper_ServerUrl

Пример:

<?php 
// cronjob.php 
$serverUrl = new Zend_View_Helper_ServerUrl(); 
var_dump($serverUrl->serverUrl()); 

// выходы: string(18) "http://example.com"

+0

спасибо за ваш вклад, но я нашел элегантное решение, разместите его прямо сейчас! – JellyBelly

+0

Я пытался сделать то, что говорю, но он не работает так, как хотелось бы. Из моего cron вызывается метод в модели, где я использую '$ this-> url (...);' и всегда печатает только контроллер и действие. Поступая таким образом, ссылка в отправленном вами письме повреждена! – JellyBelly

+0

, что мешает вам дописывать '$ this-> serverUrl()' перед '$ this-> url (...);' в ваших представлениях? –

2

Я нашел решение

Application.ini

[production] 
baseUrl = mydomain.com 

[development : production] 
baseUrl = mydomain.dev 

[testing : production] 
baseUrl = mydomain.test 

Bootstrap.php

/** 
* Default Routes 
*/ 
protected function _initDefaultRoutes() 
{ 
    $frontController = Zend_Controller_Front::getInstance(); 
    $frontController->getRouter()->addDefaultRoutes(); 
    $options = $this->getOptions(); 
    $frontController->setBaseUrl('http://' . $options['baseUrl']); 
} 

и теперь работает!

+0

Вы сделали именно то, что не рекомендуется делать ... Из источника:' Не используйте полный URI при предоставлении базы. Ниже приведены следующие примеры: * - http://example.com/admin (должно быть просто/admin) ' –

+0

ok спасибо за ваше наблюдение – JellyBelly