2016-08-05 196 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-- 

我原本以爲用「文件」自動裝載機制「包/程序包A/composer.json」有:

{ 
    ... 

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

但是,當PackageA作爲依賴關係包含在appA中時,這不需要constants.php。爲了解決這個問題,而不是把"files": [...]在「包/程序包A/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自動加載以包含配置文件或帶有常量的文件。請考慮所有其他圖書館對性能的影響。無論是否使用PackageA,無論是否使用PackageA,都會在每次調用腳本時加載files部分中的文件。還要考慮可能的常量名稱衝突,這是由於非名稱空間常量的使用。 files自動加載只是!意味着用於那些無法以其他方式工作的遺留代碼。你應該避免使用它。

因爲在PHP 5.6 <我不能與其他常量串連類常量像__DIR__

的主要問題不是串聯,而是常量文件是不是一類。自動加載在這裏不起作用,因爲Composer的Autolader只加載類。

因此,一種解決方案可能是爲常量引入一個空類,但在頂部添加副作用。 然後將它命名空間在您的供應商\ 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'評論,當我們升級到*真實*版本的PHP – jeremy

+0

很高興我能幫忙:) –

相關問題