В 38 уроке мы погрузимся в мир PHP Composer. Это инструмент, который
изменит ваш подход к разработке на PHP. Composer не просто «менеджер
пакетов», это ваш надежный помощник, который автоматизирует рутину,
управляет зависимостями и позволяет легко интегрировать сторонние
библиотеки. Если вы до сих пор копировали файлы вручную или писали
бесконечные include, этот урок станет для вас откровением.
Composer это система управления зависимостями для PHP. Представьте, что вы хотите использовать готовую библиотеку для работы с API ВКонтакте или для отправки email. Раньше вам пришлось бы вручную скачивать её код, проверять совместимость версий, подключать файлы… Composer делает это за вас:
Пример из жизни:
Допустим, вы пишете проект, где нужна библиотека для работы с Excel. Без
Composer вы ищете её в интернете, скачиваете, копируете в папку libs, подключаете через require_once. Если позже потребуется обновить библиотеку, придется делать всё заново. С Composer вы просто запускаете команду composer require phpoffice/phpspreadsheet и всё готово.
Composer-Setup.exe.<span class="token function">composer</span> <span class="token parameter variable">--version</span>Вы должны увидеть что-то вроде
Composer version 2.6.6.php <span class="token parameter variable">-r</span> <span class="token string">"copy('https://getcomposer.org/installer', 'composer-setup.php');"</span>
php composer-setup.php
php <span class="token parameter variable">-r</span> <span class="token string">"unlink('composer-setup.php');"</span>
<span class="token function">sudo</span> <span class="token function">mv</span> composer.phar /usr/local/bin/composer
<span class="token function">composer</span> <span class="token parameter variable">--version</span>
Давайте создадим проект с нуля.
my_project и перейдите в неё:
bash<span class="token function">mkdir</span> my_project <span class="token operator">&&</span> <span class="token builtin class-name">cd</span> my_project
<span class="token function">composer</span> initComposer задаст несколько вопросов (название проекта, описание, зависимости). Пока можно нажимать Enter, оставляя значения по умолчанию.
composer.jsonэто конфигурация вашего проекта. Пример содержимого:
json<span class="token punctuation">{</span>
<span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"maxim/my_project"</span><span class="token punctuation">,</span>
<span class="token property">"require"</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
Допустим, мы хотим отправлять HTTP-запросы. Вместо написания своего кода используем библиотеку Guzzle.
<span class="token function">composer</span> require guzzlehttp/guzzleComposer скачает Guzzle и все его зависимости. Обратите внимание на изменения в
composer.json:
json<span class="token punctuation">{</span>
<span class="token property">"require"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"guzzlehttp/guzzle"</span><span class="token operator">:</span> <span class="token string">"^7.0"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
index.php и используйте Guzzle:
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token string single-quoted-string">'vendor/autoload.php'</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">GuzzleHttp<span class="token punctuation"></span>Client</span><span class="token punctuation">;</span> <span class="token variable">$client</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Client</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'https://api.github.com/users/max-gabov'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$response</span><span class="token operator">-></span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>Запустите скрипт и вы получите данные моего GitHub-аккаунта!
Установим Carbon, удобную библиотеку для работы с датами:
bash
<span class="token function">composer</span> require nesbot/carbon
Использование:
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token string single-quoted-string">'vendor/autoload.php'</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Carbon<span class="token punctuation"></span>Carbon</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token class-name static-context">Carbon</span><span class="token operator">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">addDays</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Вывод даты через 5 дней</span></span>
Composer умеет автоматически подключать ваши классы через PSR-4.
src и добавьте в неё класс User.php:
<span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">MyProject</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">echo</span> <span class="token string double-quoted-string">"Пользователь создан!"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></span>
composer.json, добавив автозагрузку:
<span class="token punctuation">{</span>
<span class="token property">"autoload"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"psr-4"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"MyProject"</span><span class="token operator">:</span> <span class="token string">"src/"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">composer</span> dump-autoload
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">require</span> <span class="token string single-quoted-string">'vendor/autoload.php'</span><span class="token punctuation">;</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">MyProject<span class="token punctuation"></span>User</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Выведет "Пользователь создан!"</span></span>
Установите пакет symfony/json-encoder и напишите скрипт, который кодирует массив ['name' => 'Максим', 'course' => 'PHP'] в JSON.
Решение:
bash
<span class="token function">composer</span> require symfony/serializer
php
<span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token keyword">require</span> <span class="token string single-quoted-string">'vendor/autoload.php'</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Serializer<span class="token punctuation"></span>Encoder<span class="token punctuation"></span>JsonEncoder</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Serializer<span class="token punctuation"></span>Serializer</span><span class="token punctuation">;</span>
<span class="token variable">$serializer</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Serializer</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">JsonEncoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$data</span> <span class="token operator">=</span> <span class="token variable">$serializer</span><span class="token operator">-></span><span class="token function">encode</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'Максим'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'course'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'PHP'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'json'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$data</span><span class="token punctuation">;</span> <span class="token comment">// {"name":"Максим","course":"PHP"}</span></span>
Calculator в папке src/Math.composer.json.Решение:
php
<span class="token comment">// src/Math/Calculator.php</span>
<span class="token keyword">namespace</span> <span class="token package">MyProject<span class="token punctuation"></span>Math</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Calculator</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">add</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token variable">$b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
json
<span class="token comment">// composer.json</span>
<span class="token property">"autoload"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"psr-4"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"MyProject"</span><span class="token operator">:</span> <span class="token string">"src/"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
bash
<span class="token function">composer</span> dump-autoload
php
<span class="token comment">// index.php</span> <span class="token variable">$calc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">MyProject<span class="token punctuation"></span>Math<span class="token punctuation"></span>Calculator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$calc</span><span class="token operator">-></span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 15</span>
vendor/autoload.php.require 'vendor/autoload.php'; в начало файла.src/Logger/FileLogger.php, его namespace должен быть MyProjectLogger.composer.lock.vendor/, но обязательно добавляйте composer.lock в Git. Это гарантирует, что все разработчики используют одинаковые версии пакетов.Composer это инструмент для любого PHP-разработчика. Он экономит часы времени, избавляет от «dependency hell» и открывает доступ к тысячам готовых решений. Потратьте время на эксперименты с Packagist, подключайте библиотеки и не бойтесь писать свои пакеты.
Продолжайте обучение — полный курс по PHP для начинающих