Как объединить общие каталоги 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
Должны ли эти ресурсы копироваться в корневой / общедоступный каталог? Ручное копирование будет болезненным, и я сомневаюсь, что автоматизированный процесс сборки для объединения каталогов будет очень практичным.
Возможно, есть какая-то магия, с которой можно работать с httpd.conf или .htaccess?
Возможно, символические ссылки – это решение? Но символические ссылки не имеют прямого отношения к платформе Windows и должны создаваться вручную для каждого отдельного модуля.
3 Solutions collect form web for “Как объединить общие каталоги Zend Framework 2”
Есть четыре способа справиться с этим:
- Symlinking активы в
public/
директории - Скопировать файлы из модулей в
public/
каталог - Используя определенную конфигурацию виртуального хоста (или, как правило, конфигурацию веб-сервера)
-
Используйте модуль управления активами, например, один из следующих:
- AssetManager – подкрепляется assetic – объединяет активы во время выполнения, имеет кеширование для производственных сред и фильтры для минимизации CSS / JS и LESS / SASS, позволяет выставлять ресурсы из каталогов в самих модулях.
- zf2-assetic-module – при поддержке assetic – обрабатывает минимизацию CSS / JS и преобразование LESS / SASS во время выполнения
- BaconAssetLoader – выдает активы из модулей, развертывая их в
public/
dir во время развертывания
Есть много способов сделать это.
На мой взгляд, 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(); }
Использование: / resource / moduleName / path
Пример: http://yoursite.com/resource/Statistics/css/style.css прочитает фактический css с вашего сайта / модуля / Statistics / public / css / style.css.
Это быстро, безопасно, вам не нужно указывать какие-либо пути в конфигурации, не требует установки, не полагается на стороннее обслуживание и не нуждается в помощнике. Просто доступ / ресурс из любого места! Наслаждаться 🙂
Вы можете попробовать использовать phing для управления процессом сборки и автоматизировать его все. Вам нужно будет написать сценарий сборки, но потом это будет просто удар по игре на CD-плеере.
Конечно, для тестирования это было бы болью.