Как объединить общедоступные каталоги модулей 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, и их необходимо создавать вручную для каждого отдельного модуля.

Author: superdweebie, 2012-04-24

3 answers

Есть 4 способа справиться с этим:

  1. Ресурсы символических ссылок в каталоге public/
  2. Копирование-вставка ресурсов из модулей в каталог public/
  3. С использованием определенной конфигурации виртуального хоста (или, как правило, конфигурации веб-сервера)
  4. Используйте модуль управления активами, например один из следующих:

    • AssetManager - поддерживается assetic - объединяет активы во время выполнения, имеет кэширование для производства среды и фильтры для минимизации CSS/JS и преобразования LESS/SASS позволяют отображать ресурсы из каталогов в самих модулях.
    • zf2-assetic-модуль - поддерживается assetic - обрабатывает минимизацию CSS/JS и преобразование LESS/SASS во время выполнения
    • Baconassetloader - предоставляет ресурсы из модулей, развертывая их в каталоге public/ во время развертывания
 17
Author: superhero, 2013-02-27 18:48:14

Есть много способов сделать это.

На мой взгляд, 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.

Это быстро, безопасно, вам не нужно указывать какие-либо пути в конфигурации, не требует установки, не зависит от стороннего обслуживания и не нуждается в помощнике в поле зрения. Просто получите доступ/ресурс из любого места! Наслаждайтесь:)

 5
Author: demonkoryu, 2013-10-18 08:20:36

Вы можете попробовать использовать phing для управления процессом сборки и автоматизировать все это. Вам пришлось бы написать сценарий сборки, но после этого это было бы все равно, что нажать кнопку воспроизведения на проигрывателе компакт-дисков.

Конечно, для тестирования это было бы больно.

 0
Author: Jerry Saravia, 2012-08-05 04:03:45