PHP IDE가 종속성 주입 컨테이너를 이해하도록 하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/6395737

문제

현재 상황:내 프로젝트에 종속성 주입을 사용하여 해결하는 종속성이 있습니다.종속성 관리를 용이하게 하고 클래스를 지연 로드하기 위해 DIC(종속성 주입 컨테이너)를 사용하여 다음 논리 단계를 수행하고 싶습니다.

나는 보았다 버킷, 여드름, 그리고 sfServiceContainer, 몇 가지 테스트를 실행하고 DIC의 작동 방식에 대해 진심으로 감사드립니다.나는 단순함과 순수한 힘 때문에 아마도 Pimple을 선택하게 될 것입니다.이 문제가 발생하지 않은 경우:

DIC가 제공하는 추상화로 인해 제가 사용하고 있는 IDE(PHPStorm)는 더 이상 내 코드에서 무슨 일이 일어나고 있는지 이해하지 못합니다.$container['mailer'] 또는 $sc->mailer가 클래스 객체를 보유하고 있다는 것을 이해하지 못합니다.Netbeans IDE도 사용해 보았습니다.같은 문제.

내 IDE가 쓸모없어지기 때문에 이것은 나에게 정말 문제가 됩니다.나는 클래스를 다룰 때 코드 힌트, 자동 완성, 리팩토링 도구 없이 프로그래밍하고 싶지 않습니다.그리고 내 IDE가 코드 유효성을 검사할 때 모든 종류의 오탐지를 찾는 것을 원하지 않습니다.

그래서 내 질문은 다음과 같습니다이 문제를 해결하고 해결책을 찾은 사람이 있습니까?

도움이 되었습니까?

해결책

다른 팁

컨테이너에서 꺼낸 개체의 유형을 IDE에 확실히 알릴 수는 있지만 접근할 때마다, 한 번 해보는 게 낫습니다.다음 두 솔루션 모두 컨테이너의 서브클래싱을 포함합니다.어쨌든 이것을 권장하는 Pimple을 사용하기 시작했습니다.

다음으로 액세스되는 인스턴스 멤버를 사용하는 컨테이너의 경우 -> 아니면 마법에 의해 노출되거나 __get 방법을 사용하면 IDE에 해당 유형이 어떤 유형인지 알릴 수 있습니다.이는 코드가 실행될 때 추가 구문 분석이 필요하지 않기 때문에 훌륭합니다. IDE만이 이를 방해합니다.

/**
 * My container. It contains things. Duh.
 *
 * @property MyService $service
 * @property MyDao $dao
 */
class MyContainer extends Container { }

배열 역할을 하는 Pimple 및 기타 컨테이너의 경우 필요한 최상위 개체에 대한 접근자 함수를 만들 수 있습니다.컨테이너가 생성될 때 더 많은 구문 분석을 의미하지만 한 번만 수행하고 APC에 보관해야 합니다.어쨌든 나는 잊어버리기 쉬운 배열 키를 자동 완성된 메서드 안에 배치하기 때문에 배열 액세스보다 메서드를 훨씬 선호합니다.

class MyContainer extends Pimple
{
    /**
     * @return MyService
     */
    public function getMyService() {
        return $this['service'];
    }
}

BTW, 유형 힌트 인라인 변수의 경우 @var NetBeans에서는 사용해야 합니다. /* ~와 함께 별표 하나.이것은 ~ 아니다 문서 블록 주석이며 작동하지 않습니다 /** 또는 //.또한 이름은 유형 앞에 옵니다.

public function foo() {
    /* @var $service MyService */
    $service = $container['service'];
    ...
}

IDE가 코드를 제거하지 않으므로, 그들은 모르고 도움이 필요합니다. 나는 이클립스 및 기타 IDE에 대한이 작업을 알고 있습니다. 변수의 유형을 힌트합니다.

netbeans / phpstorm / pdt / zendstudio 예제

/* @var $mailer MailerInterface */
$mailer = $sc->mailer
.

코드 완료는 $mailer에서 다시 작동하기 시작합니다.

PDT의 경우 중요합니다.

  1. 코멘트는 하나의 *만으로 시작됩니다.
  2. 먼저 힌트보다 변수 이름입니다.

    대체 코멘트 변이

    많은 논의가 많은 경우, IDES간에 다를 수 있습니다. 그러나 대부분의 IDE는 위의 방식으로 인라인 코드 변수에 대한 변수 힌트를 지원합니다. 그래서 IDE에 따라 이것은 다르게 작성되지만이 비슷하게 작성 될 수 있지만 여기에 두 개의 별표가있는 것과 같이 다음과 같습니다.

    /** @var $mailer MailerInterface */
    
    .

    phpdoc 호환성

    PHPDOC 파서는 인라인 코드에 대한 CLASS VAR DOC-COMMEN을 흉내 낸 경우 :

    /** @var MailerInterface $mailer  */
    
    .

    문서가 일반적으로 클래스 변수에 사용됩니다 ( @var) 클래스 변수의 데이터 유형을 문서화하십시오. ). 그런 다음 PHPDOC는 QA에 대한 부담을 포함하는 주석 후에 클래스 변수의 정의를 누락 한 다음

    그러나 일부 IDE는 PHPDOC CLAS 가변 스타일로 작성할 때 간단한 변수에 대한 코드 완성을 제공합니다. 현재 클래스의 코드 완성에 대한 부작용이있는 경우 새 회원이 실제로 존재하지 않는 경우가 발생할 수 있습니다.

Google에서 온 사람들을 위해.

phpStorm은 실제로 PHPDOCS를 다시 작성하는 대신 이런 종류의 문제를 해결하는 방법을 제공합니다. 여기에 설명 된 자동 완성 및 유형 검사를 원활하게 작동시킵니다.

여드름은 컨테이너 빌더 프린시 백 페이프를 소개합니다.당신이 그것을 이해한다면, 더 이상 여드름이 필요하지 않습니다 :


class Container
{
    private $shared = array();

    public function getService() {
        return new Service(
            this->getFirstDependence(),
            this->getSecondDependence()
        );
    }

    protected function getFirstDependence() {
        return new FirstDependence(
            this->getSecondDependence()
        );
    }

    protected function getSecondDependence() {
        return isset($this->shared[__METHOD__]) ? $this->shared[__METHOD__] : $this->shared[__METHOD__] =
        new SecondDependence(
        );
    }
}
.

이 방법으로 여드름은 혼합 된 $ C [ '일부 키']에서 객체의 유형을 숨기지 않습니다.컨테이너를 편집 할 때 자동 완성 제안이있을 것입니다.phpstorm은 코드에서 메소드 메소드 리턴 유형을 자동으로 처리 할 수 있습니다.그리고 당신은 투명한 컨테이너를 가질 것입니다.컨테이너를 재정의 할 수 있습니다 :


class TestContainer extends Container
{
    protected function getFirstDependence() {
        return new FirstDependenceMock(
        );
    }
}
.

'프로그래밍'lanuage로 작성된 정직한 컨테이너가되어야합니다.컨테이너 책임은 객체의 초기화 된 그래프를 호출자에게 가져 오는 것입니다.'프로그래밍 언어'에 액세스 할 수 있으므로 그 책임을 쉽게 위반할 수 있습니다.종속성 구성을위한 일부 DSL이 더 좋습니다.또한 원래의 종속성 정보의 대부분 (인수 유형)은 여드름과 sfdepEnencyContainer가 부합하고 깨지기 쉬운 구성을 만드는 것에 의해 무시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top