title | theme | revealOptions | ||
---|---|---|---|---|
¡No sin Composer! |
league |
|
[@carlosgoce](https://twitter.com/carlosgoce)
Developer @ Initios- Autocarga ficheros PHP
- Estrategias
- Namespaces y PSR-4
- Gestionar dependencias
- Composer.lock
- Packagist
- Crear nuestras propias librerías
- Versionamiento Semántico
- Publicación
- Bonus
Algunos gestores de dependencias
NodeJS | npm | 2010 |
---|---|---|
Ruby | rubygems | 2004 |
Python | pip | 2011 |
... | ... | ... |
PHP | pear | 1999 |
PHP | composer | 2012 |
curl -sS https://getcomposer.org/installer | php
# Lo movemos al $PATH
mv composer.phar /usr/local/bin/composer
➤ composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 1.4.2 2017-05-17 08:17:52
- project
- index.php
- helpers.php
- queries.php
<?php # index.php
# Primero cargamos las librerías
require_once 'helpers.php';
require_once 'queries.php';
# Código del proyecto
Define en composer.json la estrategia/s de autocarga
{
"autoloading": {
"classmap": ["models/", "mislibrerias/"],
"files": ["helpers/consultas.php"]
}
}
<?php # index.php
require 'vendor/autoload.php';
# La clase Query es cargada automáticamente
Query::products->all();
- Classmap
- Files
- PSR-4
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
Busca clases escaneando los ficheros de las carpetas y/o ficheros indicados.
El resultado se guarda en vendor/composer/autoload_classmap.php
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
Útil para ficheros de funciones.
Usar con cautela, estos ficheros se cargan siempre.
Método recomendado para cargar clases
{
"autoload": {
"psr-4": { "MyLibrary\\": "src/" }
}
}
<?php # src/Service/EmailService.php
class MyLibrary\Service\EmailService {
...
}
Especificación en php-fig
composer dump-autoload
composer dump-autoload --optimize # para producción
<?php
require 'libs/SwiftMailer/Message.php';
require 'entidades/Message.php';
# Podríamos estar cargando 2 clases con mismo nombre
class Message {}
class Message {}
new Message();
<?php # fichero A
namespace PHPVigo\Service;
class Message {}
<?php # fichero B
namespace PHPVigo\Queue;
class Message {}
new Message();
new \PHPVigo\Service\Message();
<?php # fichero C
namespace PHPVigo\Controllers\HomeController;
use PHPVigo\Queue\Message as QueueMessage;
use PHPVigo\Service\Message as Message;
new Message();
new QueueMessage();
¿En qué ruta deberían estar los ficheros?
¿Como lanzaríamos una excepción en fichero C?
Nos bajamos un zip de "por ahí" y lo descomprimimos en nuestro proyecto
Problemas:
- ¿Cómo actualizarlo?
- ¿Cómo reutilizarlo en otros proyectos?
- ¿Cómo instalar dependencias de dependencias?
- ...
composer.json
{
"php": ">=5.6.4",
"require": {
"illuminate/support": "@stable",
"jstayton/google-maps-geocoder": "^2.4",
"league/csv": "^8.0",
},
"require-dev": {
"laravel-tinker": "dev-master"
}
}
Instalación
composer install
composer install --no-dev # para producción
# Paquetes y dependencias en la carpeta vendor
y a trabajar
<?php
# Incluímos composer
require 'vendor/autoload.php';
# Composer encuentra las clases por nosotros
$collection = new Illuminate\Support\Collection([[1, 2, 3]]);
$writer = new League\Csv\Writer::createFromPath('fichero.csv');
$writer->insertAll($collection);
Exacta | 1.0.2 |
Rango | >1.0.2 <2.0.0 |
Rango (con -) | 1.0 - 2.0 |
Comodín | 1.0.* |
Tilde | ~1.2 |
Caret (recomendado) | ^1.2 |
Generado tras una instalación o actualización
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "dd33e133dd4b85a5bb022156df0dc3a0",
"content-hash": "f56d04d420c56813a824b3f7b68ff352",
"packages": [
{
"name": "davejamesmiller/laravel-breadcrumbs",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/davejamesmiller/laravel-breadcrumbs.git",
"reference": "6ca5a600003ecb52a5b5af14dad82033058604e1"
},
...
Si hemos modificado nuestro composer.json, añadido nuevas dependencias, o simplemente queremos actualizarlo lanzaremos el comando composer update
El repositorio oficial de composer.
Y subirla a packagist.org
Ejemplo extraído de league/csv
{
"name": "league/csv",
"type": "library",
"description" : "Csv data manipulation made easy in PHP",
"keywords": ["csv", "import", "export", "read"],
"license": "MIT",
"homepage" : "http://csv.thephpleague.com",
"require": {
"php" : ">=7.0.10"
...
},
"require-dev": {
"phpunit/phpunit" : "^6.0",
...
},
"autoload": {
"psr-4": {
"League\\Csv\\": "src"
},
"files": ["src/functions_include.php"]
},
"autoload-dev": {
"psr-4": {
"LeagueTest\\Csv\\": "tests"
}
},
"scripts": {
"test": "phpunit --coverage-text; php-cs-fixer fix -v --diff --dry-run --allow-risky=yes;",
"phpunit": "phpunit --coverage-text",
"phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes;"
},
"suggest": {
"ext-iconv" : "Needed to ease transcoding CSV using iconv stream filters"
}
}
-
Imprescindible si quieres que otros lo utilicen
-
Extra points
- Sube tu código a github
- Revisa las normas y requisitos
- Envía tu repositorio
composer <comando>
comando | descripción |
---|---|
install | instala a partir de un composer.lock o genera uno |
update | actualiza a las últimas versiones y actualiza el composer.lock |
init | asistente para generar un composer.json |
dump | regenera ficheros de autocarga |
require | añade un paquete como dependencia a tu composer.json |
validate | verifica si tu composer.json es válido |
- 20-06-2017 PHPVigo