Magento 2: use statement versus direct class path?

14

Vielleicht fehlt mir ein Punkt, aber ich frage mich nur, warum es manchmal eine "use" -Anweisung für eine bestimmte Klasse gibt und manchmal nicht.

Beispiel: app\code\Magento\Email\Model\Template.phpWir haben am Anfang der Datei:

namespace Magento\Email\Model;

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

Dann __constructhaben wir in der Methode die folgenden Parameter:

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 = []
)

Wir können also klar erkennen, dass wir use Magento\Store\Model\StoreManagerInterface;dies StoreManagerInterface $storeManagerin den Konstruktorparametern tun können, als wir oben in der Klasse aufgerufen haben .

Meine Fragen sind:

  • Warum machen wir das nur für eine Klasse?
  • Warum können wir nicht usefür jede Klasse des Konstruktors eine Anweisung hinzufügen, sodass wir nicht den vollständigen Klassenpfad eingeben müssen?
  • Oder umgekehrt, warum werden wir die useAnweisung nicht los und geben den vollständigen Pfad zur StoreManagerInterfaceKlasse ein?
Raphael beim digitalen Pianismus
quelle

Antworten:

15

Es gibt keinen technischen Grund, den anderen vorzuziehen, es sei denn, es liegen Namenskonflikte vor (wie bei verschiedenen "Kontext" -Klassen). Aber diese können mit Aliasen gelöst werden und das mache ich normalerweise so:

use Magento\Framework\Model\Context as ModelContext;

Ich gehe davon aus, dass im Kern viele Methoden, insbesondere die Konstruktoren, zunächst von Tools wie dem Konvertierungstool generiert und später nicht geändert wurden, um Importe mit "use" zu verwenden.

Daher würde ich vorschlagen, dass Sie in Ihrem eigenen Code Klassen immer mit "use" importieren, um den tatsächlichen Code weniger ausführlich und besser lesbar zu machen.

Fabian Schmengler
quelle
Nur um zu verdeutlichen, gibt es keinen Grund, warum das Kernteam usefür die bestimmte Klasse, auf die ich hingewiesen habe, hinzugefügt wurde, oder?
Raphael bei Digital Pianism
1
Für mich sieht es so aus, als ob es später von jemandem hinzugefügt wurde, der eine IDE verwendet, die bei Verwendung der automatischen Vervollständigung automatisch use-Anweisungen hinzufügt.
Fabian Schmengler
2

Die Verwendung ist situationsabhängig. Mein Ansatz ist:

Klasse, die nur einmal in einer Datei erwähnt wurde - FQN

Hinterlassen Sie einen vollständig qualifizierten Namen . Dies verbessert die Lesbarkeit, da Sie den Abschnitt use nicht erneut lesen müssen .

Klassenname mehrfach verwendet - Import

Legen Sie es in einen Verwendungsabschnitt . Dadurch wird der Code dort, wo die Klasse erwähnt wird, kürzer.

Klasse einmal verwendet, aber ich brauche eine kurze Notation - Import

Besser mit einem Beispiel erklären.

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

importieren

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

Meiner Meinung nach ist das 2. Beispiel leichter zu lesen. (Aber ehrlich gesagt würde ich lieber Variablen anstelle von Konstanten verwenden, um die Lesbarkeit zu verbessern.)

Magento 2 API-Schnittstellen

Es gibt einen Hinweis zu automatisch freigegebenen M2-API-Endpunkten. In Schnittstellen, die für REST / SOAP-Methoden verwendet werden, sollten Sie immer FQNs verwenden.

Die Anmerkungen werden vom Magento Framework analysiert, um zu bestimmen, wie Daten in und aus JSON oder XML konvertiert werden.

Klassenimporte (dh Anweisungen über der Klasse verwenden) werden nicht angewendet!

Arkadij Kuzhel
quelle