2014-09-18 54 views
0

我想要为Laravel 4的codesleeve/asset-pipeline中的需要.js.php文件,并且一直未能成功运行它。有没有其他人有这个麻烦?在codeleeve/asset-pipeline中解析PHP javascript

问题...

我使用gettext一些翻译字符串送入的JavaScript(如错误消息)。我的javascript看起来像这样(locale.js.php),其中_e是使用sprint从gettext转义的字符串。

Locale.define('<?php echo $USER_LOCALE; ?>', 'Number' , { 
    billion: '<?php echo _e('%s billion', '{x}'); ?>' 
}); 

在投掷正确的标题和直接调用文件时,这一切都很完美。这将输出:

Locale.define('fr-FR', 'Number' , { 
    billion: 'milliard {x}' 
}); 

在我的资产管道的配置文件,我添加了扩展.js.php我的JavaScript的哑剧阵列,并添加过滤器:

'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

eval文档:

的eval(),除非回报是所谓的评估代码

返回NULL所以第一次加载它可能只是呼应的EVAL结果脚本进入页面,这将解释为什么它呈现在modernizr之上。连续页面加载将打印$asset内容的缓存值,这将从eval返回NULL

如果你想捕捉回声的输出,你可以使用ob_get_contents。因此,您的代码可能如下所示:

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