Magento 2:ステートメントを使用するか、直接クラスパスを使用しますか?


14

私はポイントを逃しているかもしれませんが、なぜ特定のクラスに「使用」ステートメントがあるのか​​、時にはないのか疑問に思っています。

例:app\code\Magento\Email\Model\Template.php、ファイルの先頭にあります:

namespace Magento\Email\Model;

use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\StoreManagerInterface;

次に、__constructメソッドには次のパラメーターがあります。

public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\View\DesignInterface $design,
    \Magento\Framework\Registry $registry,
    \Magento\Store\Model\App\Emulation $appEmulation,
    StoreManagerInterface $storeManager,
    \Magento\Framework\View\Asset\Repository $assetRepo,
    \Magento\Framework\Filesystem $filesystem,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Email\Model\Template\Config $emailConfig,
    \Magento\Email\Model\TemplateFactory $templateFactory,
    \Magento\Framework\Filter\FilterManager $filterManager,
    \Magento\Framework\UrlInterface $urlModel,
    \Magento\Email\Model\Template\FilterFactory $filterFactory,
    array $data = []
)

したがってuse Magento\Store\Model\StoreManagerInterface;、クラスの先頭で呼び出したときStoreManagerInterface $storeManagerに、コンストラクターパラメーターで実行できることが明確にわかります。

私の質問は:

  • なぜ1つのクラスだけでこれを行うのですか?
  • useコンストラクターのすべてのクラスにステートメントを追加して、完全なクラスパスを入力する必要がないのはなぜですか?
  • または、逆に、useステートメントを削除してStoreManagerInterfaceクラスへのフルパスを入力してみませんか?

回答:


15

名前の競合(異なる「コンテキスト」クラスなど)がある場合を除き、一方を他方よりも優先する技術的な理由はありません。しかし、それらはエイリアスで解決することができ、それは私が通常行うことです:

use Magento\Framework\Model\Context as ModelContext;

コアでは、多くのメソッド、特にコンストラクターが、最初は変換ツールなどのツールによって生成され、その後「使用」インポートを使用するように変更されていない想定しています。

したがって、実際のコードをより冗長で読みやすくするために、独自のコードでは常に「use」を使用してクラスをインポートすることをお勧めします。


それで、明確にするために、コアチームがuse私が正しく指摘した特定のクラスに追加したポイントはありませんか?
デジタルピアニズムのラファエル

1
いいえ。オートコンプリートを使用するときにuseステートメントを自動的に追加するIDEを使用している人によって後で追加されたように見えます。
ファビアンシュメングラー

2

使用法は特定の状況に依存します。私のアプローチは:

ファイル内で一度だけ言及されたクラス-FQN

完全修飾名のままにします。使用する必要がないため、読みやすさが向上しますセクションを再度。

クラス名が複数回使用されています- インポート

で、それを入れて使用するセクション。これにより、クラスが言及されている場所でコードが短くなります。

クラスは一度使用されましたが、短い表記が必要です- インポート

例を挙げて説明する。

FQN

$collection->getSelect()
           ->joinInner(['campaign_products' => $subSelect],
               'campaign_products.product_id = e.entity_id',
               [self::FIELD_SORT_ORDER => "IFNULL(IF(0 = " . \Custome\Module\Api\Data\ProductListInterface::SORT_ORDER . ", NULL, " . \Custome\Module\Api\Data\ProductListInterface::SORT_ORDER . "), {$defaultSortValue})"]
           );

インポート

$collection->getSelect()
           ->joinInner(['campaign_products' => $subSelect],
               'campaign_products.product_id = e.entity_id',
               [self::FIELD_SORT_ORDER => "IFNULL(IF(0 = " . ProductListInterface::SORT_ORDER . ", NULL, " . ProductListInterface::SORT_ORDER . "), {$defaultSortValue})"]
           );

私の意見では、2番目の例は読みやすいです。(しかし、正直に言えば、ここでは定数の代わりに変数を使用して読みやすくします。)

Magento 2 APIインターフェース

M2自動公開APIエンドポイントに関する通知があります。REST / SOAPメソッドに使用されるインターフェースでは、常にFQNを使用する必要があります。

注釈はMagentoフレームワークによって解析され、JSONまたはXMLとの間でデータを変換する方法が決定されます。

クラスのインポート(つまり、クラスの上のuseステートメント)は適用されません!

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