2013-02-15 1 views
0

Я пытаюсь сделать в ZF2 простое действие контроллера, которое возвращает файл javascript. Просто, что я хочу сделать, это то, что с PHP вы можете сделать следующим образом:Zend Framework 2 действие контроллера возвращает файл javascript: ошибка 500

<?php header('Content-Type: text/javascript'); ?> 
var foo = '<?php echo $bar; ?>'; 

Теперь, в ZF2 Я функция действием ActionController так:

public function environmentAction() 
{ 
    $headers = new Headers(); 
    $headers->addHeaderLine('Content-Type', 'text/javascript'); 

    $this->getResponse()->setHeaders($headers); 

    $this->layout()->setTemplate('js/environment'); 

    $view = new ViewModel(); 
    return $view; 
} 

Затем маршрут настроен следующим образом:

'environment' => array(
    'type' => 'Literal', 
    'options' => array(
     'route' => '/js/environment.js', 
     'defaults' => array(
      'controller' => 'Application\Controller\Index', 
      'action'  => 'environment', 
     ), 
    ), 
) 

в конце концов, вид является .phtml файл (тот, который определен в разделе template_map подключ), как в простом PHP случае:

var foo = '<?php echo $bar; ?>' 

Таким образом, все должно быть сделано. Я просто добавить <script> элемент в головной части моего layout.phtml:

<script type="text/javascript" src="/js/environment.js"></script> 

Проблема заключается в том, что в моем браузере консоли я получаю следующее сообщение об ошибке при загрузке страницы:

GET ***/js/environment.js 500 (Internal Server Error) 

но если Я пытаюсь открыть ту же ссылку на новой странице, мне удалось получить скрипт.

В чем разница? В сетевом разделе инструментов разработчика моего браузера я вижу, что запрос HTTP-запроса для этого скрипта и его заголовков одинаковый из всех других запросов, так почему же он действует по-другому? Почему я получаю эту ошибку? И в моем журнале php ничего об этом событии нет. Есть идеи?


решаемые модификации функции действия вроде:

public function environmentAction() 
{ 
    $headers = new Headers(); 
    $headers->addHeaderLine('Content-Type', 'text/javascript'); 

    $this->getResponse()->setHeaders($headers); 

    $view = new ViewModel(); 
    $view->setTemplate('js/environment'); 
    $view->setTerminal(true); 
    return $view; 
} 
+1

Вы не должны устанавливать другой макет, а вместо этого вызывать '$ viewModel-> setTerminal (true);' на модели представления, которую вы создаете. Этот _disables_ макет полностью (это то, что вам, вероятно, понадобится в этом случае. – Ocramius

+0

Что именно вы пытаетесь достичь? Если вы можете привести пример того, что вам нужно сделать, возможно, мы можем предложить вам лучший совет. – Andrew

+1

SOLVED! @Ocramius, мне пришлось установить шаблон только потому, что файл представления не находится в пути по умолчанию 'application/index/environment.phtml', но в другом. В любом случае я удалил строку '$ this-> layout() -> setTemplate ('js/environment');' и добавил '$ view-> setTemplate ('js/environment'); $ view-> setTerminal (true); 'перед возвратом представления и он работает! Это так или иначе странно, потому что я думаю, что он должен работать и с плагином контроллера плагина, который должен установить корневой шаблон (если я не ошибаюсь). – Alessio

ответ

0

Это очень плохой способ делать вещи.

<script type="text/javascript" src="/js/environment.js"></script> 

Это заставит браузер сделать новый запрос для файла «/js/environment.js», который будет снова соответствовать маршруту:

'route' => '/js/environment.js' 

Вы получите состояние гонки/бесконечный цикл ,

В зависимости от настройки вашего веб-сервера, если вы запрашиваете '/js/environment.js', и файл действительно существует (это физический каталог alled js, содержащий environment.js), то файл будет передан обратно, а не идти по вашему пути в любом случае, что является еще одним нежелательным эффектом.

+0

Спасибо за ответ Andrew! Возможно, я не объяснил это хорошо. В общем макете я добавил элемент '