Подтвердить что ты не робот

Как объединить общие каталоги Zend Framework 2

Некоторые модули zf2 имеют общедоступные каталоги для распределения ресурсов, таких как js/css/images. Какова наилучшая практика для предоставления этих ресурсов для приложения?

Мне бы хотелось, чтобы эти ресурсы были автоматически доступны через http://mysite.com/[moduleName]/. Например,

root/public/js/sitescript.jshttp:\\mysite.com\js\sitescript.js

root/module/mymodule/public/js/modulescript.jshttp:\\mysite.com\mymodule\js\modulescript.js

root/vendor/vendormodule/public/js/vendorscript.jshttp:\\mysite.com\vendormodule\js\vendorscript.js

Должны ли эти ресурсы копироваться в каталог root/public? Ручное копирование будет болезненным, и я сомневаюсь, что автоматизированный процесс сборки для объединения каталогов также будет очень практичным.

Возможно, есть какая-то магия, которая может работать с httpd.conf или .htaccess?

Возможно, символические ссылки являются решением? Но символические ссылки не имеют прямого отношения к платформе Windows и должны быть созданы вручную для каждого отдельного модуля.

4b9b3361

Ответ 1

Есть четыре способа справиться с этим:

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

    • AssetManager - при поддержке assetic - объединяет активы во время выполнения, имеет кеширование для производства среды и фильтры для минимизации CSS/JS и преобразования LESS/SASS, позволяет выставлять ресурсы из каталогов в самих модулях.
    • zf2-assetic-module - подкрепляется assetic - обрабатывает миниатюризацию CSS/JS и LESS/SASS преобразование во время выполнения
    • BaconAssetLoader - выдает активы из модулей, развертывая их в директории public/ во время развертывания

Ответ 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-плеере.

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