2016-08-05 2 views
1

패키지가 응용 프로그램에 포함될 때 이름 공간이없는 PHP 파일을 자동으로로드해야하는 패키지가 있습니다.Composer에 종속물로 포함될 때 자동으로 파일에 패키지 포함

다음은 내가 appA/에 대한 PackageA 종속성을 만드는 경로 저장소를 사용하도록 지시 here을 따랐습니다

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

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

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

내 일반 디렉토리 구조입니다. 이 부분은 원활하게 작동합니다.

PackageA 내의 일부 파일은 주로 파일 경로에 액세스해야합니다. 이것은 "constants.php를위한"무엇이며,이 값은 절차 적 정의 :

내가 처음으로 "패키지/PackageA/composer.json"에서 '파일'자동 로딩 메커니즘을 사용하는 것으로 생각
<?php 

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

// --etc-- 

:

{ 
    ... 

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

그러나 PackageAappA에 포함되어있는 경우 constants.php가 필요하지 않습니다.

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

이 매우되지 않습니다 : 대신 "패키지/PackageA/composer.json"에 "files": [...]을 넣는,이 문제를 해결하려면, 나는 "응용 프로그램/appsA이/composer.json"의 자동로드 섹션에 다음을 넣어 바람직하기 때문에 마다 응용 프로그램을 사용하면 PackageA이 필요합니다. 필자는 작곡가의 성격에 따라 PackageA 내의 파일이 구성 상수의 경우와 같이 특정 절차 코드에 액세스 할 수 있는지 (즉, 포함 할 의도가 있는지) 확인할 수 있다고 생각합니다. 이것을 할 수있는 방법이 있습니까?

+0

'constants.php' 파일에 네임 스페이스를 추가 할 수없고 정기적 인 자동 로딩을 사용할 수없는 이유가 있습니까? – Chris

+0

@Chris 왜냐하면 PHP <5.6에서 클래스 상수를'__DIR__'과 같은 다른 상수와 연결할 수 없기 때문입니다. – jeremy

답변

1

구성 파일이나 상수가있는 파일을 포함하기 위해 합성기의 files 자동 로딩을 사용하지 마십시오. 다른 모든 라이브러리에 대한 성능 영향에 대해 생각해보십시오. files 섹션에있는 파일은 PackageA를 사용하는지 여부에 관계없이 스크립트를 호출 할 때마다로드됩니다. 또한 이름 공간이없는 상수 사용으로 인해 상수 이름의 가능한 충돌에 대해 생각해보십시오. files 자동 로딩은! 그렇지 않으면 작동 할 수없는 레거시 코드에 사용하기위한 것입니다. 당신은 그것을 사용하지 말아야한다. PHP < 5.6에서 내가 __DIR__

같은 다른 상수 클래스 상수를 연결할 수 없습니다

때문에 큰 문제는 연결이 아니라 상수 파일은 클래스 아니라고. Composer의 자동 채우기 기는 클래스를로드하기 때문에 여기서는 자동 로딩이 작동하지 않습니다.

그래서 한 가지 해결책은 상수에 빈 클래스를 도입하는 것이지만 맨 위에 부작용을 추가하는 것일 수 있습니다. 그런 다음 vendor \ PackageA 우산 아래에서 네임 스페이스를 지정하십시오. 이렇게하면 자동 로딩을 트리거하기 위해 다른 클래스에 use vendor\PackageA\Constants;을 추가 할 수 있습니다.

빈 클래스를 포함하지만 파일을 자동로드하면 정의가 부작용으로 발생합니다. 좋은 IDE는 부작용을 유발하기 때문에이 파일에 오류 플래그를 배치합니다.다른 개발자들은 클래스를 포함 할 때 정의가 어디서 왔는지 알지 못하기 때문에 여전히 추한 것입니다. 그러나 autoloadingfiles 섹션을 사용하는 것보다 낫습니다.

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

가장 좋은 사례는 패키지의 구성에 대한 구성 객체 또는 배열을 받아들이는 생성자를 구성 클래스를 사용하는 아마

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

composer.json

. 이 패키지와 응용 프로그램을 하드 코드 된 전역 구성에서 분리합니다. 기본적으로 구성 주입 (패키지 환경의 App 환경, 패키지는 해당 환경을 기반으로 구성됩니다).

+0

나는이 경로를 끝내었고, 제안했던 것처럼'@todo' 코멘트를 떠났습니다. PHP의 * 실제 * 버전 – jeremy

+0

다행 내가 도울 수 :) –