まず、次のようなモデルでsave()
メソッドを直接使用するとどうなるかを見てみましょうproduct
/**
* @var Magento\Catalog\Model\Product $product
*/
$product->save();
モデルクラス自体は
Magento\Catalog\Model\Product
このクラス内で、save()メソッドの定義を検索します。
見つかりませんでしたか?まあ、beforeSave()とafterSave()はありますが、save()自体はありません。面白いですよね?
次に、の親クラスを確認する必要がありますMagento\Catalog\Model\Product
。
私たちは、通過する必要があるMagento\Catalog\Model\AbstractModel
とMagento\Framework\Model\AbstractExtensibleModel
最終的に到着しただけに、Magento\Framework\Model\AbstractModel
。
案の定、ここにsave()メソッドがあり、それは次のようになります
public function save()
{
$this->_getResource()->save($this);
return $this;
}
save()が任意のモデルで呼び出されるたびに、これからのsave()メソッドAbstractModel
が呼び出され、実装はRESOURCE MODELが実際に保存を行うことがわかります。
Magento 1.0の時間の始まりからと同じように、ほぼすべてのエンティティのモデルとリソースモデルの両方を作成しているため、この最後の1つは常に驚くことではありません。
それでは、どのようにProductRepository
機能するか見てみましょう。
ファイルを開きましょう
/vendor/magento/module-catalog/Api/ProductRepositoryInterface.php
このインターフェースは、他のメソッドの中でも特にsave()メソッドがあることを要求します。
このインターフェイスを実際に実装しているのは誰ですか?
ファイルを開きましょう
/etc/di.xml
そして10行目をチェック
<preference for="Magento\Catalog\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
そのため、当然のことながら、save()の方法が内部にあることがわかります。
/vendor/magento/module-catalog/Model/ProductRepository
そしてそれは次のように見えて、444行目から始まります
public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false)
{
$tierPrices = $product->getData('tier_price');
try {
.... other code here ....
このメソッドは、\Magento\Catalog\Api\Data\ProductInterface
渡されるタイプの$ productオブジェクトを想定していますが、デフォルトではに解決されますMagento\Catalog\Model\Product
。
500行目を下に見下ろすと、try
ステートメントが表示され、次のようになります。
$this->resourceModel->save($product);
よくわかりました!$this->resourceModel
はタイプ77で\Magento\Catalog\Model\ResourceModel\Product
、protected
プロパティとして宣言されています。
したがって、繰り返しになりますが、ResourceModel
実際には節約が行われます。
しかし、実際には444行目から500行目までがあなたの質問に対する答えです。実際、ここで実行されるすべてのコードは、最終的に、直接モデルの保存とこのリポジトリの保存方法との動作の違いにつながる可能性があります。
たとえば、ignore_links_flag
がに設定されている場合、製品リポジトリは製品リンクを取得して処理します。0
これが最初から既存の製品かどうかを確認します。
将来的に製品の保存方法を変更する必要がある場合は、おそらく、製品モデルではなく製品リポジトリをオーバーライドすることで、より良い方法であると結論付ける必要があります。
製品の保存と更新についても同様です。製品リポジトリオブジェクトを使用したいのですが。
/vendor/magento/module-cms/Model/PageRepository.phpも参照してください。
これは、CMSページがリポジトリを介して保存される方法です。ここでは、物事はより簡単です。ストアIDが設定され、リソースモデルが呼び出されてすぐに保存されます。
この最後の通知で、リポジトリとモデルの保存にそれほど大きな違いがない場合があると結論付けますが、とにかく、必要なときにいつでもそれらを見つける準備ができていることを願っています。