在codesleeve / asset-pipeline javascript中解析PHP

时间:2014-09-18 16:18:33

标签: javascript php laravel-4 asset-pipeline

我试图在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文件(插入会这样做),那么它再次正确显示一页加载。

1 个答案:

答案 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}}