Статьи

Может ли PuliPHP произвести революцию в разработке пакетов PHP?

Puli — это новый инструментарий, созданный поверх Composer, который помогает управлять и обмениваться ресурсами, такими как файлы конфигурации, изображения, файлы CSS, каталоги переводов и другие. Вы согласитесь, что их часто сложно поддерживать и совместно использовать в разных проектах.

Puli logo

Puli предоставляет независимое от фреймворка решение этой проблемы, отслеживая местоположение каждого ресурса и избегая проблем использования абсолютных или относительных путей внутри разных систем.

Как это устроено

  • Вы отображаете ресурсы через CLI.
  • Файл puli.json отслеживает их.
  • Вы используете экземпляр ResourceRepository для обработки ресурсов.

Проект Puli также предоставляет библиотеки для других функций, таких как генерация URL или поддержка Twig.

Puli components

Установите Пули 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 recommended directory layout

Картографические ресурсы

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

Demo project home logo

Картирование проекта

Чтобы отобразить все ресурсы в демонстрационном проекте Bundle, вы можете запустить:

 puli.phar map /myapp/ src/AppBundle/Resources 

С puli.phar tree вы увидите что-то вроде:

Puli demo project 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 является одной из сильных сторон проекта. Спасибо автору и всем авторам, скоро будет стабильный выпуск; хотя бета работает довольно хорошо.

Вы можете найти больше информации о Пули в официальной документации и поделиться своими личными мыслями в комментариях ниже.