Подключение классов php в проект через composer psr-4
Во время разработки, иногда необходимо подключить свои классы в проект, в автозагрузчик, помимо устанавливаемых через composer, в директорию vendor. Произвести такую операцию достаточно просто, я делюсь методом добавления любого количества классов, но после создания нового файла с классом будет необходимо выполнить команду composer dump-autoload -o. На официальном сайте composer.org, на странице документации, есть такое решение, посмотреть.
У нас может быть два варианта:
- Вариант 1 — уже есть подключаемые через composer пакеты, из папки vendor;
- Вариант 2 — нет подключаемых пакетов через composer и отсутствует файл composer.json.
Рассмотрим алгоритмы действий по этим двум вариантам.
Действия по первому варианту:
Как правило, у многих именно первый вариант, так как в проект уже подключаются пакеты и со временем может возникнуть необходимость подключить свои классы, поэтому необходимо отредактировать существующий файл composer.json, добавив в него конструкцию из примера ниже, в данном случае у меня уже подключен guzzle. Файлы собственных классов у меня лежат в директории src
{ "require": { "guzzlehttp/guzzle": "^6.0" }, "autoload": { "psr-4": { "": "src/" } } }
И выполнить команду в терминале:
composer dump-autoload -o
В ответ придет подобное сообщение:
Generating optimized autoload files Generated optimized autoload files containing 899 classes
В Вашем случае ответ может быть немного другой, с другим количеством классов.
Рассматривая первый вариант, я предполагаю, что в Вашем файле, куда необходимо подключать файлы классов, уже присутствует такая конструкция:
set_include_path(__DIR__); require 'vendor/autoload.php';
Если нет, то добавьте. В моем случае директория vendor находится в корне проекта, в Вашем путь может быть немного другим, также в моем случае, во избежание различных ситуаций, устанавливаю текущую директорию в значение include_path, при помощи функции set_include_path. Это не обязательная строка.
После этих действий можно создавать классы в папке src, вызывать команду composer dump-autoload -o и создавать объекты в других файлах, все будет работать.
Действия по второму варианту:
Создание директории src. Сохранение туда файлов с Вашими php классами.
Убедиться, что у Вас установлен composer, можно проверить командой в терминале:
composer -v
Если он установлен, то придет подобное сообщение:
______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.0.14 2021-05-21 17:03:37 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --profile Display timing and memory usage information --no-plugins Whether to disable plugins. -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. --no-cache Prevent use of the cache -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug ..... ..... .....
Следующим шагом будет создание файла composer.json, с таким содержимым:
{ "autoload": { "psr-4": { "": "src/" } } }
И выполнить команду в терминале:
composer dump-autoload -o
Теперь можно использовать классы из директории src, в своих проектах, но после каждого нового файла класса необходимо повторить команду composer dump-autoload -o И убедиться, что у Вас в файле, куда будут автоматически подключаться классы есть require ‘vendor/autoload.php’;
Подключение из разных директорий.
По разным причинам может случиться так, что подключать классы нужно будет из разных директорий, тогда необходимо модифицировать файл composer.json:
{ "autoload": { "classmap": ["src/", "lib/", "Testcass.php"] } }
И опять выполнить команду в терминале:
composer dump-autoload -o
Теперь автозагрузка будет работать из разных директорий и просто еще для отдельного файла Testcass.php.
Подстановочные знаки ( *) также поддерживаются в путях карты классов и расширяются, чтобы соответствовать любому имени каталога:
{ "autoload": { "classmap": ["src/classes/*/lib/", "testdir/*", "Testclass.php"] } }
Код из примеров был протестирован на php версии 8, composer версии 2.0.14.