2016-05-13 49 views
3

這個問題更具理論性和實用性。 假設我有基於PHP框架Symphony/Zend的項目,我還使用gulp作爲前端工作。我想用專業的方式來完成這個項目,所以我使用了諸如玉,清潔,uglify,minify,gzip,imagemin和rev的一些插件。如果有人不知道這個gulp-rev是什麼,這裏我們去:使用PHP查看文件的gulp任務

Static asset revisioning by appending content hash to filenames unicorn.css → unicorn-d41d8cd98f.css 

例如,緩存靜態文件的好處。

所以,這裏是一個問題...
我跑一飲而盡任務,我得到了以下文件:

- assets 
    - css 
    - style-bfd65634.css 
    - js 
    - vendor-mkg5454.js 
    - img 
    - background-ok54353.png 
    etc... 

後,我完成我的工作,前端我希望把它放在PHP框架的視圖文件(PHTML文件),例如: layout.phtml

... 
<link type="text/css" rel="stylesheet" media="screen" href="<?php echo $this->basePath(); ?>/assets/css/style-bfd65634.css"> 
... 
<div id="logo"> 
    <img src="<?php echo $this->basePath(); ?>/assets/img/background-ok54353.png" /> 
</div> 
... 

和同樣的事情去與JS文件,圖像等
幾周後,我不得不改變CSS樣式和現在的東西? 如何在不需要更改PHP框架中的phtml文件的情況下重新運行gulp任務?還是必須在每個phtml文件中手動更改修改後的文件?
如果是這樣,那麼使用像gulp-rev這樣的插件有什麼意義?僅適用於靜態網站?據我所知,沒有任何插件可以將jade文件轉換爲帶有PHP標籤的phtml

回答

0

僅適用於靜態網站?

大部分是。

要用php做同樣的事情,你應該使用包裝函數來顯示資源資產url。

這包裝函數將採取相對URL,它匹配到一個實際的文件路徑,獲取文件的最後更新時間,並追加到返回的URL,例如url/to/asset.some?l=<filemtime value>

看到http://php.net/manual/fr/function.filemtime.php


我必須提到,另一種方法是通過grunt構建鏈來構建您的php文件,請參閱wiredep。但我不推薦它。請參閱https://github.com/stephenplusplus/grunt-wiredep

1

您需要使用gulp-inject在特定位置注入這些新創建的文件。

<!DOCTYPE html> 
<html> 
<head> 
    <title>My index</title> 
    <!-- inject:css --> 
    <link rel="stylesheet" href="/src/style1.css"> 
    <link rel="stylesheet" href="/src/style2.css"> 
    <!-- endinject --> 
</head> 
<body> 
0

插件一飲而盡-REV產生rev-manifest.json文件與地圖:

{ 
    "css/main.css": "css/main-f95991b528.css", 
    "js/main.js": "js/main-5598f71801.js" 
} 

有使用PHP elixir功能Laravel框架美麗的解決方案。

<link rel="stylesheet" type="text/css" href="<?php echo elixir("css/main.css") ?>"> 

而且elixir功能:

function elixir($file) 
    { 
     static $manifest = null; 

     if (is_null($manifest)) { 
      $manifest = json_decode(file_get_contents(public_path('build/rev-manifest.json')), true); 
     } 

     if (isset($manifest[$file])) { 
      return '/build/'.$manifest[$file]; 
     } 

     throw new InvalidArgumentException("File {$file} not defined in asset manifest."); 
    }