__Construct và _construct trong magento2 là gì?


21

Trong Magento 2, hầu hết các lớp đều có hai phương thức ( __construct_construct) cấu trúc này . sự khác biệt giữa chúng là gì?

Câu trả lời:


17

Tôi không hoàn toàn chắc chắn nếu nó đã thay đổi giữa Magento 1 và Magento 2, có lẽ không vì vậy tôi sẽ đi với những gì tôi biết từ Magento 1.

Các _constructsẽ được gọi sau khi__construct

__constructPhương thức gốc PHP không nên được ghi đè hoặc sử dụng trong mã của bạn. Nếu bạn muốn thực thi mã theo cách an toàn khi bắt đầu sử dụng lớp _construct.

Magento sẽ sử dụng nguồn gốc __constructđể đảm bảo mọi thứ đều 'sẵn sàng' cho một lớp được sử dụng, chẳng hạn như xác định các thẻ bộ nhớ cache đúng cho một mô hình nhất định chẳng hạn.


15

Các _construct phương pháp là một "Varien phát minh" dùng để quấn một số logic khởi trong các mô hình, những người giúp đỡ và khối.

Vì vậy, việc thay đổi hoặc khai báo lại phương thức __construct () trong Mô hình / Khối hoặc Người trợ giúp của M1 là điều bất thường vì chúng tôi luôn sử dụng các nhà máy Magento. Tuy nhiên, không có bất kỳ vấn đề / thực tiễn xấu nào về việc sử dụng nó (nếu bạn quan tâm đến tính tương thích).

Trong M2, phương thức _construct () vẫn có trong một số phần và được sử dụng cho cùng mục đích, nhưng bây giờ (trong M2), tất cả logic DI được thực hiện bởi __constructor () vì vậy bạn sẽ tìm thấy rất nhiều khai báo cấu trúc trong cơ sở mã.

BTW không có nhiều nhà máy như Mage::getModel()ở M2.

Nói cách khác:

Phương thức _construct () được Magento triển khai trong một số lớp và nó được gọi tự động bên trong khai báo hàm __construct , vì vậy nếu bạn đang mở rộng một lớp Magento như Mô hình, bạn có thể sử dụng nó để thực hiện một số nội dung sau khi tạo đối tượng.

Trong Mô hình tài nguyên hoặc Lớp mô hình, bạn nên xác định một _construct()phương thức để xác định bảng và tệp chính_key

Mặt khác, __construct là một phương thức gốc của PHP (Tất cả các ngôn ngữ OO đều có một), __constructđược gọi mỗi khi bạn khởi tạo một đối tượng. Đó là tất cả

Thí dụ:

Magento \ Framework \ Model \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

Bạn có thể vui lòng cung cấp ví dụ?
zed Blackbeard

Trong M2? tôi có thể cải thiện câu trả lời để làm rõ hơn sự khác biệt, nhưng tôi không biết có cần một ví dụ không,
MauroNigrele

Tôi quan tâm đến ý kiến ​​của bạn về một cái gì đó liên quan đến DI và __construct (). Có vẻ như cái gọi là "DI logic" trong Magento2 được triển khai, dưới dạng chống mẫu, vì nó thực sự tạo ra khớp nối chặt chẽ. Chạy cập nhật trình soạn thảo, tùy thuộc vào số lượng mô-đun bên 3d bạn đã mở rộng với các mô-đun của mình, thường có thể dẫn đến cần gỡ lỗi, thêm tham số trong các hàm tạo, không thực sự được sử dụng trong các lớp con, chỉ để ứng dụng chạy. Không chắc chắn rằng nó thậm chí còn được gọi là "Tiêm phụ thuộc", nhưng neo phụ thuộc hoặc một cái gì đó ...
someGuyOnTheWeb
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.