Magento 2: deyimi doğrudan sınıf yoluna karşı kullan?


14

Bir noktayı kaçırıyor olabilirim ama neden bazen belirli bir sınıf için "kullan" ifadesi olduğunu merak ediyorum, bazen de bilmiyoruz.

Örnek: app\code\Magento\Email\Model\Template.phpDosyanın en üstünde:

namespace Magento\Email\Model;

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

Sonra __constructyöntemde aşağıdaki parametreler var:

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;Sınıfın en üstünde dediğimiz gibi StoreManagerInterface $storeManageryapıcı parametrelerinde yapabildiğimizi açıkça görebiliyoruz .

Sorularım:

  • Bunu neden sadece bir sınıf için yapıyoruz?
  • Neden usetüm sınıf sınıfı için bir ifade ekleyemiyoruz , bu yüzden tam sınıf yolunu yazmak zorunda kalmıyoruz?
  • Ya da tam tersine, neden useifadeden kurtulup StoreManagerInterfacesınıfın tam yolunu yazmıyoruz?

Yanıtlar:


15

İsim çatışmaları (farklı "Bağlam" sınıfları gibi) dışında, diğerini tercih etmek için teknik bir neden yoktur. Ama bunlar takma adlarla çözülebilir ve genellikle bunu yaparım:

use Magento\Framework\Model\Context as ModelContext;

Ben varsayalım özellikle çekirdek birçok yöntemler kurucularınızdaki ilk başta dönüşüm aracı gibi araçlar tarafından oluşturulan ve daha sonra "kullanım" ithalatı kullanmaya değiştirilmedi söyledi.

Bu yüzden kendi kodunuzda her zaman gerçek kodu daha az ayrıntılı ve daha okunabilir hale getirmek için "kullan" ile sınıfları içe aktarmanızı öneririm.


Yani çekirdek ekibin useişaret ettiğim sınıfa kattığı hiçbir anlamı yok.
Raphael, Dijital Piyanizm'de

1
Hayır. Bana göre, daha sonra otomatik tamamlama kullanırken otomatik olarak kullanım ifadeleri ekleyen bir IDE kullanan biri tarafından eklenmiş gibi görünüyor.
Fabian Schmengler

2

Kullanım belirli bir duruma bağlıdır. Benim yaklaşımım:

Bir dosyanın içinde sadece bir kez belirtilen sınıf - FQN

Tam ad bırakın . Bu, okunabilirliği artırır çünkü kullanım bölümüne tekrar bakmanıza gerek yoktur .

Sınıf adı birden çok kez kullanıldı - içe aktar

Bir kullanım bölümüne koyun . Bu, sınıfın belirtildiği yerde kodu kısaltır.

Sınıf bir kez kullanıldı ama kısa bir gösterim gerekiyor - alma

Bir örnekle daha iyi açıklayın.

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})"]
           );

ithalat

$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})"]
           );

Bence ikinci örneğin okunması daha kolay. (Ama dürüst olmak gerekirse, daha da okunabilirlik sağlamak için burada sabitler yerine değişkenler kullanmayı tercih ederim.)

Magento 2 API Arabirimleri

M2 otomatik olarak maruz bırakılan API uç noktaları hakkında bir bildirim var. REST / SOAP yöntemleri için kullanılan arabirimlerde her zaman FQN'ler kullanmalısınız.

Ek açıklamalar Magento Framework tarafından ayrıştırılır ve verilerin JSON veya XML'ye nasıl dönüştürüleceğini belirler.

Sınıf ithalatı (yani, sınıfın üzerindeki ifadeleri kullanın) uygulanmaz!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.