Wat is Composer

Bij het ontwikkelen van een project komt de nodige programmeercode kijken. Hierbij kan je als programmeur ervoor kiezen om elke regel zelf te schrijven. Dit kost ontzettend veel tijd (en dus ook geld). Helaas ben je er dan nog niet.

Zoals vrijwel alles in de computerwereld staat PHP (de door ons meest gebruikte programmeertaal) niet stil. Vele functies worden geüpdatet of zelfs als ‘oud’ aangemerkt. Het is dus nodig om je code up to date te houden. Daarnaast moet de code regelmatig getest (bijvoorbeeld unit test) en/of uitgebreid worden. Oftewel: veel tijd en kosten.

Daarom kiezen we bij Toscani voor het gebruiken van reeds bestaande code waar mogelijk. Waarom het wiel opnieuw uitvinden? Waarom zelf al het onderhoud (met het risico op instabiliteit) uitvoeren waardoor de klant met veel hogere kosten opgezadeld wordt?

Een ‘oude’ manier is om alle libraries (dependencies/packages/classes) handmatig te downloaden en in te voegen (includen) in je code. Dit is voor kleine projectjes een prima oplossing. Maar wat als er een update is? Wat als de gedownloade library voor zichzelf nog meer libraries nodig heeft van andere partijen? Alles handmatig downloaden is een optie, maar vaak niet gewenst. Zeker in grote projecten (zoals DataDashboard) kunnen er tientallen libraries aanwezig zijn. Daarom gebruiken we bij Toscani…

Composer

Composer is een ‘dependency manager’ voor PHP. Kort gezegd: Composer beheert je libraries, is te krijgen voor Windows & Linux, en kun je vinden op getcomposer.org. Nadat Composer geïnstalleerd is, kan je via de terminal het commando ‘composer’ gebruiken om te controleren of alles goed is gegaan.

Laten we een bestand maken waarin we aangeven welke libraries we willen hebben: ‘composer.json’ met de volgende inhoud:

{
	"require": {
		"phpmailer/phpmailer": "5.2.*"
	}
}

Zoals wellicht al duidelijk is, willen we de PHPMailer library hebben. Door nu in de terminal naar de locatie van dit bestand te gaan en het commando ‘composer install’ te typen, wordt PHPMailer gedownload. Er is een ‘vendor’ map aangemaakt. Hierin is ook een autoload.php te vinden. Deze kan je invoegen in je code om gebruik te maken van de PHPMailer class.

include 'vendor/autoload.php';
$phpmailer = new PHPMailer;

Mocht PHPMailer zelf ook extra libraries nodig hebben, worden deze automatisch door Composer geïnstalleerd en bijgehouden. Indien er een update uitgebracht wordt voor PHPMailer kan je deze heel eenvoudig updaten door in de terminal het commando ‘composer update’ uit te voeren. Je library (of libraries) worden geüpdatet.

Ook meerdere libraries laten beheren door Composer is eenvoudig:

{
	"require": {
		"phpmailer/phpmailer": "5.2.*",
		"campaignmonitor/createsend-php": "4.*",
		"facebook/php-sdk-v4": "4.*"
	}
}

Door bovenstaande code in je composer.json te plaatsen en te kiezen voor ‘composer update’, zullen alle libraries geïnstalleerd worden. Hierbij zal je meteen zien dat Facebook PHP SDK ook de Guzzle library nodig heeft om calls te maken naar hun API.

Op Packagist kun je door beschikbare Composer libraries browsen. In veel repositories op Github en Bitbucket zie je een ‘composer.json’ bestand staan. Hieraan kan je ook zien of deze library te gebruiken is met Composer.

Nog een voordeel van Composer: Je hoeft niet al je libraries naar je repository te pushen, ook alles handmatig uploaden naar FTP is niet nodig. Gaat je collega met jouw project verder? Pull het project uit de repository (waarin het composer.json bestand ook aanwezig is), gebruik het ‘composer update’ commando en alle libraries worden gedownload. Dit is dus ook mogelijk op een server met een push-to-deploy methode en vervolgens een SSH post command.

Private repositories

Wat misschien opvalt is dat alle repositories uit de vorige voorbeelden openbaar zijn. Wij als Toscani maken zelf ook libraries die we gebruiken in onze projecten. Deze code mag niet altijd openbaar zijn en staan in een private repository bij Bitbucket. Door in je composer.json bestand aan te geven welke repositories uitgelezen mogen worden kan je libraries die in private repositories staan ook downloaden.

{
	"require": {
		"phpmailer/phpmailer": "5.2.*",
		"campaignmonitor/createsend-php": "4.*",
		"facebook/php-sdk-v4": "4.*",
		"toscani/talk": "dev-master"
	},
	"repositories": [
		{
			"type": "vcs",
			"url": "https://USERNAME@bitbucket.org/ORGANIZATION/REPOSITORY.git"
		}
	]
}

Je kan ervoor kiezen om een SSH key toe te voegen aan je Bitbucket repository of je credentials handmatig in te typen na ‘composer update’. Op deze manier is het heel eenvoudig om een library op een centraal punt te hebben en te updaten in al je projecten.

Conclusie

Door Composer te gebruiken als dependency manager is het erg eenvoudig om gebruik te maken van externe libraries. Updaten is niet langer ‘lastig’ en tijdrovend maar is binnen enkele seconden gedaan. Zorg ervoor dat je regelmatig controleert op updates. Ook het niet opnemen van de libraries in je repository kan tijd schelen. De ‘vendor’ map van DataDashboard is ruim 100 MB…