Puli — это новый инструментарий, созданный поверх Composer, который помогает управлять и обмениваться ресурсами, такими как файлы конфигурации, изображения, файлы CSS, каталоги переводов и другие. Вы согласитесь, что их часто сложно поддерживать и совместно использовать в разных проектах.
Puli предоставляет независимое от фреймворка решение этой проблемы, отслеживая местоположение каждого ресурса и избегая проблем использования абсолютных или относительных путей внутри разных систем.
Как это устроено
- Вы отображаете ресурсы через CLI.
- Файл
puli.json
отслеживает их. - Вы используете экземпляр
ResourceRepository
для обработки ресурсов.
Проект Puli также предоставляет библиотеки для других функций, таких как генерация URL или поддержка Twig.
Установите Пули CLI
Чтобы использовать Puli, сначала необходимо установить CLI Puli. Рекомендуется установить его как phar, что можно сделать, загрузив последнюю версию с GitHub .
Его можно поместить в каталог /usr/local/bin
для глобального доступа.
Ниже приведены шаги командной строки для быстрой установки предварительной версии 1.0.0-бета7 в Unix-подобных системах:
wget https :// github . com / puli / cli / releases / download / 1.0 . 0 - beta7 / puli . phar chmod 755 puli . phar sudo mv puli . phar / usr / local / bin
Вы также можете установить Puli как зависимость Composer в папке вашего проекта:
composer require --dev puli/cli:^1.0
или как глобальный пакет Composer с:
composer global require puli/cli:^1.0`
После установки CLI вы можете использовать Puli в проекте Symfony, в приложении PHP или в пакете Composer. Вы можете найти больше информации о типе вашего конкретного проекта в руководстве по началу работы .
Макет проекта
Всегда рекомендуется иметь аккуратную структуру каталогов. Документы Puli подтверждают это предположение, добавляя четкое разделение между кодом PHP и другими ресурсами, не относящимися к PHP.
Ниже приведен рекомендуемый пример макета каталога:
Картографические ресурсы
Отображение отдельных файлов или целых каталогов можно выполнить с помощью команды Puli map
. Например, чтобы отобразить содержимое каталога res
с использованием myapp
в качестве имени ресурса (путь Puli), вы можете запустить:
puli.phar map /myapp res
Вы заметите, что карта хранится в файле puli.json
созданном внутри папки проекта.
Теперь можно получить доступ ко всем отображенным ресурсам из PHP, используя путь Puli /myapp
.
CLI Puli предлагает другие полезные команды для управления отображениями. Некоторые из наиболее используемых:
-
ls
, чтобы перечислить все ресурсы. -
tree
, чтобы распечатать дерево списка ресурсов. -
find
, чтобы найти ресурс с некоторыми критериями фильтрации (т.е.puli find --name *.css
найдет все файлы.css
). -
map
с аргументами-u
или-d
, чтобы обновить / удалить карту (например:puli map -u myapp --add /new/folder
).
Еще одной важной особенностью является возможность сопоставлять ресурсы в пакетах Composer. Например, чтобы отобразить каталог /view
внутри каталога /vendor/author/packagename
вы можете использовать:
puli map / somepulipath @author / packagename : view
Практический пример
Чтобы показать Puli в действии, я создал пример проекта с Symfony: галерею изображений. Демонстрация отображает все изображения, хранящиеся в папке images_resource
.
Управление активами
Прежде чем двигаться дальше, стоит упомянуть несколько вещей об управлении активами:
- Symfony использует
web
папку для хранения всех файлов фронт-контроллера и веб-ресурсов (CSS, JS, изображения и т. Д.). По умолчаниюweb
папка является точкой общего доступа веб-приложения. Другими словами, прямой URL-доступ к другим каталогам проекта невозможен. - Демонстрационный проект содержит один
AppBundle
с его CSS и представлениями, хранящимися вsrc/AppBundle/Resources
. - Управление активами Symfony автоматически копирует ресурсы каждого пакета в общую
web
папку.
Вы увидите, как управление активами с помощью Puli является более гибким и предоставляет дополнительные параметры конфигурации.
Установка демо
Проверьте первую версию с:
git clone -b 1.0 https://github.com/niklongstone/symfony-gallery-demo.git
затем войдите в корневой каталог проекта и запустите: composer install
.
Консоль Symfony попросит вас настроить некоторые параметры, но вы можете просто нажать Enter, чтобы принять значения по умолчанию.
Два важных параметра:
-
images_resource
: папка с изображениями -
images_url
: общедоступный URL изображений
Наконец, в корне проекта вы можете запустить app/console server:start
запустите сервер и увидите приложение в браузере.
Картирование проекта
Чтобы отобразить все ресурсы в демонстрационном проекте Bundle, вы можете запустить:
puli.phar map /myapp/ src/AppBundle/Resources
С puli.phar tree
вы увидите что-то вроде:
Контроллер
Чтобы использовать отображенное представление в Controller, вы можете изменить DefaultController
следующим образом:
//old value: $this->template->render('AppBundle:Default:index.html.twig', $this -> template -> render ( '/myapp/views/Default/index.html.twig' ,
Вы можете снова открыть страницу проекта, чтобы увидеть, что ничего не изменилось, потому что Puli прекрасно назвал отображенное представление.
Вид
Следующая цель заключается в рефакторинге представления с использованием пути Puli для CSS.
Вы можете опубликовать ресурсы /myapp/public
в общедоступной папке демонстрационного проекта, в web
каталоге. Публикация — это, по сути, копирование или символическая ссылка на ресурсы.
Давайте сделаем это шаг за шагом:
-
Создайте сервер и свяжите с ним общую папку:
puli.phar server --add localhost web
-
Зарегистрируйте публичный путь Пули с помощью:
puli.phar publish /myapp/public localhost /app
-
Установите ресурсы с помощью:
puli.phar publish --install
Команда создаст символические ссылки элементов /myapp/public
в путь /web/app
.
Теперь пришло время изменить путь CSS в index.html.twig
следующим образом:
<link href = "{{ resource_url('/myapp/public/css/style.css') }}" rel = "stylesheet" >
На данный момент вы можете найти весь прогресс, который вы достигли до сих пор в версии 2.0 демо-проекта:
git clone -b 2.0 https://github.com/niklongstone/symfony-gallery-demo.git
или
git checkout 2.0
если у вас уже есть демо.
Не забудьте запустить composer install
в папке проекта, затем puli.phar publish --install
.
Генерация URL
Одно из преимуществ Puli — поддержка разных серверных ресурсов. Например, если вы хотите переместить свои ресурсы на другой сервер, например http://www.sitepoint.com/res/
вы можете запустить:
puli.phar server -u localhost --url-format http://www.sitepoint.com/res/%s
и каждый сопоставленный URL будет обновляться автоматически.
Другим вариантом использования может быть создание простой системы аннулирования кэша, добавление к строке запроса что-то вроде %s?v1
.
Открытие ресурса
Демонстрационный проект довольно гибкий и позволяет нам изменять папку с изображениями и URL. Puli предоставляет компонент Discovery, который может добавить еще больше гибкости — например, при фильтрации определенных ресурсов.
Компонент Discovery управляет связью между поставщиками ресурсов и потребителями ресурсов. Другими словами, он может связывать ресурсы с сервисами, которые будут их использовать.
В этом примере контроллер может быть потребителем ресурсов, а папка с изображениями может быть поставщиком ресурсов. Для обработки ресурса с помощью компонента Discovery сначала необходимо определить тип ресурса, а затем связать его с путем к ресурсу.
В этом примере мы создадим тип ресурса app/image
связанный с папкой web/images
с фильтром, чтобы получать только изображения JPEG.
Сначала нам нужно сопоставить папку web/images
:
puli.phar map /myapp/images /web/images
Затем вы создаете тип ресурса:
puli.phar type --define mygallery/image
наконец, вы можете привязать сопоставленную папку с помощью запроса jpg
:
puli.phar bind /myapp/images/*.jpg mygallery/image
Теперь вы можете реорганизовать DefaultController
следующим образом:
// The constructor needs the puli Discovery component instead of the images folder
public function __construct ( EngineInterface $template , KeyValueStoreDiscovery $puliDiscovery )
{ $this -> template = $template ; $this -> puliDiscovery = $puliDiscovery ;
}
// [...]
private function getImages ()
{ $images = array ();
//the discovery component will find the bind type with the filter $bindings = $this -> puliDiscovery -> findByType ( 'mygallery/image' );
//the loop gets the resources image names
foreach ( $bindings as $binding ) {
foreach ( $binding -> getResources () as $resource ) { $images [] = $resource -> getName ();
}
}
return $images ;
}
AppBundle/Resource/config/service.xml
может быть:
services : app . default_controller :
class : AppBundle \Controller\DefaultController arguments :
- @templating
- @puli . discovery
Если вы снова откроете домашнюю страницу, вы должны заметить, что только .png
изображения отсутствуют, как и ожидалось.
Чтобы увидеть окончательную версию демо-проекта, проверьте версию 3.0 и запустите composer install
и puli publish --install
чтобы увидеть правильный результат.
Компонент Discovery был создан главным образом для подключения пакетов Composer и упрощения этой интеграции. Вы можете найти больше информации на официальной странице Компонента Discovery .
Последние мысли
Пули решает реальную проблему об управлении ресурсами. Интерфейс CLI прост в использовании, а соединение с Composer является одной из сильных сторон проекта. Спасибо автору и всем авторам, скоро будет стабильный выпуск; хотя бета работает довольно хорошо.
Вы можете найти больше информации о Пули в официальной документации и поделиться своими личными мыслями в комментариях ниже.