Có thể tiêm một phụ thuộc vào mô hình Magento 2 CRUD không?
Đó là - Magento 2 có một lớp mô hình trừu tượng cơ bản : Magento\Framework\Model\AbstractModel
. Nếu bạn muốn tạo một đối tượng đơn giản Tạo, Đọc, Cập nhật, Xóa mô hình, bạn mở rộng lớp này bằng lớp của riêng bạn.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Có thể có các phụ thuộc được tiêm trong __construct
phương thức mô hình của bạn không? Khi tôi cố gắng, cuối cùng tôi nhận được lỗi sau.
Lỗi nghiêm trọng: Không thể khởi tạo lớp trừu tượng Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Thủ phạm dường như AbstractModel
là __construct
phương pháp của.
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
Có hai gợi ý loại trong hàm tạo này ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) không phải là giao diện trình quản lý đối tượng Magento. Chúng là những lớp trừu tượng. Khi tôi mở rộng lớp này và cố gắng thêm phụ thuộc được tiêm của mình
class Foo extends Magento\Framework\Model\AbstractModel
{
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
\Package\Module\Model\Mine $mine,
) {
//...
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
}
}
Magento bảo lãnh khi người quản lý đối tượng cố gắng khởi tạo các lớp trừu tượng.
Tôi có thể "sửa" điều này bằng cách di chuyển phụ thuộc đối tượng của mình vào trước các lớp trừu tượng
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Package\Module\Model\Mine $mine,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
) {
Tuy nhiên, điều này đã thay đổi thứ tự đối số. Trong một lớp được quản lý hoàn toàn đối tượng, điều này sẽ không thành vấn đề. Tuy nhiên, thực tế là các gợi ý loại lớp trừu tượng này tồn tại ngụ ý có những phần của hệ thống Magento sẽ thủ công (tức là không thông qua trình quản lý đối tượng hoặc DI) khởi tạo các đối tượng CRUD và truyền vào các đối tượng phù hợp với gợi ý loại theo thứ tự cụ thể đó .
Cái này có an toàn không? tức là các lớp trừu tượng này trong hàm tạo của mô hình trừu tượng chỉ là mã kế thừa và không được sử dụng? Hoặc các bộ phận của hệ thống vẫn sẽ sử dụng những thứ này, có nghĩa là không thể đưa các phụ thuộc vào mô hình CRUD?