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