2016-08-05 4 views
1

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

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

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

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

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

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

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

<?php 

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

// --etc-- 

Первоначально я думал использовать механизм автоматической загрузки «файлы» в «пакетах/пакетОтель/composer.json» с:

{ 
    ... 

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

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

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

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

+0

Есть ли причина, по которой вы не можете добавить пространство имен в свой файл 'constants.php' и использовать обычную автозагрузку? – Chris

+0

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

ответ

1

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

, потому что в PHP 5.6 < я не могу сцепить констант класса с другими константами, как __DIR__

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

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

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

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.. 

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

+0

. Я закончил этот маршрут и, как вы сказали, я оставил комментарий' @ ​​todo', когда мы обновляемся до * real * версия php – jeremy

+0

Рад, что я мог помочь :) –