抽象モデルの非推奨の保存およびロードメソッド


57

Magento 2リポジトリの開発ブランチでは、メソッドloadsavefrom Magento\Framework\Model\AbstractModelクラスが非推奨になっていることがわかります。
しかし、コアには、このクラスを拡張してandを使用する膨大な数のクラスがsaveありloadます。
エンティティのCRUD部分に独自のモジュールを作成するとき、コアモジュールと同じガイドラインに従います。
しかし、これらのメソッドは非推奨であるため、将来に備えたいと思います。
それらの代わりに何を使うべきですか?または、他の何かを拡張する必要がありますか?


これらのメソッドは現在廃止されていますか?
Knight017

1
今ではあなたが2.3を意味し、場合、はい、彼らは以下のとおりです。github.com/magento/magento2/blob/2.3/lib/internal/Magento/...
マリウス

回答:


34

モジュールサービス契約を使用する必要があります。

製品の例では、ProductRepositoryInterfaceを使用する必要があります

<?php
/**
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Catalog\Api;

/**
 * @api
 * @since 100.0.2
 */
interface ProductRepositoryInterface
{
    /**
     * Create product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @param bool $saveOptions
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\InputException
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\CouldNotSaveException
     */
    public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false);

    /**
     * Get info about product by product SKU
     *
     * @param string $sku
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function get($sku, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Get info about product by product id
     *
     * @param int $productId
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getById($productId, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Delete product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\StateException
     */
    public function delete(\Magento\Catalog\Api\Data\ProductInterface $product);

    /**
     * @param string $sku
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     * @throws \Magento\Framework\Exception\StateException
     */
    public function deleteById($sku);

    /**
     * Get product list
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface
     */
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}

モジュールサービス契約が利用できない場合、ResourceModelを使用してエンティティを保存できます。


そうですか。意味あり。しかし、すべてのコアCRUDモジュールが1つの時点でサービス契約を結ぶことを確認できますか?
マリウス

1
の実装はProductRepositoryInterfaceまだloadメソッドgetとで使用していることがわかりgetByIdます。このloadメソッドの代わりにモジュールにリソースモデルを使用する必要がありますか?
マリウス

2
はい、モジュールがモジュールSLでResourceModelを使用する方が良いため
KAndy

6
ResourceModelを使用する方法のサンプルコードを教えてください
Yogesh Karodiya

1
例はありますか?私は公式のレビューとニュースレターのモジュールを見ましたが、彼らは直接「保存」と呼んでいます。ResourceModelの使用例が見つかりません。モジュール用に定義されていますが、使用方法は?
ジャニスエルメリス

24

私が理解したことから、Magentoがハイドレーターextract()hydrate()メソッドに切り替える予定です。

このリンクは以前は機能していましたが、Magentoチームがロールバックしたようです:https : //github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

ここでコミットの履歴を見つけることができます:https : //github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

重要なファイルは次のとおりです。

  • EntityHydrator.php
  • EntityMetadata.php
  • HydratorInterface.php
  • MetadataPool.php

また、Actionフォルダーの下のファイルとファイルをチェックアウトすることをお勧めしSequenceます。

私が理解したことから(ここではまったく間違っているかもしれません):

  • Actionフォルダーの下のファイルはCRUDアクションです
  • Sequenceファイルは、イテレータですか?

それは少し前に起こった会話でした(それについて言及したのはアランストームだったのですか?覚えていません)。

更新

私の研究によると、この変更に関する内部MagentoチケットはMAGETWO-50676です。ここに私が見つけた関連するコミットを示します。

おそらくもっとTBHがありますが、コミットメッセージのリポジトリ全体を参照する気はありません^^

ハイドレーターに慣れていない場合は、次のリンクを確認することをお勧めします:http ://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

2.1からの更新

Magentoは、EntityManagerクラスを使用して継承を置き換えています。詳細については、Magento 2.1:エンティティマネージャーを使用してください。


1
OK。素敵な理論。しかし、コアの例を使用できます。申し訳ありませんが、私のmagentoスキルはコピー/貼り付け/置換を再開します:)。アクションファイルとシーケンスファイルについて言及しました。もっと具体的に教えてください。
マリウス

残念ながら、@ Mariusはそれだけです。私はその情報をどこから得たのか覚えていませんが、当時の計画はこの特定のコミットを使用することでした:github.com/magento/magento2/tree / ...からハイドレーターへの切り替えを実装するload()/save()ことでした。私はSequencesイテレータのような仕事を想定しActions、CRUDアクションです
デジタルピアニズムのラファエル

4
現在のcmsブロックリソースモデルのロード方法の例があります:github.com/magento/magento2/blob/develop/app/code/Magento/Cms/…entityManager- > load github.com/magento/magento2/を使用しますblob / develop / lib / internal / Magento /… ReadMain操作を実行します(私が思うに)github.com/magento/magento2/blob/develop/lib/internal/Magento / ...は、読み込まれたエンティティデータでスケルトンエンティティをハイドレイトします( Magentoからの素敵な動き;))
デビッドヴェルホーレン


2

Magento 2 Deprecated Load Methodに代わるものは、リソースモデルのロードメソッドです。

public funtion getCustomer($id)
{
   $customerModel = $this->customerFactory->create();
   $this->customerResource->load($customerModel, $id);
   $customerModel->getEmail();  
}

ここで、最初のパラメーターはモデルオブジェクトで、2番目のパラメーターはロードするidです。

Magento 2の非推奨の保存方法に代わるものは、リソースモデルの保存方法です。

public funtion save($taskData)
{
   $taskModel = $this->taskFactory->create()->setData($taskData);
   $this->resource->save($taskModel);
}

saveメソッドは、モデルオブジェクトであるパラメーターを1つだけ受け入れます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.