Magento 2: sử dụng câu lệnh so với đường dẫn lớp trực tiếp?


14

Tôi có thể thiếu một điểm nhưng tôi chỉ tự hỏi tại sao đôi khi có một câu lệnh "sử dụng" cho một lớp cụ thể và đôi khi chúng ta không.

Ví dụ : app\code\Magento\Email\Model\Template.php, chúng tôi có ở đầu tệp:

namespace Magento\Email\Model;

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

Sau đó, trong __constructphương thức chúng ta có các tham số sau:

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

Vì vậy, chúng ta có thể thấy rõ rằng như chúng ta đã gọi use Magento\Store\Model\StoreManagerInterface;ở đầu lớp, chúng ta có thể thực hiện StoreManagerInterface $storeManagertrong các tham số của hàm tạo.

Câu hỏi của tôi là:

  • Tại sao chúng ta làm điều này chỉ cho một lớp?
  • Tại sao chúng ta không thể thêm một usecâu lệnh cho mỗi lớp của hàm tạo để chúng ta không phải nhập đường dẫn lớp đầy đủ?
  • Hoặc theo cách khác, tại sao chúng ta không loại bỏ usetuyên bố và nhập đường dẫn đầy đủ đến StoreManagerInterfacelớp?

Câu trả lời:


15

Không có lý do kỹ thuật nào để thích cái này hơn cái kia, ngoại trừ nếu có xung đột tên (như các lớp "Ngữ cảnh" khác nhau). Nhưng những điều đó có thể được giải quyết bằng bí danh và đó là điều tôi thường làm:

use Magento\Framework\Model\Context as ModelContext;

Tôi giả định rằng trong lõi, nhiều phương thức, đặc biệt là các hàm tạo, được tạo bởi các công cụ như công cụ chuyển đổi lúc đầu và sau đó không được thay đổi để sử dụng nhập "sử dụng".

Vì vậy, tôi đề nghị rằng trong mã của riêng bạn, bạn luôn nhập các lớp có "sử dụng" để làm cho mã thực tế ít dài dòng hơn và dễ đọc hơn.


Vì vậy, chỉ để làm rõ không có điểm nào nhóm nòng cốt được thêm vào usecho lớp cụ thể mà tôi đã chỉ đúng không?
Raphael tại Digital Pianism 14/03/2016

1
Không. Đối với tôi, có vẻ như nó đã được thêm vào sau này bởi một người sử dụng IDE tự động thêm các câu lệnh sử dụng khi sử dụng tự động hoàn thành.
Fabian Schmengler 14/03/2016

2

Việc sử dụng phụ thuộc vào tình hình cụ thể. Cách tiếp cận của tôi là:

Lớp được đề cập chỉ một lần trong một tệp - FQN

Để lại tên đầy đủ . Điều này cải thiện khả năng đọc vì bạn không cần phải xem lại phần sử dụng .

Tên lớp được sử dụng nhiều lần - nhập

Đặt nó trong một phần sử dụng . Điều này làm cho mã ngắn hơn trong đó lớp được đề cập.

Lớp được sử dụng một lần nhưng tôi cần một ký hiệu ngắn - nhập

Giải thích tốt hơn với một ví dụ.

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

nhập khẩu

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

Theo tôi ví dụ thứ 2 dễ đọc hơn. (Nhưng thành thật mà nói, tôi thích sử dụng các biến thay vì các hằng số ở đây để cung cấp cho nó dễ đọc hơn.)

Giao diện API Magento 2

Có một thông báo liên quan đến các điểm cuối API tiếp xúc tự động M2. Trong các giao diện được sử dụng cho các phương thức REST / SOAP, bạn phải luôn sử dụng FQN.

Các chú thích được phân tích cú pháp bởi Khung Magento để xác định cách chuyển đổi dữ liệu sang và từ JSON hoặc XML.

Nhập khẩu lớp (nghĩa là sử dụng các câu lệnh trên lớp) không được áp dụng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.