Slide 1

Slide 1 text

Puli Universal libraries in PHP sfPot Paris - 16/02/2016 1

Slide 2

Slide 2 text

About Titouan Galopin Certified developer at SensioLabs Puli core contributor @tgalopin // titouangalopin.com

Slide 3

Slide 3 text

Agenda I. What’s Puli? II. How to use Puli? III. Status of Puli and what’s coming in 2016

Slide 4

Slide 4 text

I. What’s Puli?

Slide 5

Slide 5 text

What’s Puli? Composer Install packages

Slide 6

Slide 6 text

What’s Puli? Composer Install packages Resolve their dependencies

Slide 7

Slide 7 text

What’s Puli? Composer Install packages Resolve their dependencies Autoload their classes

Slide 8

Slide 8 text

What’s Puli? What about translations, views, services, …?

Slide 9

Slide 9 text

What’s Puli? We use the framework => bundles/modules/… (framework extensions)

Slide 10

Slide 10 text

Currently in Packagist Libraries Symfony bundles Drupal modules Zend Framework modules Laravel packages What’s Puli?

Slide 11

Slide 11 text

What’s Puli? But all framework extensions do the same things

Slide 12

Slide 12 text

Ideal world Libraries ✓ Symfony bundles Drupal modules Zend Framework modules Laravel packages What’s Puli?

Slide 13

Slide 13 text

What’s Puli? Why do we need framework extensions?

Slide 14

Slide 14 text

What’s Puli? login.html.twig To simplify access to resources Before: return $this->render( __DIR__ . ‘/../../vendor/ friendsofsymfony/user- bundle/Resources/views/Security/index.html. twig’ ); After: return $this->render( ‘FOSUserBundle:Security:login.html.twig’ );

Slide 15

Slide 15 text

What’s Puli? messages.fr.xlst To autoload specialized files /FOS /UserBundle /Command /ActivateUserCommand.php <= /Controller /DependencyInjection /FOSUserBundleExtension.php <= /Resources /translations /messages.en.xlst <= /messages.fr.xlst <= /...

Slide 16

Slide 16 text

What’s Puli? To publish assets /web/bundles/fos-user-bundle /css /style.css /images /image.png /vendor/.../FOS/UserBundle /Resources /public /css /style.css /images /image.png

Slide 17

Slide 17 text

What’s Puli? Puli provides a generic way to solve these 3 problems

Slide 18

Slide 18 text

What’s Puli? It provides a standard for interactions between packages and frameworks

Slide 19

Slide 19 text

Less community fragmentation What’s Puli?

Slide 20

Slide 20 text

Useful for library developers A single config file and your library is available for everyone What’s Puli?

Slide 21

Slide 21 text

Useful for frameworks developers Stop wasting efforts by reinventing the wheel What’s Puli?

Slide 22

Slide 22 text

Useful for application developers Same conventions in every application Very extensible What’s Puli?

Slide 23

Slide 23 text

II. How to use Puli?

Slide 24

Slide 24 text

How to use Puli? 1. JSON configuration file (like Composer)

Slide 25

Slide 25 text

How to use Puli? 2. Puli PHP Repository to access resources

Slide 26

Slide 26 text

How to use Puli? 3. Puli command tool to publish resources

Slide 27

Slide 27 text

puli.json /app /src /vendor /web /composer.json /puli.json How to use Puli?

Slide 28

Slide 28 text

Simplify access to resources How to use Puli?

Slide 29

Slide 29 text

// puli.json { "resources": { "/app": "app/Resources", "/custom-library": "vendor/..." } } Simplify access to resources How to use Puli?

Slide 30

Slide 30 text

require ‘vendor/autoload.php’; $puliClass = PULI_FACTORY_CLASS; $puli = new $puliClass(); $repo = $puli->createRepository(); Simplify access to resources How to use Puli?

Slide 31

Slide 31 text

echo $repo->get('/app/views/index.html.twig') ->getBody(); echo $repo->get('/app/views/index.html.twig') ->getFilesystemPath(); echo $repo->get('/custom-library'. '/views/index.html.twig') ->getFilesystemPath(); Simplify access to resources How to use Puli?

Slide 32

Slide 32 text

meh. How to use Puli?

Slide 33

Slide 33 text

puli/composer-plugin How to use Puli?

Slide 34

Slide 34 text

Let library developers create their puli.json How to use Puli?

Slide 35

Slide 35 text

// /vendor/acme/custom-library/puli.json { "resources": { "/views": "views", ... } } Simplify access to resources How to use Puli?

Slide 36

Slide 36 text

$ composer require acme/custom-library Updating dependencies (including require-dev) - Installing acme/custom-library (1.0.0) Downloading: 100% Synchronizing Puli with Composer Installing acme/custom-library Deleting the ".puli" directory Running "puli build" Simplify access to resources How to use Puli?

Slide 37

Slide 37 text

echo $repo->get('/acme/custom-library'. '/views/index.html.twig') ->getFilesystemPath(); Simplify access to resources How to use Puli?

Slide 38

Slide 38 text

Simplify access to resources Override library resources // the library puli.json { "resources": { "/views": "views" } } // your app puli.json { "resources": { "/app": "app/Resources", "/acme/custom-library/views/index.html.twig": "myview.html.twig" } } How to use Puli?

Slide 39

Slide 39 text

Autoload specialized files How to use Puli?

Slide 40

Slide 40 text

// your app puli.json { "resources": { "/app": "app", "/res": "app/Resources" }, "provide": { "/app/config/services.yml": "symfony/services", "/res/translations/*.yml": "symfony/translations" } } Autoload specialized files Defined by Symfony to load your files using Puli $discovery->findBindings('...') How to use Puli?

Slide 41

Slide 41 text

// /vendor/acme/custom-library/puli.json { "resources": { "/config": "res/config", "/translations": "res/translations" }, "provide": { "/config/symfony-services.yml": "symfony/services", "/config/pimple-services.yml": "pimple/services", "/config/php-di-services.yml": "php-di/services" } } Autoload specialized files Usable by libraries Binding are not necessarily used by the “consumer” How to use Puli?

Slide 42

Slide 42 text

// /vendor/acme/custom-library/puli.json { "resources": { "/config": "res/config", "/translations": "res/translations" }, "provide": { "/config/services.yml": "yaml-services", "/src/AcmeLogger.php": "psr-logger", "/src/HttpClient.php": "php-http-client", "/translations/*.xlst": "xlst-translations" } } Autoload specialized files Even better with standards (PHP-FIG or others) Usage of standards for better usability How to use Puli?

Slide 43

Slide 43 text

$ composer require acme/custom-library => Services available in your container => Translations available in your translator => Doctrine entities, Twig extensions, ... Autoload specialized files Plug’n’Play (even more than bundles!) How to use Puli?

Slide 44

Slide 44 text

Publish assets How to use Puli?

Slide 45

Slide 45 text

Let library developers create their puli.json How to use Puli?

Slide 46

Slide 46 text

Coming soon: puli.js JS library to resolve Puli path in filesystem paths Publish assets How to use Puli?

Slide 47

Slide 47 text

// gulpfile.babel.js gulp.task('babel', () => gulp.src(puli.paths('/app/**/*.jsx') .pipe(babel()) .pipe(ulgify()) .pipe(header('(c) SensioLabs')) .pipe(gulp.dest('web/built/min.js')) ); Publish assets How to use Puli?

Slide 48

Slide 48 text

Powerful features Discovery, Versioning, Symbolic links, ...

Slide 49

Slide 49 text

III. Status of Puli and what’s coming in 2016

Slide 50

Slide 50 text

1.0.0-beta10 Status of Puli and what’s coming in 2016

Slide 51

Slide 51 text

Already used in production Status of Puli and what’s coming in 2016

Slide 52

Slide 52 text

Documentation on docs.puli.io Status of Puli and what’s coming in 2016

Slide 53

Slide 53 text

Working Symfony bundle puli/symfony-bundle Status of Puli and what’s coming in 2016

Slide 54

Slide 54 text

Examples of Puli usage Status of Puli and what’s coming in 2016 PHP-HTTP FOSHttpCache Phlexible

Slide 55

Slide 55 text

Get involved! github.com/puli/issues Status of Puli and what’s coming in 2016

Slide 56

Slide 56 text

We are hiring! Hadrien FONTAINE hadrien.fontaine@sensiolabs.com 01.40.99.80.74 SensioLabs

Slide 57

Slide 57 text

Questions? 57 Titouan Galopin SensioLabs University