DI & Mở rộng một khối trên Magento 2


15

Tôi dường như đang vật lộn để nắm bắt việc tiêm phụ thuộc Magento 2 với các khối, mỗi lần tôi cố gắng mở rộng một khối không phải là \ Magento \ Framework \ View \ Element \ Template tôi sẽ gặp lỗi.

Tôi muốn tạo một khối mở rộng lớp khối rất cơ bản của Magento \ Theme \ Block \ Html \ Header \ Logo - mọi thứ đều hoạt động tốt cho đến khi tôi thử tiêm phụ thuộc trong phương thức xây dựng:

<?php

namespace Creare\Test\Block\Header;

class Logo extends \Magento\Theme\Block\Html\Header\Logo
{

    protected $_creareHelper;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Creare\Seo\Helper\Data $creareHelper,
        array $data = []
    )
    {
        $this->_creareHelper = $creareHelper;
        parent::__construct($context, $data);
    }
}

Ngay khi tôi cố gắng tiêm lớp người trợ giúp của mình (hoặc bất cứ điều gì khác cho vấn đề đó, tôi nhận được một dấu vết ngăn xếp bắt đầu với lỗi sau:

Recoverable Error: Argument 2 passed to Magento\Theme\Block\Html\Header\Logo::__construct() must be an instance of Magento\MediaStorage\Helper\File\Storage\Database, array given, called in /Users/adammoss/PhpstormProjects/Magento2/app/code/Creare/Test/Block/Header/Logo.php on line 17 and defined in /Users/adammoss/PhpstormProjects/Magento2/app/code/Magento/Theme/Block/Html/Header/Logo.php on line 33

Nếu tôi thêm các phụ thuộc tương tự vào __construct của mình khi tệp tôi mở rộng từ nó hoạt động, nhưng chắc chắn đó là cách làm ngược lại như điểm kế thừa lớp là tôi có hấp thụ tất cả các phương thức và thuộc tính của cha mẹ không?

Tôi nghĩ rằng tôi chỉ cần một lời giải thích 101 cơ bản từ một người nào đó về việc mở rộng từ các lớp học và sử dụng DI với Magento 2. Bất kỳ trợ giúp nào cũng được đánh giá cao!


"Chắc chắn đó là một cách làm ngược lại" Đồng ý.
James

Câu trả lời:


19

Lớp bạn đang cố mở rộng có hàm tạo này:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    array $data = []
) {
    $this->_fileStorageHelper = $fileStorageHelper;
    parent::__construct($context, $data);
}

Vì vậy, bạn cần phải làm cho nhà xây dựng của bạn trông như thế này

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    \Creare\Seo\Helper\Data $creareHelper,
    array $data = []
)
{
    $this->_creareHelper = $creareHelper;
    parent::__construct($context, $fileStorageHelper, $data);
}

Kết luận ...
Trong các lớp con bạn, bạn cần chỉ định tất cả các tham số hàm tạo của lớp cha cộng với các tham số mới của bạn. Tôi không nghĩ thứ tự là quan trọng và tôi không biết thực hành tốt nhất là gì.
Sau đó, trong hàm tạo, bạn gán các đối tượng được chèn mới của mình vào các vars thành viên và gọi hàm tạo cha mẹ với cùng số lượng tham số mà nó yêu cầu.


2
Điều đó có ý nghĩa cảm ơn cho câu trả lời của bạn. Tôi đoán tôi chỉ hy vọng nó thanh lịch hơn thế.
Adam Moss

Thứ tự @Marius của các đối số cần giống như lớp cha __construct đối số phương thức, đối số tùy chỉnh của bạn cần phải vượt qua ở cuối.
chirag dodia

@chiragdodia Tại sao? Tôi không nghĩ vậy. Mọi thứ tôi xây dựng cho đến nay trên M2 tôi đã xây dựng bằng cách sử dụng các đối số xây dựng tùy chỉnh được thêm ngẫu nhiên. Va no đa hoạt động. ràng buộc duy nhất là các đối số có giá trị mặc định sẽ đi sau cùng.
Marius

@Marius có, nó hoạt động trong một số trường hợp nhưng trong trường hợp của tôi khi tôi mở rộng \ Magento \ Catalog \ Block \ Product \ Xem nó không hoạt động, tôi cần phải tạo ra thứ tự các đối số như trong hàm tạo cha mẹ và thêm đối số tùy chỉnh cuối cùng. Hãy xem mã của tôi ở đây magento.stackexchange.com/questions/95697/ Đổi
chirag dodia

Nó không hoạt động đối với tôi khi tôi cố ghi đè \ Magento \ Khách hàng \ Khối \ Biểu mẫu \ Đăng ký khối
DEEP JOSHI
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.