Presented by Larry Garfield
Sharing is how Open Source works
Sucking at sharing is how
Open Source dies
Bridging code to your framework
(... and pray)
"Do it manually and pray" is for losers
We're better than that, right?
It's dumb to make it Symfony specific
—Jordi Boggiano
Nils Aderman (PHPBB): libzypp -> PHP
Jordi Boggiano (Monolog): Packagist, front-end for PEAR
Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you.
I'd say until early 2012 it was pretty unusable, yet people used it. I guess that's how badly it was needed.
— Jordi Boggiano
April 2013: 10,000 packages
(Not just Symfony!)
Some of the libraries available via Composer include...
PHP framework for web applications
PHP framework for web applications
Unit testing software framework for PHP
HTTP client & framework for building RESTful web service clients
Solr client library for PHP
Elasticsearch search engine/database for PHP
Log to files, sockets, inboxes, databases and various web services
JavaScript, stylesheet, and image asset management
# Quick-n-easy:
$ curl -sS https://getcomposer.org/installer | php
# Global
$ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin
$ composer.phar --version
Composer version d498e7
-rw-rw-r-- composer.json (your composer file)
drwxrwxr-x src/ (your code)
-rw-rw-r-- index.php (your front controller)
Base manifest file for your project
{
"name": "crell/myapp",
"description": "This app is amazing.",
"require": {
"guzzle/guzzle": "3.4.*"
},
"autoload": {
"psr-0": {
"MyName\\MyPackage": "src/"
}
}
}
Installs all dependencies for your project
$ composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.3.1)
Downloading: 100%
- Installing guzzle/guzzle (v3.4.3)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
Writing lock file
Generating autoload files
-rw-rw-r-- composer.json (your composer file)
-rw-rw-r-- composer.lock (generated)
drwxrwxr-x src/ (your code)
-rw-rw-r-- index.php (your front controller)
drwxrwxr-x vendor/ (everyone else's code)
-rw-rw-r-- composer.json (your composer file)
-rw-rw-r-- composer.lock (generated)
drwxrwxr-x src/ (your code)
-rw-rw-r-- index.php (your front controller)
drwxrwxr-x vendor/ (everyone else's code)
require_once __DIR__ . '/vendor/autoload.php';
// Every class is now yours to command!
// Autoload on demand! Your work: zero.
$client = new Guzzle\Http\Client('https://api.github.com');
$request = $client->get('/user')->setAuth('user', 'pass');
$response = $request->send();
echo $response->getBody();
Your exact dependency commits.
Updates all dependencies to the latest version
$ php composer.phar update
Loading composer repositories with package information
Updating dependencies
composer.lock?
=> Use it
No?
=> Use composer.json
Use composer.json
Generate a new composer.lock
{
"require": {
"guzzle/guzzle": "3.4.*",
"nocarrier/hal": ">=0.9, <=1.0",
"pimple/pimple": "~1.0",
"monolog/monolog": "dev-master#2eb0c097",
"easyrdf/easyrdf": "0.8.*@3ebb7d",
"php": ">=5.3.10",
"ext-pdo": "*"
}
}
{
"license": "MIT",
"require-dev": {
"phpunit/phpunit": "3.7.*@dev"
},
"suggest": {
"monolog/monolog": "Advanced logging package"
},
"config": {
"vendor-dir": "core/vendor",
"preferred-install": "dist"
},
"minimum-stability": "stable"
}
{
"autoload": {
"psr-0": {
"Drupal\\Core\\": "core/lib/",
},
"classmap": ["src/", "legacy/", "Pimple.php"],
"files": ["src/utility_functions.php"]
}
}
$ composer.phar create-project symfony/framework-standard-edition path/to/install 2.3.0
# remove the Git history
$ rm -rf .git
$ composer.phar install --no-dev --prefer-dist --optimize-autoloader
-rw-rw-r-- composer.json
-rw-rw-r-- LICENSE
-rw-rw-r-- phpunit.xml.dist
-rw-rw-r-- README.md
drwxrwxr-x src
drwxrwxr-x tests
{
"name": "crell/api-problem",
"description": "PHP wrapper for the api-problem IETF specification",
"license": "MIT",
"keywords": ["api-problem", "rest", "http", "json", "xml"],
"homepage": "https://github.com/Crell/ApiProblem",
"authors": [{
"name": "Larry Garfield",
"email": "larry@garfieldtech.com",
"homepage": "http://www.garfieldtech.com/"
}],
"autoload": {
"psr-0": {"Crell\\ApiProblem": "src/"}
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
"phpunit/phpunit": "3.7.*"
}
}
{
"require": {
"crell/api-problem": "1.0-beta1"
}
}
Satis allows you to host your own Composer repositories
{
"repositories": [
{
"type": "composer",
"url": "http://packages.example.org/"
}
],
"require": {
"company/package": "1.2.0",
"company/package2": "1.5.2",
"company/package3": "dev-master"
}
}
"Do it manually and pray" is for losers
With Composer, you can do better than that.
https://joind.in/talk/view/8690