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로 업데이트할 수 있다면 더욱 좋습니다!
좋은 시간 보내세요.
건배.
Reference
이 문제에 관하여(Extbase 엔터티 및 속성 유형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/alexanderschnitzler/extbase-entities-and-property-types-4iok텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)