0

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

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

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

<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;
}
4

1 回答 1

0

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

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

这将使浏览器对文件“/js/environment.js”发出新请求,该文件将再次匹配路由:

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

你会得到一个竞争条件/无限循环。

根据您的 Web 服务器设置,如果您请求 '/js/environment.js' 并且该文件确实存在(即包含 environment.js 的称为 js 的物理目录),则该文件将被传回而不是转到您的路线无论如何,这是另一个不良影响。

于 2013-02-15T10:44:40.250 回答