【问题标题】:Zend Framework 2 controller action returning javascript file: error 500Zend Framework 2 控制器操作返回 javascript 文件:错误 500
【发布时间】:2013-02-15 19:59:04
【问题描述】:

我试图在 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 部分添加了一个 &lt;script&gt; 元素:

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

【问题讨论】:

  • 您不应设置不同的布局,而应在您正在生成的视图模型上调用$viewModel-&gt;setTerminal(true);。这会完全禁用布局(在这种情况下您可能需要这样做。
  • 您到底想达到什么目的?如果您能举例说明您需要做什么,也许我们可以为您提供更好的建议..
  • 已解决! @Ocramius,我只需要设置模板,因为视图文件不在默认路径application/index/environment.phtml 中,而是在不同的路径中。无论如何,我在返回视图之前删除了$this-&gt;layout()-&gt;setTemplate('js/environment'); 行并添加了$view-&gt;setTemplate('js/environment'); $view-&gt;setTerminal(true);,它可以工作!无论如何,恕我直言很奇怪,因为我认为它也应该与应该设置根模板的布局控制器插件一起使用(如果我没记错的话)。
  • layout 控制器插件会更改布局视图模型,而不是您要返回的那个。

标签: javascript http zend-framework2


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢安德鲁的回复!可能我解释得不好。在一般布局中,我添加了 &lt;script&gt; 元素,并将 src 属性设置为环境操作,它没有那个布局,而是一个终端视图模型。因此,竞争条件不应该存在。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
相关资源
最近更新 更多