Php 如何合并Zend Framework 2模块公共目录

Php 如何合并Zend Framework 2模块公共目录,php,zend-framework2,Php,Zend Framework2,一些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\mo

一些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种处理方法:

  • 符号链接
    public/
    目录中的资产
  • 将粘贴资源从模块复制到
    public/
    目录
  • 使用(或通常使用web服务器配置)
  • 使用资产管理器模块,例如以下模块之一:

    • -支持-在运行时合并资产,具有用于生产环境的缓存和用于CSS/JS缩小和LESS/SASS转换的过滤器,允许从模块本身的目录中公开资产
    • -支持-在运行时处理CSS/JS缩小和LESS/SASS转换
    • -通过在部署时将模块部署到
      public/
      目录中,公开模块中的资产

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


    当然,对于测试来说,这将是一件痛苦的事情。

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

    在我看来,Assetic是对计算性能的浪费,对于这个简单的问题来说,它真的不适合

    如上所述,问题在于从模块访问/公开

    我的解决方案如下:

    编辑htdocs/yoursite/public/.htaccess,在重新编写引擎后立即添加此行:

    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($\u GET['action'])&&&$\u GET['action']==“资源”){
    $module=$_GET['module'];
    $path=$_GET['path'];
    if(!ctype_alnum($module))
    模具(“模块名称必须仅由字母数字字符组成”);
    $filetype=pathinfo($path,pathinfo_扩展名);
    $mimetypes=数组(
    “js”=>“text/javascript”,
    “css”=>“文本/css”,
    “jpg”=>“图像/jpeg”,
    “jpeg”=>“图像/jpeg”,
    “png”=>“图像/png”
    );
    如果(!isset($mimetypes[$filetype]))
    die(sprintf(“无法识别的文件扩展名“%s”。支持的扩展名:%s.”,htmlspecialchars($filetype,ENT_引号),内爆(“,”,数组_键($mimetypes));
    $currentDir=realpath(“.”);
    $destination=realpath(“module/$module/public/$path”);
    如果(!$destination)
    die(sprintf(“未找到文件:'%s'!”,htmlspecialchars(“module/$module/public/$path”,ENT_引号));
    if(substr($destination,0,strlen($currentDir))!=$currentDir)
    die(sprintf(“不允许访问“%s!”),htmlspecialchars($destination,entu引号));
    标题(sprintf(“内容类型:%s”,$mimetypes[$filetype]);
    readfile(“module/$module/public/$path”,FALSE);
    模具();
    }
    
    用法: /资源/模块名/路径

    例如: 将从您的站点/module/Statistics/public/css/style.css读取实际的css


    它快速、安全,不需要您在配置中指定任何路径,不需要安装,不依赖第三方维护,并且在视图中不需要帮助。只需从任何地方访问资源!享受:)

    谢谢你的建议。我现在使用符号链接-复制和粘贴太痛苦了,我现在不想让资产管理器增加额外的开销。@superdweebie我更新了答案,添加了更流行的
    AssetManager
    和一些众所周知的技术。正如你所说,测试将是一件痛苦的事情,这使得我现在不想再做这个想法了。