Php 如何合并Zend Framework 2模块公共目录
一些zf2模块具有公共目录,用于分发js/css/images等资源。向应用程序提供这些资源的最佳实践是什么 我希望这些资源可以通过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
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/
目录- -支持-在运行时合并资产,具有用于生产环境的缓存和用于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
和一些众所周知的技术。正如你所说,测试将是一件痛苦的事情,这使得我现在不想再做这个想法了。