Menu

Composer w PHP: instalacja pakietów i autoload klas

Composer to menedżer pakietów PHP: composer require vendor/package pobiera bibliotekę do vendor/, zapisuje ją w composer.json, a require 'vendor/autoload.php' ją wczytuje. Naucz się instalować Composera, poznaj composer.json, ograniczenia wersji, install vs update i autoloading PSR-4 dla własnych klas.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Composer to menedżer pakietów dla PHP. Uruchom composer require vendor/package w folderze projektu: Composer pobiera bibliotekę do vendor/, zapisuje ją w composer.json, a ty wczytujesz ją, razem ze wszystkim, co zainstalowałeś, jedną linią, require __DIR__ . '/vendor/autoload.php';.

composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);

Żadnego include dla każdego pliku: autoloader wczytuje Logger, StreamHandler i wszystko, czego używają, przy pierwszym zapotrzebowaniu na każdą klasę. Pakiety pochodzą z Packagist, publicznego rejestru, który Composer domyślnie przeszukuje.

Instalacja Composera

Composer najpierw wymaga PHP na twojej maszynie (zobacz instalacja PHP).

Windows: pobierz i uruchom Composer-Setup.exe z getcomposer.org. Znajduje twój php.exe i dodaje composer do PATH. Potem otwórz nowy terminal.

macOS z Homebrew:

brew install composer

Linux: pakiet twojej dystrybucji (sudo apt install composer w Debianie i Ubuntu) działa, ale często jest to starsze wydanie. Oficjalny instalator daje bieżące:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

Strona pobierania na getcomposer.org pokazuje też linię, która sprawdza hash instalatora przed jego uruchomieniem; skopiuj polecenia stamtąd, żeby mieć aktualny hash. Potem sprawdź, czy działa:

composer --version

composer.json i composer.lock

composer init zadaje kilka pytań i zapisuje composer.json, albo tworzy go composer require przy pierwszym pakiecie. Typowy plik:

{
    "name": "acme/shop",
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.0",
        "vlucas/phpdotenv": "^5.6"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
  • require wymienia to, czego projekt potrzebuje do działania, łącznie z wersją PHP.
  • require-dev wymienia narzędzia tylko do pracy deweloperskiej (testy, analiza statyczna). composer require --dev phpunit/phpunit dodaje do tej sekcji, a composer install --no-dev pomija ją na serwerach produkcyjnych.
  • autoload mówi Composerowi, gdzie leżą twoje własne klasy (niżej).

Obok Composer zapisuje composer.lock z dokładną wersją każdego zainstalowanego pakietu, łącznie z pakietami, od których zależą twoje pakiety. Commituj oba pliki. Nie commituj vendor/: dodaj go do .gitignore, bo composer install odbudowuje go z pliku lock.

composer install vs composer update

composer install          # install exactly what composer.lock says
composer update           # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog   # update one package only
composer remove monolog/monolog   # uninstall and remove from composer.json
composer outdated         # list packages with newer versions available

Uruchamiaj composer install po sklonowaniu projektu i przy każdym wdrożeniu: wszyscy dostają te same, przetestowane wersje. composer update uruchamiaj tylko wtedy, gdy zamierzasz aktualizować, a potem przetestuj i zacommituj nowy composer.lock. Uruchomienie update na serwerze produkcyjnym instaluje wersje, których nikt nie przetestował.

Ograniczenia wersji: ^ i ~

OgraniczeniePozwala naUżywaj do
^3.2od 3.2.0 do 4.0.0 wyłącznieZwykły wybór: funkcje i poprawki, bez psującej wersji głównej
^0.4od 0.4.0 do 0.5.0 wyłączniePakietów przed 1.0, gdzie wersje pomniejsze mogą psuć
~3.2od 3.2.0 do 4.0.0 wyłącznieTo samo co ^3.2
~3.2.1od 3.2.1 do 3.3.0 wyłącznieTylko poprawki
3.2.1Dokładnie 3.2.1Rzadko; blokuje poprawki bezpieczeństwa
>=3.2 <3.5Własny zakresObejścia zepsutego wydania

composer require vendor/package bez wersji wybiera najnowsze stabilne wydanie i zapisuje dla niego ograniczenie ^, co zwykle jest tym, czego chcesz.

Autoload własnych klas przez PSR-4

PSR-4 to konwencja przypisująca przestrzeń nazw do folderu: z "App\\": "src/" klasa App\Text\Slug leży w src/Text/Slug.php. Po dodaniu sekcji autoload uruchom:

composer dump-autoload

Autoloader Composera to funkcja zarejestrowana przez spl_autoload_register(), którą PHP wywołuje zawsze, gdy kod używa klasy, która nie jest jeszcze wczytana. Ten blok zapisuje dwa pliki klas i rejestruje własny mały autoloader PSR-4, żebyś mógł zobaczyć działanie mapowania. Dodaj trzeci plik klasy i go użyj.

Autoloader uruchamia się raz na klasę: drugie wywołanie Slug::from() nie wypisuje linii autoload:, bo klasa jest już wczytana. W prawdziwym projekcie nigdy nie piszesz tej funkcji sam; vendor/autoload.php rejestruje wersję Composera, która obsługuje też pakiety w vendor/. Przestrzenie nazw opisuje strona o przestrzeniach nazw.

Częste błędy

  • Class "Monolog\Logger" not found. Skrypt nie wykonał require 'vendor/autoload.php' albo ścieżka jest błędna. Używaj __DIR__ . '/vendor/autoload.php', żeby ścieżka nie zależała od bieżącego katalogu.
  • Twoja własna klasa nie jest znajdowana po dodaniu do autoload. Uruchom composer dump-autoload i sprawdź, czy ścieżka pliku dokładnie odpowiada przestrzeni nazw, łącznie z wielkością liter: App\Text\Slug musi być w src/Text/Slug.php, a serwery z Linuksem traktują src/text/slug.php jako inny plik.
  • Your requirements could not be resolved to an installable set of packages. Dwa pakiety potrzebują niezgodnych wersji czegoś, często samego PHP. Komunikat wymienia konflikt; composer why-not vendor/package 2.0 wyjaśnia, co blokuje daną wersję.
  • composer nie jest rozpoznawany. Terminal został otwarty przed instalacją albo folder nie jest w PATH. Otwórz nowy terminal albo wywołaj bezpośrednio php composer.phar.

Najczęściej zadawane pytania

Czym różni się composer install od composer update?

composer install instaluje dokładnie wersje zapisane w composer.lock, więc każda maszyna dostaje ten sam kod; uruchamiaj go po sklonowaniu i przy wdrożeniu. composer update wyznacza najnowsze wersje dozwolone przez composer.json, instaluje je i nadpisuje composer.lock; uruchamiaj go, gdy chcesz aktualizować.

Czy commitować composer.lock i folder vendor?

Commituj composer.lock w aplikacjach, żeby wszyscy instalowali te same wersje. Nie commituj vendor/: dodaj go do .gitignore i pozwól composer install go odtworzyć.

Co oznacza ^ w composer.json?

^2.3 pozwala na dowolną wersję od 2.3.0 do 3.0.0 wyłącznie: nowe funkcje i poprawki, ale bez nowej wersji głównej, która mogłaby zepsuć twój kod. ~2.3 oznacza to samo, a ~2.3.1 pozwala tylko na 2.3.x od 2.3.1.

Jak automatycznie wczytywać własne klasy przez Composera?

Dodaj "autoload": {"psr-4": {"App\\": "src/"}} do composer.json, uruchom composer dump-autoload i wykonaj require 'vendor/autoload.php'. Klasa App\Mail\Mailer zostanie wtedy wczytana z src/Mail/Mailer.php przy pierwszym użyciu.

Jak sprawdzić, która wersja Composera jest zainstalowana?

Uruchom composer --version. Aby zaktualizować samego Composera, uruchom composer self-update albo zaktualizuj go przez menedżer pakietów, którym go zainstalowałeś, na przykład brew upgrade composer.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ