Datoteka composer.lock
Datoteka „composer.lock“ služi za točnu specifikaciju instaliranih paketa nakon pokretanja naredbe „composer install“. Na primjer, u našem slučaju (pogledajte prvi članak o Composeru) za paket „fzaninotto/faker“ naznačili smo da želimo instalirati verziju veću ili jednako 1, a manju od 2. Prilikom instalacije Composer je dohvatio zadnju dostupnu verziju 1.6.0 te će ta verzija biti zapisana u „composer.lock“ datoteku kao verzija koja je instalirana.
Nakon svakog idućeg pokretanja naredbe „composer install“ Composer će prvo provjeriti da li postoji datoteka „composer.lock“. Ako postoji, Composer će iz nje pročitati točne verzije paketa te će njih instalirati, bez obzira na datoteku „composer.json“. Razlog tomu je osiguravanje konzistentnosti prilikom daljnjeg dijeljenja izvornog koda i razvijanja aplikacije. Instalacijom točnih verzija paketa iz datoteke „composer.lock“ svi programeri će raditi s istim verzijama paketa o kojima aplikacija ovisi, bez obzira na to koliko novih verzija tih paketa tijekom vremena bude izdano. Zbog toga i datoteke „composer.json“ i „composer.lock“ trebaju biti uključene u sustav za upravljanje verzijama izvornog koda (engl. version control) kao što je npr. Git.
Ako datoteka „composer.lock“ ne postoji, Composer će pročitati datoteku „composer.json“ i po njenoj specifikaciji instalirati pakete. Nakon toga napravit će datoteku „composer.lock“ u koju će zapisati instalirane verzije paketa.
Ažuriranje instaliranih paketa
Ako datoteka „composer.lock“ postoji, eventualne nove verzije instaliranih paketa neće biti preuzete automatski prilikom idućeg pokretanja naredbe „composer install“. Naredba „composer install“ će uvijek pokrenuti instalaciju onih verzija paketa koje su naznačene u datoteci „composer.lock“ a ne „composer.json“.
Ako želimo ažurirati instalirane pakete, možemo koristiti naredbu:
composer update
Ta naredba će ponovno pokrenuti instalaciju paketa koji su definirani u datoteci „composer.json“ te će ponovno generirati datoteku „composer.lock“ s novim verzijama instaliranih paketa.
Uključivanje paketa u aplikaciju
Direktorij „vendor“, koji se nakon instalacije paketa pojavi u početnom direktoriju projekta, služi za spremanje paketa. U našem slučaju sadržaj „vendor“ direktorija izgleda ovako:
Direktorij „vendor“ sadrži i datoteku „autoload.php“. Ta datoteka omogućuje jednostavno uključivanje svih instaliranih paketa u naš projekt. Sve što trebamo napraviti jest dodati sljedeću liniju u našu aplikaciju:
require __DIR__ . '/vendor/autoload.php';
U našem slučaju u početni direktorij „composer-demo“ dodat ćemo datoteku „index.php“. To će biti ulaz u našu aplikaciju. Na početku te datoteke dodat ćemo gore navedenu liniju kako bismo u nastavku aplikacije imali dostupne sve instalirane pakete.
Za probu idemo vidjeti kako funkcionira paket „fzaninotto/faker“, paket za generiranje slučajnih podataka. Iz uputa dostupnih na stranici https://packagist.org/packages/fzaninotto/faker možemo vidjeti kako se koristi. Za ovaj primjer jednostavno ćemo ispisati slučajno ime.
Za testiranje pokrenut ćemo ugrađeni PHP poslužitelj pomoću naredbe:
php -S localhost:8000
Nakon toga u pregledniku možemo otvoriti adresu http://localhost:8000/ i vidjet ćemo rezultat:
Uz Faker, možemo isprobati i Carbon, paket za rad s datumima. Iz uputa na stranici https://packagist.org/packages/nesbot/carbon možemo vidjeti kako se koristi. Za ovaj primjer jednostavno ćemo ispisati trenutačni datum i vrijeme.
Kao što je vidljivo iz primjera, u datoteci „index.php“ bilo je potrebno samo jednom uključiti datoteku „autoload.php“. Svi instalirani paketi se nakon toga mogu koristiti u aplikaciji.
Uključivanje vlastitih klasa u aplikaciju
Composer omogućuje uključivanje i vlastitih PHP klasa u aplikaciju koju razvijamo. Da bi to bilo moguće, prilikom definiranja klasa preporučljivo je koristiti PSR-4 konvenciju za definiranje PHP klasa i imenskih prostora (engl. namespaces).
Pogledajmo kako to učiniti na jednostavnom primjeru. U početnom direktoriju „composer-demo“ napravit ćemo dodatni direktorij „src“. U njega ćemo spremiti novu datoteku „Randomator.php“. Struktura početnog direktorija „composer-demo“ sada izgleda ovako:
Datoteka „Randomator.php“ sadržavat će jednostavnu statičku metodu koja vraća slučajan broj. Neka imenski prostor (engl. namespace) u toj datoteci bude „Srce“. Naziv klase neka bude „Randomator“. Neka se metoda koja vraća slučajan broj zove „getRandomNumber“. Čitava klasa izgleda ovako:
Sljedeći korak jest postaviti konfiguraciju u datoteci „composer.json“ kako bi Composer znao gdje može tražiti naše klase. Za to ćemo koristiti ključ „autoload“, a potrebno mu je definirati konvenciju prema kojoj će se odraditi uključivanje klasa. U našem slučaju to je PSR-4 konvencija, pa ćemo definirati ključ „psr-4“. U njemu je potrebno definirati objekt koji sadrži oznaku imenskog prostora koji koristimo te putanju gdje su klase smještene. U našem slučaju imenski prostor je Srce, a direktorij je „src“. Imenski prostor mora završavati s „\\“, a putanja s „/“. Datoteka „composer.json“ sada izgleda ovako:
U ovom trenutku promijenjena je konfiguracija u datoteci „composer.json“, ali Composer još ne zna za tu promjenu. Da bi Composer prepoznao koje sve pakete i klase treba učiniti dostupnima nakon promjene konfiguracije u datoteci „composer.json“ i (u ovom slučaju postavljanja „autoload“ konfiguracije), potrebno je pokrenuti naredbu:
composer dump-autoload
Ta naredba će ponovno generirati datoteku „vendor/autoload.php“. U aplikaciji je nakon toga moguće koristiti klasu Randomator, kao na primjer:
Rezultat koji se dobije u pregledniku sada izgleda ovako:
Uklanjanje instaliranih paketa
Za uklanjanje instaliranih paketa može se koristiti naredba
composer remove naziv-razvijatelja/naziv-paketa
Na primjer, da bismo uklonili paket „fzaninotto/faker“, potrebno je unijeti naredbu:
composer remove fzaninotto/faker
Instalacija globalnih paketa
Iako je Composer namijenjen instalaciji ovisnih paketa u pojedinom projektu, tj. aplikaciji, Composer ima mogućnost instalacije i globalnih paketa. To može biti korisno kada želimo omogućiti da neki paket bude dostupan bilo gdje u sustavu, a ne samo u pojedinoj aplikaciji.
Na primjer, recimo da želimo globalno instalirati phpunit, alat za testiranje PHP aplikacija. Za to bismo unijeli naredbu:
composer global require phpunit/phpunit
Nakon toga možemo pozivati phpunit u komandnoj liniji neovisno o tome u kojem direktoriju se nalazimo.