Magento 2テンプレート:「$ block」または「$ this」を使用しますか?


27

Magento 2では、$this変数はテンプレートのブロックオブジェクトを参照しなくなりました。テンプレートクラスを参照します

 Magento\Framework\View\TemplateEngine\Php

ただし、このテンプレートクラスにはpassthrough __callメソッドがあります

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

これにより、メソッド呼び出しが実際のブロックに到達するようになります。また、phtmlテンプレートから保護されたメソッドを呼び出せない理由も説明します。

ただし、これに加えて、すべての(と思う?)テンプレートには、$blockpopulated という名前の変数があり、これは親ブロックオブジェクト参照します。これは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;ますinclude $fileName;。テンプレートファイルは、シンプルなを使用して含まれます。
これは、テンプレート内ではまだPhpテンプレートエンジン内にいることを意味します。それが$this機能する理由で$blockあり、定義されている理由です。

[編集]内部テンプレート
を使用すること$thisはお勧めできません。
EcgM2標準のphpスニファーは、$this内部テンプレートを使用すると警告を表示します。
に置き換える$this$block、警告は消えます。


これは、.phtmlファイルの$ blockまたは$ thisのデフォルトオブジェクトです。
マニッシュゴスワミ

デフォルトではどういう意味ですか?
マリウス

テンプレートのレンダリングクラスにアクセスするためにテンプレートで使用されるデフォルト変数は何ですか?機能にアクセスするためにこれら2つの間に違いはありますか?
マニッシュゴスワミ

それはny答えで言います。両方とも機能しますが、使用することをお勧めします$block
マリウス

5

私が見た限り、それらは両方ともPHP TemplateEngineInterfaceでほとんど同じですが、Magento2ではカスタムテンプレートエンジンを作成できることを覚えておいてください。phtmlファイルがあったMagento1とは異なります。

が表示されるTemplateEngineInterface場合、を呼び出すメソッドへの参照が表示されないcurrentBlockため、この$this->currentBlockアプローチはPHPテンプレート固有のものだと思います。

しかし、テンプレートエンジンから独立するために$blockは、正しいアプローチでなければなりません。

理論的には、phtmlファイルに依存せず、他のPHP構造に依存する別のPHPベースのエンジンを作成できるということです。

$blockコンテキスト変数として明示的に渡されるため、「phtml」モードの「正しい」方法と想定しています。

$blockそして$this->currentBlock、彼らは明示的に使用されている場合、技術的な観点から同じですが、$block私たちは、ビューのコード・スタイリングのポイントから、それを使うべきだと思います。


ただし、$ blockはインターフェイスの一部ではありません。この実装は、phtmlファイル内にあるときに使用されると想定しても安全だと思います。他の実装ではphtmlファイルを使用しません。
ファビアンシュメングラー

あなたは正しいです、私が言っていることを説明するための答えがはっきりしていません。投稿を詳細に修正しました。
Phoenix128_RiccardoT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.