Extbase 엔터티 및 속성 유형

7672 단어 typo3extbasephp74
안녕하세요 여러분, extbase 엔터티 및 속성 유형에 대한 게시물이 있습니다.

PHP 7.4가 속성 유형을 도입했을 때 우리 모두는 기뻤습니다. 맞습니까? 우리는 마침내

class Foo {
    /**
     * @var string
     */
    private $bar;

    public function __construct() {
       $this->bar = 'string';
    }
}


에게

class Foo {
    private string $bar;

    public function __construct() {
       $this->bar = 'string';
    }
}


extbase를 제외하고 우리는 모든 것을 확장하지는 않았습니다. 적어도 최근까지는. TYPO3(extbase) 버전에 대해 이야기해 봅시다. 초기화되지 않은 속성을 처리하는 이 패치https://review.typo3.org/c/Packages/TYPO3.CMS/+/72005가 있지만 기본 및 11.5에만 병합되었습니다. 따라서 10.4 및 이전 버전에는 여전히 쓰고 싶은 작은 문제가 있습니다.

초기화되지 않은 속성에 대해 언급한 것을 이미 눈치채셨을 것입니다. 몇 가지 예를 들어 자세히 설명하겠습니다.

class Foo {
    private string $bar = '';
}


이것은 초기화된 속성, 즉 기본값이 할당된 속성입니다. 해당 클래스를 인스턴스화하고 get_object_vars()를 호출한다고 가정해 보겠습니다.


$object = new Foo();
var_dump(get_object_vars($object));
// array(1) {
//   ["bar"]=>
//   string(0) ""
// }

get_object_vars()가 속성 표시줄을 감지하는 것을 볼 수 있지만 이는 초기화되었기 때문입니다. 그리고 이것이 우리의 문제가 시작되는 곳입니다.

당시 PHP 7.4 이전에는 모든 속성이 기본적으로 null 로 초기화되었습니다. 모든 속성은 기본적으로 null이 될 수 있기 때문입니다.

class Foo {
    /**
     * @var string
     */
    private $bar;
}


우리는 레거시 코드 기반에서 이와 같은 많은 코드 스니펫을 찾습니다. 그리고 phpdoc 유형이 원하는/의도된 속성 유형을 표현했지만 실제로는 잘못된 것입니다. 속성은 모든 값을 보유할 수 있으며 기본적으로 null입니다. 그래서 우리는 종종 무엇을합니까? 간단히 다음과 같이 코드를 변환합니다.

class Foo {
    private string $bar;
}


그러나 이제 속성이 단일화되어 더 이상 null이 될 수 없으며 문자열만 할당할 수 있습니다. PHP 현명한 이것은 완전히 유효한 코드입니다. 그러나 11.5 이전의 코드 베이스에서 이와 같은 extbase 엔터티를 변환하면 문제가 발생합니다.

10.4까지는 extbase가 속성을 감지하는 데 사용get_object_vars()했으며 PHP 7.3까지는 모든 속성이 항상 초기화되고 해당 메서드가 모든 속성을 감지했기 때문에 문제가 되지 않았습니다. 7.4에서 이것이 변경되고 extbase가 속성의 존재에 대한 정보를 잃어버리면 데이터베이스에서 엔터티를 재구성할 때 더 이상 속성 값을 설정하지 않을 수 있습니다.

언급했듯이 11.5에는 수정 사항이 있지만 여전히 10.4 이하인 경우에는 어떻게 됩니까? 다음은 귀하를 위한 모범 사례입니다.

class Foo {
    private string $bar = '';
}


데이터베이스에 기본값으로 저장하는 값과 같이 기본값으로 초기화할 수 있는 속성이 있는 경우 그렇게 하십시오. 기본값을 설정하는 생성자가 있는 경우에도:

class Foo {
    private string $bar = '';

    public function __construct(string $bar) {
       $this->bar = $bar;
    }
}


귀하의 IDE는 기본 속성 값이 필요하지 않지만 그대로 유지하라고 말하려고 할 것입니다. 또한 PHPStan 및 Psalm과 같은 도구는 오류를 발생시킬 가능성이 높지만 이 경우 더 잘 알고 있기 때문에 이를 무시해야 합니다.

그러나 다른 엔터티와의 관계를 유지하는 속성과 같이 초기화할 수 없는 속성은 어떻게 됩니까? 가능한 유일한 방법은 null를 허용하고 기본값으로 설정하는 것입니다.

class Foo {
    private ?Bar $bar = null;
}


그럼에도 불구하고 관계가 null일 수 없다는 것을 알고 있다면. 못생겼죠? 보기에 데이터(데이터베이스 레코드)를 표시하기 위해서만 엔터티를 사용하고 있고 TCA에서 관계가 설정되었는지 확인한다고 가정해 보겠습니다. 글쎄, 이 경우 내 권장 사항은 getter에서 예외를 발생시키는 것입니다.

class Foo {
    private ?Bar $bar = null;

    public function getBar(): Bar
    {
        if ($this->bar instanceof Bar) {
            return $this->bar;
        }

        throw new \DomainException(
            'Foo::$bar is unexpectedly null'
        );
    }
}


기본 코드에서 처리해야 하는 가능한 null 값을 피하기 때문에 예외를 throw하는 것이 좋습니다. 그리고 이 사건은 결코 일어날 것으로 예상되지 않기 때문에 당신은 여기서 분명합니다.

오늘은 여기까지입니다. 이 게시물이 프레임워크 문제와 해결 방법을 이해하는 데 도움이 되기를 바랍니다. 그리고 11.5로 업데이트할 수 있다면 더욱 좋습니다!

좋은 시간 보내세요.
건배.

좋은 웹페이지 즐겨찾기