Skip to content

Latest commit

 

History

History
496 lines (359 loc) · 9.42 KB

no-sin-composer.md

File metadata and controls

496 lines (359 loc) · 9.42 KB
title theme revealOptions
¡No sin Composer!
league
transition
slide

¡No sin Composer!

[@carlosgoce](https://twitter.com/carlosgoce)

Developer @ Initios

Mapa


  1. Autocarga ficheros PHP
    • Estrategias
    • Namespaces y PSR-4
  2. Gestionar dependencias
  3. Crear nuestras propias librerías
  4. Bonus

¿Composer?

Algunos gestores de dependencias

NodeJSnpm2010
Rubyrubygems2004
Pythonpip2011
.........
PHPpear1999
PHPcomposer2012

Instalación


Unix

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

Windows

composer.exe


Autocarga


Método Old School

- 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
No hay forma de cargar únicamente una clase u otra en función de la request. Siempre se cargan todos los ficheros.

Método Composer

Define en composer.json la estrategia/s de autocarga

{
    "autoloading": {
        "classmap": ["models/", "mislibrerias/"],
        "files": ["helpers/consultas.php"]
    }
}

Inicializa Composer

<?php  # index.php
require 'vendor/autoload.php';

# La clase Query es cargada automáticamente
Query::products->all();

Estrategias

  • Classmap
  • Files
  • PSR-4

Estrategias

Classmap
{
    "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


Estrategias

Files
{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

Útil para ficheros de funciones.

Usar con cautela, estos ficheros se cargan siempre.


Estrategias

PSR-4

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


Refrescar Autoloading

composer dump-autoload
composer dump-autoload --optimize  # para producción

Namespaces

<?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();
> Fatal error: Cannot redeclare class 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?


Gestión de dependencias


Método Old School

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?
  • ...

Método Composer

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

Importamos el autoloader de Composer

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);

Exacta1.0.2
Rango>1.0.2 <2.0.0
Rango (con -)1.0 - 2.0
Comodín1.0.*
Tilde~1.2
Caret (recomendado)^1.2

Composer.lock

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"
            },
...
Cuando hagamos *composer install* con un composer.lock presente, siempre nos instalará lo que indique el composer.lock, no hará caso a composer.json.

Si hemos modificado nuestro composer.json, añadido nuevas dependencias, o simplemente queremos actualizarlo lanzaremos el comando composer update


packagist.org

El repositorio oficial de composer.


Crear tu propia librería

Y subirla a packagist.org


composer.json para librerías

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"
    }
}

Ingredientes extra


Publicar en packagist.org

3 Simples pasos:

  1. Sube tu código a github
  2. Revisa las normas y requisitos
  3. Envía tu repositorio

Composer CLI


composer <comando>
comandodescripción
installinstala a partir de un composer.lock o genera uno
updateactualiza a las últimas versiones y actualiza el composer.lock
initasistente para generar un composer.json
dumpregenera ficheros de autocarga
requireañade un paquete como dependencia a tu composer.json
validateverifica si tu composer.json es válido

Composer Cheatsheet


Thank you!

  • 20-06-2017 PHPVigo