PHP IDE가 종속성 주입 컨테이너를 이해하도록 하려면 어떻게 해야 합니까?
-
29-10-2019 - |
문제
현재 상황:내 프로젝트에 종속성 주입을 사용하여 해결하는 종속성이 있습니다.종속성 관리를 용이하게 하고 클래스를 지연 로드하기 위해 DIC(종속성 주입 컨테이너)를 사용하여 다음 논리 단계를 수행하고 싶습니다.
나는 보았다 버킷, 여드름, 그리고 sfServiceContainer, 몇 가지 테스트를 실행하고 DIC의 작동 방식에 대해 진심으로 감사드립니다.나는 단순함과 순수한 힘 때문에 아마도 Pimple을 선택하게 될 것입니다.이 문제가 발생하지 않은 경우:
DIC가 제공하는 추상화로 인해 제가 사용하고 있는 IDE(PHPStorm)는 더 이상 내 코드에서 무슨 일이 일어나고 있는지 이해하지 못합니다.$container['mailer'] 또는 $sc->mailer가 클래스 객체를 보유하고 있다는 것을 이해하지 못합니다.Netbeans IDE도 사용해 보았습니다.같은 문제.
내 IDE가 쓸모없어지기 때문에 이것은 나에게 정말 문제가 됩니다.나는 클래스를 다룰 때 코드 힌트, 자동 완성, 리팩토링 도구 없이 프로그래밍하고 싶지 않습니다.그리고 내 IDE가 코드 유효성을 검사할 때 모든 종류의 오탐지를 찾는 것을 원하지 않습니다.
그래서 내 질문은 다음과 같습니다이 문제를 해결하고 해결책을 찾은 사람이 있습니까?
해결책
변수의 클래스를 수동으로 정의 할 수 있습니다.
/** @var YourClassType $mailer */
$mailer = $container['mailer'];
.
phpstorm (및 표준),두 개의 별표를 사용하고 변수의 이름 앞에 데이터 형식을 씁니다.
다른 팁
컨테이너에서 꺼낸 개체의 유형을 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의 경우 중요합니다.
- 코멘트는 하나의
*
만으로 시작됩니다. - 먼저 힌트보다 변수 이름입니다.
대체 코멘트 변이
많은 논의가 많은 경우, 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가 부합하고 깨지기 쉬운 구성을 만드는 것에 의해 무시됩니다.