Zend Framework 2控制器操作返回javascript文件:错误500

时间:2013-02-15 10:19:09

标签: javascript http zend-framework2

我正在尝试在ZF2中执行一个返回javascript文件的简单控制器操作。 简单地说,我想要做的就是使用PHP,您可以通过以下方式完成:

<?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键下的js/environment部分中定义的文件),就像在简单的PHP案例中一样:

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

所以,一切都应该完成。我只需在layout.phtml的head部分添加一个<script>元素:

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

问题是在我的浏览器控制台中,加载页面时出现以下错误:

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

但如果我尝试在新页面中打开相同的链接,我就会成功获取该脚本。

有什么区别?在浏览器的开发者工具的网络部分中,我看到此脚本的http get请求及其标题与所有其他请求相同,所以为什么是它的行为不同?为什么我收到此错误?在我的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 个答案:

答案 0 :(得分:0)

这是一种非常糟糕的做事方式。

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

这将使浏览器对文件&#39; /js/environment.js'发出新的请求;这将再次匹配路线:

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

你将获得一个竞争条件/无限循环。

根据您的网络服务器设置,如果您要求&#39; /js/environment.js'并且文件确实存在(这是一个包含环境.js的物理目录js),然后文件将被传回而不是去你的路线,这是另一个不希望的效果。