Как объединить общие каталоги Zend Framework 2
Некоторые модули 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
Должны ли эти ресурсы копироваться в каталог root/public? Ручное копирование будет болезненным, и я сомневаюсь, что автоматизированный процесс сборки для объединения каталогов также будет очень практичным.
Возможно, есть какая-то магия, которая может работать с httpd.conf или .htaccess?
Возможно, символические ссылки являются решением? Но символические ссылки не имеют прямого отношения к платформе Windows и должны быть созданы вручную для каждого отдельного модуля.
Ответы
Ответ 1
Есть четыре способа справиться с этим:
Ответ 2
Существует много способов сделать это.
На мой взгляд, Assetic - это трата вычислительной производительности и очень плохо подходит для этой простой проблемы.
Проблема, как указано, обращается к/публично из модулей.
Мое решение следующее:
Измените 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();
}
Использование:
/Ресурсов/ModuleName/путь
Пример:
http://yoursite.com/resource/Statistics/css/style.css будет читать фактический css из вашего сайта/модуля/Statistics/public/css/style.css.
Он быстрый, безопасный, вам не нужно указывать какие-либо пути в конфигурации, не требует установки, не полагается на стороннее обслуживание и не нуждается в помощнике. Просто доступ/ресурс из любого места! Наслаждайтесь:)
Ответ 3
Вы можете попробовать использовать phing для управления процессом сборки и автоматизировать его все. Вам нужно будет написать сборку script, но потом это будет просто удар по игре на CD-плеере.
Конечно, для тестирования это будет боль.