Điều gì kích hoạt thế hệ của một nhà máy ở Magento 2


39

Magento 2 chứa một số tệp lớp được tạo trước hoặc được tạo nhanh chóng. Họ sông ở

var/generated

Các tệp được tạo này bao gồm các lớp nhà máy. Từ tài liệu này , tôi hiểu rằng một lập trình viên sử dụng các lớp của nhà máy để khởi tạo các đối tượng "không thể tiêm". Một đối tượng "không thể tiêm" là một đối tượng không thể được thêm vào thông qua __constructorviệc tiêm phụ thuộc, thường là vì nó yêu cầu người dùng nhập liệu để khởi tạo.

Điều không rõ ràng từ tài liệu này là làm thế nào Magento 2 biết nó cần để tạo ra một lớp nhà máy. Bit này

Nếu nhà máy không tồn tại gặp phải trình quản lý đối tượng trong chế độ thời gian chạy hoặc trình biên dịch, trình quản lý đối tượng sẽ tạo nhà máy.

làm cho nó nghe giống như nếu tôi sử dụng một lớp nhà máy trong trình quản lý đối tượng (hoặc, bằng phần mở rộng, trong phần phụ thuộc __constructor), Magento 2 sẽ tạo ra nó cho tôi. Nhưng làm thế nào để người quản lý đối tượng biết thứ tôi yêu cầu là một nhà máy?

Ngoài ra, dường như có hai lệnh để tự động tạo (hoặc "biên dịch") tất cả các lớp được tạo. Chạy một trong hai lệnh này sẽ tạo ra một số lượng lớn các lớp Factory. Những tệp cấu hình và / hoặc mã nào là những lệnh này đang xem xét để tạo các đối tượng nhà máy cần thiết?

Tôi biết rằng việc truy tìm trình quản lý đối tượng và / hoặc mã lệnh hoàn toàn sẽ tiết lộ điều này, nhưng tôi hy vọng sẽ tránh được hành trình dài và gian nan đó.

Câu trả lời:


21

Một số vị trí mã thú vị cho cách tất cả hoạt động cùng nhau: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

Với các loại khác nhau chủ yếu đến từ đây https://github.com/magento/magento2/tree/develop/lib/iternal/Magento/Framework/ObjectManager/Code/Generator nhưng cũng từ đây https://github.com/magento / magento2 / cây / phát triển / lib / nội bộ / Magento / Framework / Interception / Code / Generator cho mã Interception.

Tất cả được kích hoạt bởi trình tải tự động tại đây https://github.com/magento/magento2/blob/develop/lib/iternal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

Tôi không tìm thấy trong mã, các điều kiện mà các nhà máy được tạo ra, nhưng theo hiểu biết của tôi, một lớp nhà máy được tạo ra khi nó được yêu cầu và không được tìm thấy.
Có một số từ khóa dành riêng Factory, Proxy, Interceptor, nếu được sử dụng, sẽ kích hoạt tạo mã khi không tìm thấy các lớp cụ thể.
Tôi sẽ đăng lại ngay khi tôi tìm thấy mã kích hoạt thế hệ nhà máy.
Vì vậy, nếu bạn yêu cầu lớp Some\Namespace\HereFactoryvà lớp không tồn tại, bởi vì nó kết thúc bằng từ khóa, Factorynó sẽ được tạo trongvar/generation/Some/Namespace/HereFactory.php


Có vẻ như các tài liệu nên được cập nhật vì ObjectManager không thực sự là tài liệu tạo. Trình tải tự động đặc biệt là một phần của câu trả lời. github.com/magento/magento2/blob/develop/lib/iternal/Magento/ợi
Chris O'Toole

1
Điều đó phù hợp với kinh nghiệm của tôi (xem gist.github.com/astorm/f245ce9c761c9a8053aa), nhưng nó đưa ra câu hỏi 1. Điều này xảy ra ở đâu trong mã trình quản lý đối tượng (tức là quy ước thực tế) 2. Trình biên dịch / máy phát điện biết những gì các nhà máy để tạo ra?
Alan Storm

8

Tôi đang đào trong cùng súp đậu này ngay bây giờ. Sự hiểu biết của tôi cho đến nay là tất cả những thứ được tạo tự động /var/generationđược thực hiện từ các tùy chọn và giao diện được khai báo app/etc/di.xml.

Các giao diện và tùy chọn của bạn sẽ được khai báo trong di.xmltệp trong của bạn /app/code/Vendor/<module>/etc/di.xml.

Nó biết để tạo (các) đối tượng cho bạn vì bạn đã khai báo một giao diện trong __constructorAND của bạn đã khai báo một ưu tiên cho giao diện đó trên toàn cầu hoặc cục bộ trong di.xmltệp thích hợp .

Tôi cung cấp ba hạt muối với ý kiến ​​của tôi.


+1 cho thông tin hữu ích - nhưng có vẻ như Factories đến từ một nơi khác ngoài các di.xmltệp - bạn có thể gửi một cái gì đó vào trình quản lý đối tượng kết thúc trong Factory và nó sẽ tạo một tệp cho bạn.
Alan Storm

Không giúp đỡ à? bit.ly/1BOtdie
Steve Johnson
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.