programing

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

skycolor 2023. 10. 24. 21:09
반응형

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

현재 상황:저는 프로젝트에 의존성 주입을 통해 해결하는 의존성이 있습니다.나는 의존성 관리를 완화하고 게으른 부하 클래스를 위해 의존성 주입 컨테이너(DIC)를 사용함으로써 다음 논리 단계를 밟고 싶습니다.

Bucket, Pimple, sfServiceContainer를 보고 몇 가지 테스트를 해보고 DIC의 작동 방식에 대해 정말 감사했습니다.핌플의 단순함과 원초적인 힘 때문에 저는 아마 핌플을 선택할 것입니다.이 문제가 없는 경우:

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

IDE가 무용지물이 되어 버리기 때문에 이것은 저에게 정말 문제가 됩니다.저는 수업을 다룰 때 코드 힌트, 자동 완성 및 리팩토링 도구 없이 프로그래밍하고 싶지 않습니다.그리고 코드를 검증할 때 IDE가 모든 종류의 오판을 발견하는 것을 원하지 않습니다.

그래서 제 질문은: 이 문제를 해결하고 해결책을 찾은 사람이 있습니까?

변수의 클래스를 '수동으로' 정의할 수 있습니다.

/** @var YourClassType $mailer */
$mailer = $container['mailer'];

PphStorm(및 표준 기준)에서 두 개의 별표를 사용하고 변수 이름 앞에 데이터 유형을 작성합니다.

변수 이름 없이 데이터 유형을 작성할 수 있지만 데이터 유형이 없는 이름은 작성할 수 없습니다.

IDE에 액세스할 때마다 용기에서 꺼내는 개체의 유형을 확실히 알 수 있지만 한 번만 하는 것이 좋습니다.다음 두 가지 해결책은 모두 컨테이너를 하위 분류하는 것을 포함합니다.어차피 이렇게 하는 걸 추천해주는 핌플을 이제 막 쓰기 시작했어요.

액세스한 인스턴스 멤버를 사용하는 컨테이너의 경우->마법을 통해 노출되거나__getmethod, 당신은 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, 유형 암시 인라인 변수의 경우@varNetBeans에서 사용해야 합니다./*별표 하나로문서 차단 주석이 아니며 사용할 수 없습니다./**아니면// 타입이 붙습니다 또한 타입 앞에 이름이 붙습니다.

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

IDE가 코드를 실행하지 않기 때문에 사용자는 이를 알지 못하며 도움이 필요합니다.이클립스와 다른 IDE에도 적용된다는 것을 알고 있습니다.변수의 유형을 암시합니다.

Netbeans / Pphstorm / PDT / ZendStudio 예제

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

코드 완료가 다시 작동하기 시작합니다.$mailer.

PDT의 경우 다음 사항이 중요합니다.

  1. 댓글은 하나로 시작합니다.*
  2. 힌트보다 변수 이름이 먼저입니다.

대체 설명 변형

많은 논의의 대상이 되었던 만큼 IDE마다 다를 수 있습니다.그러나 대부분의 IDE는 위와 같은 방식으로 인라인 코드 변수에 대한 변수 암시를 지원합니다.따라서 IDE에 따라 두 개의 별표가 앞에 있는 여기와 같이 다르게 유사하게 작성될 수 있습니다.

/** @var $mailer MailerInterface */

PHPdoc 호환성

인라인 코드에 대한 class var doc-comment를 다음과 같이 모방하는 경우 PHP docparaser에 문제가 발생할 수 있습니다.

/** @var MailerInterface $mailer  */

해당 문서는 일반적으로 클래스 변수에 사용됩니다(@var - 클래스 변수의 데이터 유형을 문서화합니다).PHPdoc은 의견 뒤에 QA에 대한 부담을 수반하는 클래스 변수의 정의를 누락하고 있습니다.

그러나 일부 IDE는 단순 변수에 대해서도 PHPDoc 클래스 변수 스타일로 작성할 때 코드 완성을 제공합니다.현재 클래스의 코드 완료에 부작용이 있는지는 모르겠지만 실제로는 존재하지 않는 새로운 멤버가 도입될 수도 있습니다.

구글에서 오신 분들.

PHPStorm은 실제로 PHPDoc을 반복적으로 작성하는 대신에 이러한 문제를 해결할 수 있는 방법을 제공합니다(생성 및 설정)..phpstorm.meta.php여기에 설명된 방식으로 파일은 자동 완성 및 형식 검사를 원활하게 수행할 수 있습니다.

여드름은 그냥 컨테이너 빌더 원칙만 소개합니다.이해만 한다면 더 이상 핌플이 필요 없습니다.


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(
        );
    }
}

이렇게 하면 Pimple은 혼합 $c['some key']에서 개체 유형을 숨기지 않습니다.컨테이너를 편집할 때 자동 완성 제안이 표시됩니다.Pphstorm은 당신의 코드에서 메소드 리턴 타입을 자동으로 해결할 수 있습니다.그리고 당신은 투명한 용기를 가지고 있을 겁니다.컨테이너를 재정의할 수 있습니다.


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

솔직히 '프로그래밍' 언어로 쓰인 컨테이너는 잘못된 길입니다.컨테이너 책임은 개체의 초기화된 그래프를 호출자에게 가져오는 것입니다.'프로그래밍 언어'에 접근하는 것은 그 책임을 쉽게 위반할 수 있게 해줍니다.종속성을 구성하기 위한 DSL이 더 좋습니다.또한 Pimple과 sfDependencyContainer는 원래 종속성 정보(컨스트럭터의 인수 유형 힌트)의 대부분을 무시하여 구성이 비대해지고 깨집니다.

DIC에 대한 질문인 것은 알고 있지만, json 파일에 컨테이너를 덤프하는 Silex Pimple Dumper 서비스 업체가 있습니다.동일한 작성자가 PHPSTorm용 플러그인을 작성했는데, 이 플러그인은 해당 파일을 읽고 서비스 이름과 해당 유형(클래스, 문자열 등)으로 autoccomplete를 열 수 있습니다.저는 이 두 가지 구성요소를 사용하고 있으며 Silex/Pimple의 자동 완성을 위한 좋은 옵션이라고 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6395737/how-do-i-make-my-php-ide-understand-dependency-injection-containers

반응형