Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Composer: From Beginner to Expert Northeast PHP 2014 Jonathan Klein @jonathanklein
Slide 2
Slide 2 text
jkle.in/composer
Slide 3
Slide 3 text
No content
Slide 4
Slide 4 text
“The best way to use 3rd party code”
Slide 5
Slide 5 text
“…and autoload your code”
Slide 6
Slide 6 text
No content
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
A Story in Three Acts 1. Dependency Management
Slide 10
Slide 10 text
A Story in Three Acts 1. Dependency Management
Slide 11
Slide 11 text
A Story in Three Acts 1. Using 3rd Party Code
Slide 12
Slide 12 text
A Story in Three Acts 1. Using 3rd Party Code 2. Autoloading Your Code
Slide 13
Slide 13 text
A Story in Three Acts 1. Using 3rd Party Code 2. Autoloading Your Code 3. Publishing Packages
Slide 14
Slide 14 text
Using 3rd Party Code
Slide 15
Slide 15 text
Install Composer
Slide 16
Slide 16 text
curl -sS https://getcomposer.org/installer | php ! mv composer.phar /usr/bin/composer
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
https://www.flickr.com/photos/monkeywobble/2124397478
Slide 22
Slide 22 text
https://www.flickr.com/photos/adrianblack/3358661327
Slide 23
Slide 23 text
Three Ways Composer Helps
Slide 24
Slide 24 text
Three Ways Composer Helps 1. Simple JSON Config File (composer.json)
Slide 25
Slide 25 text
Three Ways Composer Helps 1. Simple JSON Config File (composer.json) 2. Repository of Code (Packagist)
Slide 26
Slide 26 text
Three Ways Composer Helps 1. Simple JSON Config File (composer.json) 2. Repository of Code (Packagist) 3. Generated Autoload File (autoload.php)
Slide 27
Slide 27 text
Simplest JSON Config File { }
Slide 28
Slide 28 text
Simplest JSON Config File { "require": { "monolog/monolog": "1.10.*" } }
Slide 29
Slide 29 text
Simplest JSON Config File { "require": { "monolog/monolog": "1.10.*" } } Vendor Name
Slide 30
Slide 30 text
Simplest JSON Config File { "require": { "monolog/monolog": "1.10.*" } } Vendor Name Package Name
Slide 31
Slide 31 text
Simplest JSON Config File { "require": { "monolog/monolog": "1.10.*" } } Vendor Name Package Name Version Number
Slide 32
Slide 32 text
Composer + Packagist
Slide 33
Slide 33 text
No content
Slide 34
Slide 34 text
No content
Slide 35
Slide 35 text
No content
Slide 36
Slide 36 text
Simplest JSON Config File { "require": { "monolog/monolog": "1.10.*" } } Vendor Name Package Name Version Number
Slide 37
Slide 37 text
No content
Slide 38
Slide 38 text
No content
Slide 39
Slide 39 text
No content
Slide 40
Slide 40 text
No content
Slide 41
Slide 41 text
$ composer install
Slide 42
Slide 42 text
Vendor Directory
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
Vendor Directory
Slide 45
Slide 45 text
No content
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
$ composer install
Slide 48
Slide 48 text
Using The Code addWarning('Foo');
Slide 49
Slide 49 text
Using The Code addWarning('Foo'); Generated autoload file
Slide 50
Slide 50 text
No content
Slide 51
Slide 51 text
No content
Slide 52
Slide 52 text
No content
Slide 53
Slide 53 text
{ "require": { "monolog/monolog": "1.10.*", "filp/whoops": "1.*", "respect/validation": "0.5.*", "swiftmailer/swiftmailer": "5.0.*" } } composer.json
Slide 54
Slide 54 text
$ composer update
Slide 55
Slide 55 text
composer require filp/whoops:1.* composer require respect/validation:0.5.* composer require swiftmailer/swiftmailer:5.0.*
Slide 56
Slide 56 text
Using The Code validate($number);
Slide 57
Slide 57 text
Using The Code validate($number);
Slide 58
Slide 58 text
Using The Code validate($number);
Slide 59
Slide 59 text
Versioning
Slide 60
Slide 60 text
{ "require": { "monolog/monolog": "1.10.*", "filp/whoops": "1.*", "respect/validation": "0.5.*", "swiftmailer/swiftmailer": "5.0.*" } }
Slide 61
Slide 61 text
composer.lock
Slide 62
Slide 62 text
composer.lock Commit this
Slide 63
Slide 63 text
No content
Slide 64
Slide 64 text
$ composer update
Slide 65
Slide 65 text
No content
Slide 66
Slide 66 text
No content
Slide 67
Slide 67 text
vendor/autoload.php is regenerated
Slide 68
Slide 68 text
vendor/autoload.php should be the only include in your application
Slide 69
Slide 69 text
“What about MY Code?”
Slide 70
Slide 70 text
Autoloading Your Code
Slide 71
Slide 71 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/"} } }
Slide 72
Slide 72 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/"} } } WTF?
Slide 73
Slide 73 text
PSR: PHP Specification Request
Slide 74
Slide 74 text
No content
Slide 75
Slide 75 text
Approved Standards PSR-0 Autoloading PSR-1 Basic Coding Standard PSR-2 Coding Style Guide PSR-3 Logger Interface PSR-4 Improved Autoloading
Slide 76
Slide 76 text
Approved Standards PSR-0 Autoloading PSR-1 Basic Coding Standard PSR-2 Coding Style Guide PSR-3 Logger Interface PSR-4 Improved Autoloading
Slide 77
Slide 77 text
Approved Standards PSR-0 Autoloading PSR-1 Basic Coding Standard PSR-2 Coding Style Guide PSR-3 Logger Interface PSR-4 Improved Autoloading
Slide 78
Slide 78 text
What Improved?
Slide 79
Slide 79 text
What Improved? 1. Underscores no longer designate directories
Slide 80
Slide 80 text
What Improved? 1. Underscores no longer designate directories 2. Namespaces can map to arbitrary folders
Slide 81
Slide 81 text
No content
Slide 82
Slide 82 text
No content
Slide 83
Slide 83 text
No content
Slide 84
Slide 84 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": { "Acme\\": "src/" } } }
Slide 85
Slide 85 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": { "Acme\\": ["src/", "tests/"] } } }
Slide 86
Slide 86 text
No content
Slide 87
Slide 87 text
Takeaway: Use PSR-4
Slide 88
Slide 88 text
Autoloading code
Slide 89
Slide 89 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/Foo/Bar/"} } }
Slide 90
Slide 90 text
Autoloading code
Slide 91
Slide 91 text
Slide 92
Slide 92 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": { "Acme\\": "src/", "Vendor\\Namespace\\": "" } } }
Slide 93
Slide 93 text
“What About Functions?”
Slide 94
Slide 94 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/"}, "files": ["src/functions.php"] } }
Slide 95
Slide 95 text
No content
Slide 96
Slide 96 text
No content
Slide 97
Slide 97 text
Publishing Packages
Slide 98
Slide 98 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/Foo/Bar/"} } }
Slide 99
Slide 99 text
{ "name": "acme/hello", "description": "Prints Hello, World", "require": { "monolog/monolog": "1.10.*" }, ! "autoload": { "psr-4": {"Acme\\": "src/Foo/Bar/"} } }
Slide 100
Slide 100 text
No content
Slide 101
Slide 101 text
No content
Slide 102
Slide 102 text
No content
Slide 103
Slide 103 text
Private Repository with Satis
Slide 104
Slide 104 text
Bonus: Advanced Usage
Slide 105
Slide 105 text
{ "require": { "monolog/monolog": "1.10.*" }, ! "require-dev": { "phpunit/phpunit": "3.7.*", "mockery/mockery": "0.7.*" } }
Slide 106
Slide 106 text
{ "scripts": { "post-update-cmd": "MyVendor\\MyClass::postUpdate", "post-package-install": [ "MyVendor\\MyClass::postPackageInstall" ], "post-install-cmd": [ "MyVendor\\MyClass::warmCache", "phpunit -c app/" ] } }
Slide 107
Slide 107 text
{ "scripts": { "post-update-cmd": "MyVendor\\MyClass::postUpdate", "post-package-install": [ "MyVendor\\MyClass::postPackageInstall" ], "post-install-cmd": [ "MyVendor\\MyClass::warmCache", "phpunit -c app/" ] } }
Slide 108
Slide 108 text
{ "scripts": { "post-update-cmd": "MyVendor\\MyClass::postUpdate", "post-package-install": [ "MyVendor\\MyClass::postPackageInstall" ], "post-install-cmd": [ "MyVendor\\MyClass::warmCache", "phpunit -c app/" ] } }
Slide 109
Slide 109 text
Other Useful Commands
Slide 110
Slide 110 text
Other Useful Commands composer init
Slide 111
Slide 111 text
Other Useful Commands composer init composer remove
Slide 112
Slide 112 text
Other Useful Commands composer init composer remove composer validate
Slide 113
Slide 113 text
Other Useful Commands composer init composer remove composer validate composer self-update
Slide 114
Slide 114 text
Other Useful Commands composer init composer remove composer validate composer self-update composer diagnose
Slide 115
Slide 115 text
Other Useful Commands composer init composer remove composer validate composer self-update composer diagnose composer status
Slide 116
Slide 116 text
Wrap Up
Slide 117
Slide 117 text
Wrap Up • Include 3rd Party Code
Slide 118
Slide 118 text
Wrap Up • Include 3rd Party Code • Autoload Your Own Code
Slide 119
Slide 119 text
Wrap Up • Include 3rd Party Code • Autoload Your Own Code • Publish Packages
Slide 120
Slide 120 text
Thanks!
Slide 121
Slide 121 text
! jkle.in/composer ! @jonathanklein jonathan@etsy.com www.etsy.com/careers