21

一些 zf2 模块具有用于分发资源的公共目录,例如 js/css/images。将这些资源提供给应用程序的最佳实践是什么?

我希望这些资源可以通过http://mysite.com/[moduleName]/. 例如,

root/public/js/sitescript.js-->http:\\mysite.com\js\sitescript.js

root/module/mymodule/public/js/modulescript.js-->http:\\mysite.com\mymodule\js\modulescript.js

root/vendor/vendormodule/public/js/vendorscript.js-->http:\\mysite.com\vendormodule\js\vendorscript.js

是否应该将这些资源复制到根/公共目录?手动复制会很痛苦,而且我怀疑合并目录的自动构建过程是否会非常实用。

也许有一些魔法可以与 httpd.conf 或 .htaccess 一起使用?

也许符号链接是解决方案?但是,符号链接并不是直接在 Windows 平台上运行的,需要为每个单独的模块手动创建。

4

3 回答 3

18

有4种处理方法:

  1. public/对目录中的资产进行符号链接
  2. 将资产从模块复制粘贴到public/目录
  3. 使用特定的虚拟主机配置(或通常的 Web 服务器配置)
  4. 使用资产管理器模块,例如以下之一:

    • AssetManager - 由assetic支持- 在运行时合并资产,具有用于生产环境的缓存和用于CSS / JS缩小和LESS / SASS转换的过滤器,允许从模块本身的目录中公开资产。
    • zf2-assetic-module - 由资产支持-在运行时处理 CSS/JS 缩小和 LESS/SASS 转换
    • BaconAssetLoaderpublic/ - 通过在部署时将它们部署在目录中来公开模块中的资产
于 2012-04-25T12:56:54.487 回答
5

有很多方法可以做到这一点。

在我看来,Assetic 浪费了计算性能,非常不适合这个简单的问题。

如前所述,问题是从模块访问 /public 。

我的解决方案如下:

编辑 htdocs/yoursite/public/.htaccess 以在 RewriteEngine On 之后添加此行:

RewriteRule ^resource/([a-zA-Z0-9\.\-]+)/([a-zA-Z0-9\.\-_\/]+)$ index.php?action=resource&module=$1&path=$2 [QSA,L]

编辑 htdocs/yoursite/public/index.php 并在 chdir(dirname( DIR ));之后添加此代码:

if (isset($_GET['action']) && $_GET['action'] == "resource") {
    $module = $_GET['module'];
    $path = $_GET['path'];
    if (!ctype_alnum($module))
        die("Module name must consist of only alphanumeric characters");

    $filetype = pathinfo($path, PATHINFO_EXTENSION);
    $mimetypes = array(
        'js' => "text/javascript",
        'css' => "text/css",
        'jpg' => "image/jpeg",
        'jpeg' => "image/jpeg",
        'png' => "image/png"
    );

    if (!isset($mimetypes[$filetype]))
        die(sprintf("Unrecognized file extension '%s'. Supported extensions: %s.", htmlspecialchars($filetype, ENT_QUOTES), implode(", ", array_keys($mimetypes))));

    $currentDir = realpath(".");
    $destination = realpath("module/$module/public/$path");
    if (!$destination)
        die(sprintf("File not found: '%s'!", htmlspecialchars("module/$module/public/$path", ENT_QUOTES)));

    if (substr($destination, 0, strlen($currentDir)) != $currentDir)
            die(sprintf("Access to '%s' is not allowed!", htmlspecialchars($destination, ENT_QUOTES)));

    header(sprintf("Content-type: %s", $mimetypes[$filetype]));
    readfile("module/$module/public/$path", FALSE);
    die();
}

用法:/resource/moduleName/path

示例:http: //yoursite.com/resource/Statistics/css/style.css将从 yoursite/module/Statistics/public/css/style.css 读取实际的 css。

它快速、安全、不需要您在配置中指定任何路径、不需要安装、不依赖 3rd-party 维护,并且不需要帮助。只需从任何地方访问 /resource !享受 :)

于 2012-12-12T14:55:45.593 回答
0

您可以尝试使用 phing 来管理您的构建过程并让它全部自动化。您必须编写构建脚本,但之后就像在 CD 播放器上播放一样。

当然,对于测试,这将是一种痛苦。

于 2012-08-05T04:03:45.367 回答