UFO ET IT

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

ufoet 2020. 11. 20. 17:24
반응형

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


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

나는 보았다 , 여드름sfServiceContainer , 몇 가지 테스트를 실행하고 정말 어떻게 DIC의 작업을 주셔서 감사합니다. 단순함과 순수한 힘 때문에 나는 아마도 여드름에 갈 것입니다. 이 문제가없는 경우 :

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, @varNetBeans에서 유형 힌트 인라인 변수 를 사용하려면 별표 하나/* 와 함께 사용해야 합니다. 이다 없는 한 문서 블록 주석과 함께 작동하지 않습니다 . 또한 이름은 유형 앞에옵니다./**//

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

IDE는 코드를 예상하지 않기 때문에 사용자를 알지 못하며 도움이 필요합니다. Eclipse 및 기타 IDE에서도 작동한다는 것을 알고 있습니다. 변수 유형을 힌트하십시오.

Netbeans / Phpstorm / PDT / ZendStudio 예제

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

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

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

  1. 주석은 *하나만으로 시작 됩니다.
  2. 힌트보다 먼저 변수 이름입니다.

대체 주석 변형

많은 논의가 있었기 때문에 IDE마다 다를 수 있습니다. 그러나 대부분의 IDE는 위와 같이 인라인 코드 변수에 대한 변수 힌트를 지원합니다. 따라서 IDE에 따라 다르지만 비슷하게 작성 될 수 있습니다. 여기에 별표 두 개가 앞에 있습니다.

/** @var $mailer MailerInterface */

PHPDoc 호환성

인라인 코드에 대해 var doc-comment 클래스를 다음과 같이 모방하면 PHPDoc 파서에 문제가 발생할 수 있습니다.

/** @var MailerInterface $mailer  */

해당 문서는 일반적으로 클래스 변수에 사용됩니다 ( @var- 클래스 변수 의 데이터 유형 문서화 ). 그런 다음 PHPDoc은 QA에 대한 부담이되는 주석 뒤에 클래스 변수의 정의가 누락되었습니다.

그러나 일부 IDE는 PHPDoc clas-variable 스타일로 작성된 경우 간단한 변수에 대한 코드 완성도 제공합니다. 현재 클래스의 코드 완성에 대한 부작용이 있는지 여부는 실제로 존재하지 않는 새 멤버가 도입 될 수 있습니다.


Google에서 온 사람들을 위해.

PHPStorm은 실제로 PHPDocs를 반복해서 작성하는 대신 이러한 종류의 문제를 해결하는 방법을 제공합니다. 여기에 설명.phpstorm.meta.php 된 방식으로 파일을 만들고 설정 하면 원활하게 작동하는 자동 완성 및 유형 검사를 얻을 수 있습니다.


I know that the question is about DIC only, but there is a Silex Pimple Dumper service provider which dumps the container to a json file. The same author wrote a plugin for PHPStorm which can read that file and open the autocomplete with the service names and its type (class, string and etc). I'm using those two components and I can say that are good options for auto completion for Silex/Pimple.


Pimple just introduce container builder principe. If you understand it, you don't need Pimple any more:


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

This way Pimple does not hide type of object in mixed $c['some key']. You would have autocomplete suggestions when edit your container. Phpstorm is able to autoresolve method return type from your code. And you would have clear container. You can ever override container:


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

To be honest container written in 'programming' lanuage is wrong way to go. Container responsibility is to bring initialized graph of objects to caller. Having access to 'programming language' allows to violate that responsibility with easy. Some DSL for configuring dependency is better. Moreover most of original dependency information (argument typehints of constructors) is just ignored by Pimple and sfDepenencyContainer making your configuration bloated and fragile.

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

반응형