Người trợ giúp tức thì trong Magento 2


26

Các bản dựng mới nhất của Magento 2 đã bỏ đi với Magelớp. Điều này có nghĩa là chúng tôi đã mất Mage::helperphương pháp.

Có một kỹ thuật thay thế (nhà máy trợ giúp không?) Cho người trợ giúp khởi tạo trong Magento 2? Hoặc chúng tôi dự kiến ​​sẽ sử dụng lớp Trình quản lý đối tượng mới và chỉ khởi tạo trình trợ giúp dưới dạng một đối tượng đơn lẻ / được lưu trong bộ nhớ cache với get(vs. create)

Câu trả lời:


31

Tôi thấy bạn đã đến đúng giải pháp, chỉ muốn tóm tắt.

Trình xây dựng nên được sử dụng để lấy trình trợ giúp (hoặc bất kỳ trường hợp nào khác) trong bất kỳ lớp nào bạn cần:

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

Lưu ý rằng không có nhận xét phpDoc nào được yêu cầu , Magento sẽ đọc chữ ký của nhà xây dựng trực tiếp để tìm ra những phụ thuộc nào được yêu cầu.

\ Magento \ Core \ Helper \ Factory chỉ nên được sử dụng trong những trường hợp hiếm hoi đó khi bạn phải gọi nhiều người trợ giúp hoặc bạn không biết chính xác mình cần cái nào.

Việc sử dụng Object Manager trực tiếp không được khuyến khích . Vì vậy, vui lòng tránh sử dụng:

\Magento\Core\Model\ObjectManager::getInstance()

Nó chỉ dành cho tuần tự hóa / giải tuần tự hóa.


không sử dụng tĩnh vì nó không thể được thử nghiệm với đơn vị PHP và vâng, nó không được khuyến khích. Tất cả phụ thuộc M2 được thực hiện thông qua các nhà xây dựng, và bởi Manager Object trong nội bộ quản lý, và sẽ lấy nó như Singleton Cũng không sử dụng _ để chỉ ra một tầm nhìn bất động sản, tất cả M2 đặt tên nên sử dụng camecase
PartySoft

@Anton Kril nếu chúng ta sử dụng helpertrong mẫu, như thế $this->helper('Magento\Catalog\Helper\Image'), nó có tuân theo thực tiễn tốt nhất không?
Khoa TruongDinh

2
Không nó không. Mẫu chỉ nên tham chiếu khối. Người trợ giúp nên tránh
Anton Kril

10

Có vẻ như mọi người khuyến khích Magento sử dụng hệ thống tiêm phụ thuộc tự động mới của họ để đưa người trợ giúp và mô hình vào các đối tượng thông qua hàm tạo của đối tượng.

Phiên bản ngắn? Nếu bạn có một đối tượng đó là khởi tạo bởi người quản lý đối tượng, trang trí một constructor với một PHPDoc@param , các thông số có một bộ kiểu gợi ý đúng đắn, người quản lý đối tượng sẽ tự động nhanh chóng các helper (hoặc, tôi tin rằng, các đối tượng khác) cho bạn.

Ví dụ, hàm tạo sau đây sẽ đưa trình trợ giúp dữ liệu lõi aa vào đối tượng.

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

Đây là câu trả lời đúng - điều tra tuyệt vời; không hoàn toàn rõ ràng đối với tôi ngay cả sau khi đào rất nhiều.
philwinkle

2
OK ... bây giờ đầu tôi đau ... rất nhiều. Bạn có nghĩa là chúng ta phải sử dụng PHPDoc để "viết" mã? Đây là sự điên rồ. Tôi thoát ra.
Marius

@Marius hahaha điều này không có gì lạ - blog của Alan giải thích nó ở một mức độ nào đó.
philwinkle

3
@philwinkle. Tôi đã đọc bài viết của anh ấy. Rất thú vị, nhưng tôi vẫn nói đây là sự điên rồ. Gọi tôi là lỗi thời, nhưng mã "trở lại trong thời đại của tôi" là mã và các bình luận là những thứ mà hầu như không ai bận tâm để viết.
Marius

Oh, và bằng cách này. +1. Câu hỏi hay và câu trả lời hay.
Marius

7

Ngoài tất cả các câu trả lời ở trên, nếu bạn phải sử dụng trình trợ giúp trong mẫu phtml, bạn có thể chỉ cần làm như thế này:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');

Tôi hy vọng nó hữu ích nếu ai đó không biết trước đó;)


6

Cách mà các trình trợ giúp được khởi tạo (ít nhất là cho mô-đun Backend (~ dev50) mới) thông qua helperFactory:

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

Mà thực chất chỉ là một loại chuyên dụng của một nhà máy kiểu mẫu. Ví dụ: Magento \ Core \ Block \ Context dòng 143 (dev50) là một phần của hàm tạo:

\Magento\Core\Model\Factory\Helper $helperFactory

Nhà máy trợ giúp sẽ trả về mô hình được yêu cầu dựa trên tên lớp và đảm bảo rằng đó là instanceoflớp trừu tượng của trình trợ giúp:

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

Nếu bạn tự thực hiện điều này thì có vẻ như lõi Magento đang tải nó theo một trong hai cách:

Cuộn nhà máy của riêng bạn:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

Hoặc chỉ cần lấy nó trực tiếp:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
+1 cho thông tin hữu ích, nhưng bạn có muốn khởi tạo trực tiếp nhà máy như vậy không? Hoặc một nhà máy trợ giúp duy nhất có thể được khởi tạo với Trình quản lý đối tượng dưới dạng một lớp được lưu trong bộ nhớ cache getkhông?
Alan Storm

Điều đó không hoàn toàn rõ ràng, bởi vì nhà máy trợ giúp được kế thừa từ \ Mage \ Core \ Block \ Tóm tắt - Tôi nghĩ rằng ý định là cung cấp nhà máy trợ giúp của riêng bạn. Nó không giống như họ đang cố tình tạo ra một singleton cho nhà máy, mặc dù.
philwinkle

Âm thanh như tôi cần / nguồn tốt nhất là theo dõi cách _rcperFactory được tiêm vào các đối tượng đó và xem cách nhóm cốt lõi khởi tạo nó.
Alan Storm

Tóm tắt đơn giản hóa của tôi là không chính xác cũng như hàm tạo yêu cầu một thể hiện của ObjectManager. Tôi sẽ chỉnh sửa trong giây lát.
philwinkle

Xem chỉnh sửa. Nó sẽ hoạt động - khó xác định tại thời điểm này vì môi trường vỏ cli của tôi không tải phiên bản cấu hình cửa hàng như mong đợi. Điều này là đủ để đưa bạn đi đúng hướng, mặc dù.
philwinkle

0

Hãy thử cách này

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

Việc sử dụng Object Manager trực tiếp không được khuyến khích.
sv3n

@ sv3n bạn có thể vui lòng giải thích, lý do là gì ?. Cảm ơn.
Thushan

1
Thay vào đó, sử dụng tốt hơn các mũi tiêm phụ thuộc ... đã trả lời ở đây chẳng hạn ... magento.stackexchange.com/questions/142352/ ích
sv3n
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.