2014-09-18 53 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); 
    } 
}