我试图在laravel 4的codesleeve / asset-pipeline中要求.js.php文件,并且无法使其成功运行。还有其他人遇到过麻烦吗?
问题......
我使用gettext将一些翻译字符串提供给JavaScript(例如,用于错误消息)。我的javascript看起来像这样(locale.js.php)其中_e
是来自gettext的使用sprint的转义字符串。
Locale.define('<?php echo $USER_LOCALE; ?>', 'Number' , {
billion: '<?php echo _e('%s billion', '{x}'); ?>'
});
当在其上投掷正确的标头并直接调用文件时,这一切都很有效。它将输出:
Locale.define('fr-FR', 'Number' , {
billion: 'milliard {x}'
});
在我的资产管道配置文件中,我将扩展名.js.php
添加到我的javascripts mime数组中,并添加了过滤器:
'filters' => array(
'.js.php' => array(
new AssetPipelinePHP
),
...
类AssetPipelinePHP是:(我知道eval
是危险的,但请耐心等待我)
class AssetPipelinePHP implements FilterInterface {
...
public function filterDump(AssetInterface $asset) {
$content = eval("?> " . $asset->getContent() . " <?php ");
$asset->setContent($content);
}
}
最后,在我的application.js文件中,我有:
//= require_tree modernizr
//= require_tree mootools
//= require_tree locale
这将正确显示javascript(虽然ABOVE modernizr而不是文件的末尾)仅用于第一页加载。连续页面加载不会显示任何locale.js.php文件。但是,如果我完全更改了locale.js.php文件(插入会这样做),那么它再次正确显示一页加载。
答案 0 :(得分:0)
来自eval
文档:
eval()返回NULL,除非在计算代码中调用return
因此,第一次加载脚本时,它可能只是将eval的结果回显到页面中,这可以解释为什么它在modernizr上面呈现。连续页面加载将打印$asset
内容的缓存值,该NULL
内容将从eval
返回class AssetPipelinePHP implements FilterInterface {
public function filterDump(AssetInterface $asset) {
ob_start(); // Start output buffering
eval("?> " . $asset->getContent() . " <?php ");
$content = ob_get_contents();
ob_end_clean(); // End buffering and clean up
$asset->setContent($content);
}
}
。
如果要捕获echo的输出,可以使用ob_get_contents
。所以你的代码可能如下所示:
{{1}}