Автоматическое включение файла в пакет при включении в Composer в качестве зависимости

У меня есть пакет, который должен автоматически загружать PHP-файл без пространства имен, когда пакет включен в приложение.

Ниже моя общая структура каталогов

packages/
+-- PackageA/
+-- Entities/
+-- Mappers/
+-- Services/
+-- composer.json
+-- constants.php

apps/appA/
+-- vendors/
+-- autoload/
+-- composer.json

apps/appB/
+-- vendors/
+-- composer.json

Я следовал инструкциям Вот использовать хранилище пути в создании PackageA зависимость для appA/, Эта часть работает плавно.

Некоторые файлы в PackageA требуется доступ к константам, в основном, к filepath. Это то, для чего «constants.php», и эти значения определяются процедурно:

<?php

define('XML_REPO_PATH', __DIR__ . '/../blah/xml/');

// --etc--

Первоначально я думал использовать механизм автозагрузки ‘files’ в «packages / PackageA / composer.json» с:

{
...

"autoload": {
"psr-4": { ... }
"files": ["constants.php"]
}
}

Тем не менее, это не требует constants.php, когда PackageA включен в качестве зависимости в appA, Чтобы исправить это, вместо того, чтобы положить "files": [...] в «packages / PackageA / composer.json» я поместил следующее в раздел автозагрузки «app / appsA / composer.json»:

"files": ["vendors/packages/PackageA/constants.php"]

Это не очень желательно, потому что каждый использование приложения PackageA понадобится это. Я бы подумал, что природа композитора позволит мне убедиться, что файлы внутри PackageA иметь доступ (то есть включать) определенный процедурный код, как в случае констант конфигурации. Есть ли способ сделать это?

1

Решение

Не используйте Composer’s files автозагрузка для включения файлов конфигурации или файлов с константами. Пожалуйста, подумайте о влиянии на производительность для всех других библиотек. Файл в files раздел загружается при каждом вызове вашего скрипта, независимо от того, используете вы PackageA или нет. Также подумайте о возможных конфликтах имен констант из-за использования констант без пространства имен. files только автозагрузка! предназначен для использования в унаследованном коде, который иначе нельзя заставить работать. Вы должны избегать его использования.

потому что в php < 5.6 я не могу объединить константы класса с другими константами, такими как __DIR__

Основная проблема не в конкатенации, а в том, что файл констант не является классом. Автозагрузка здесь не будет работать, потому что Autolader Composer загружает только классы.

Таким образом, одним из решений может быть введение пустого класса для констант, но добавление побочных эффектов сверху.
Затем создайте пространство имен под зонтиком вашего поставщика \ PackageA.
Это позволяет вам добавить use vendor\PackageA\Constants; в других классах,
для запуска автозагрузки, верно?

Вы включаете пустой класс, но когда файл загружается автоматически, определения происходят как побочные эффекты. Хорошая IDE поместит флаг ошибки в этот файл, потому что это вызывает побочные эффекты. Это все еще уродливо, потому что другие разработчики не знают, откуда берутся определения, когда они просто включают класс — но лучше, чем использование autoloading files раздел.

composer.json

 "autoload": {
"psr-4": { "\Vendor\PackageA\\" : "./src/packages/PackageA/" }
}

constants.php

<?php

namespace Vendor\PackageA;

class Constants
{
// @todo PHP 5.6 namespaced class constants
}

// global side effect: constant definition
define('XML_REPO_PATH', __DIR__ . '/../blah/xml/');

// etc..

Рекомендуется использовать класс Configuration с конструктором, который принимает объект конфигурации или массив для конфигурации вашего пакета.
Это отделение пакета и приложения от жестко закодированных глобальных конфигураций.
По сути, внедрение конфигурации (среда приложения в пакет, пакет настраивается на основе этого контекста).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]