使用gulp任务和PHP视图文件

时间:2016-05-13 11:43:50

标签: php gulp gulp-rev

这个问题更具理论性和实用性。 假设我有基于PHP框架Symphony / Zend的项目,我也使用gulp进行前端工作。我想以专业的方式做这个项目,所以我使用gulp插件,如jade,clean,uglify,minify,gzip,imagemin和 rev 。如果有人不知道这是什么gulp-rev,我们在这里:

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

例如,缓存静态文件的好处。

所以,这是一个问题......
我运行gulp任务,我得到了以下文件:

- 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这样的插件有什么意义呢?仅适用于静态网站?据我所知,没有任何插件可以使用PHP标签将jade文件转换为phtml

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

答案 2 :(得分:0)

使用map:

插件gulp-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.");
    }