Как объединить общедоступные каталоги модулей Zend Framework 2
Некоторые модули zf2 имеют общедоступные каталоги для распределения ресурсов, таких как js/css/изображения. Какова наилучшая практика для предоставления этих ресурсов приложению?
Я бы хотел, чтобы эти ресурсы были автоматически доступны через 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, и их необходимо создавать вручную для каждого отдельного модуля.
3 answers
Есть 4 способа справиться с этим:
- Ресурсы символических ссылок в каталоге
public/
- Копирование-вставка ресурсов из модулей в каталог
public/
- С использованием определенной конфигурации виртуального хоста (или, как правило, конфигурации веб-сервера)
-
Используйте модуль управления активами, например один из следующих:
- AssetManager - поддерживается assetic - объединяет активы во время выполнения, имеет кэширование для производства среды и фильтры для минимизации CSS/JS и преобразования LESS/SASS позволяют отображать ресурсы из каталогов в самих модулях.
- zf2-assetic-модуль - поддерживается assetic - обрабатывает минимизацию CSS/JS и преобразование LESS/SASS во время выполнения
-
Baconassetloader - предоставляет ресурсы из модулей, развертывая их в каталоге
public/
во время развертывания
Есть много способов сделать это.
На мой взгляд, Assetic - это пустая трата вычислительной производительности и действительно плохо подходит для этой простой задачи.
Проблема, как уже говорилось, заключается в доступе/общедоступности из модулей.
Мое решение заключается в следующем:
Отредактируйте htdocs/ваш сайт/общедоступный/.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(имя файла(РЕЖ));:
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();
}
Использование: /ресурс/имя модуля/путь
Пример: http://yoursite.com/resource/Statistics/css/style.css прочитает фактический css с вашего сайта/модуля/Статистики/public/css/style.css.
Это быстро, безопасно, вам не нужно указывать какие-либо пути в конфигурации, не требует установки, не зависит от стороннего обслуживания и не нуждается в помощнике в поле зрения. Просто получите доступ/ресурс из любого места! Наслаждайтесь:)
Вы можете попробовать использовать phing для управления процессом сборки и автоматизировать все это. Вам пришлось бы написать сценарий сборки, но после этого это было бы все равно, что нажать кнопку воспроизведения на проигрывателе компакт-дисков.
Конечно, для тестирования это было бы больно.