我正在尝试在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;
}
答案 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),然后文件将被传回而不是去你的路线,这是另一个不希望的效果。