마 젠토 2 템플릿 :`$ block` 또는`$ this`?


27

Magento 2에서 $this변수는 더 이상 템플릿의 블록 객체를 참조하지 않습니다. 템플릿 클래스를 나타냅니다

 Magento\Framework\View\TemplateEngine\Php

그러나이 템플리트 클래스에는 패스 스루 __call메소드가 있습니다.

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

메소드 호출이 실제 블록으로 전달되도록합니다. 또한 phtml템플릿 에서 보호 된 메서드를 호출 할 수없는 이유도 설명합니다 .

이 생각뿐만 아니라, 모든 (내 생각?) 템플릿라는 변수가 $block채워, 또한 부모 블록 객체를 참조합니다. Magento의 목록 템플릿에서 사용중인 것을 볼 수 있습니다

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

$block변수가 사용되지만 명시 적으로 정의되지 않은 곳 .

위에서 언급 한 차이점 외에 한 기술을 다른 기술보다 사용하는 데 차이점이 있습니까? 즉, 마 모두 $block$this->currentBlock같은 객체를 참조?

답변:


32

템플릿 파일에서 $block$this->_currentBlock같은 일이다.

템플릿 엔진 의 render방법을 살펴보십시오 Php.php.
템플릿 파일을 포함시키기 전에 $this->_currentBlock = $block;다음 이 발생합니다. 템플릿 파일은 simple을 사용하여 포함됩니다 include $fileName;.
이는 템플릿 내에서 여전히 Php템플릿 엔진 안에 있음을 의미합니다 . 그것이 $this작동하는 이유 $block이며 , 이것이 정의 된 이유 입니다.

[편집]
방금 $this내부 템플릿 사용을 권장하지 않습니다. 내부 템플릿을
사용할 때 EcgM2 표준의 PHP 스니퍼에 경고가 표시됩니다 $this.
교체 $this$block경고가 사라질 수 있습니다.


따라서 .phtml 파일 $ block 또는 $ this의 기본 개체는 어느 것입니까?
Manish Goswami

기본적으로 무엇을 의미합니까?
마리우스

템플릿의 렌더링 클래스에 액세스하기 위해 템플릿에서 사용되는 기본 변수는 무엇입니까? 이 두 가지 기능에 액세스하는 데 차이점이 있습니까?
Manish Goswami

그것은 모든 대답에 나와 있습니다. 둘 다 작동하지만 사용하는 것이 좋습니다$block
Marius

5

내가 본 한, 둘 다 PHP TemplateEngineInterface에서 거의 동일하지만 Magento2에서는 사용자 정의 템플릿 엔진을 만들 수 있습니다. phtml 파일이있는 Magento1과 다릅니다.

당신이 볼 경우, TemplateEngineInterface당신은 전화 어떤 방법에 대한 참조를 볼 수 없습니다 currentBlock나는 생각한다, 그래서 $this->currentBlock방법은 PHP 템플릿 고유의 것입니다.

그러나 템플릿 엔진과 독립 $block하려면 올바른 접근 방식이어야합니다.

이론적 인 관점에서 phtml 파일을 사용할 수 없지만 다른 PHP 구조를 사용하는 다른 PHP 기반 엔진을 만들 수 있습니다.

$block문맥 변수로 명시 적으로 전달되기 때문에 "phtml"모드에 대한 "올바른"방법으로 가정 합니다.

$block$this->currentBlock기술적 인 관점에서 동일하지만, 그들은 명시 적으로 사용하는 경우에 $block나는 우리가보기의 코드 스타일링 관점에서, 그것을 사용한다고 생각합니다.


그러나 인터페이스의 $ block 부분도 아닙니다. phtml 파일 안에있을 때이 구현이 사용된다고 가정하는 것이 안전하다고 말하고 싶습니다. 다른 구현에서는 phtml 파일을 사용하지 않습니다.
Fabian Schmengler

당신 말이 맞아요, 나는 내 말의 의미를 명확하게 설명하지 못했습니다. 자세한 내용으로 게시물을 수정했습니다.
Phoenix128_RiccardoT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.