Thêm một phương thức mới vào Lớp trừu tượng trong Magento 2


16

Giống như chủ đề này đã nói: Ghi đè lớp trừu tượng trong Magento 2 trong Magento 1 ,

Tôi chỉ có thể tạo một lớp hoàn toàn mới. Trong Magento 2, chúng ta cần sử dụng các plugin, nhưng các plugin chỉ cho phép tôi sửa đổi các phương thức tồn tại. Tôi phải làm gì nếu tôi muốn thêm một phương thức mới?

Thí dụ:

Lớp này vendor/magento/module-ui/Component/AbstractComponent.php, có một mảng các thành phần : $components, không có chức năng hủy / xóa các thành phần cho mảng đó. Vậy làm thế nào tôi có thể tạo chức năng đó?

Câu trả lời:


0

Tôi không thấy làm thế nào bạn có thể làm điều đó mà không hoàn toàn ghi đè lên lớp. Trong trường hợp ví dụ của bạn, bạn có thể vô hiệu hóa các thành phần riêng lẻ bằng cách đặt mục "bị vô hiệu hóa" thành đối số "dữ liệu" trong XML. Ví dụ:

<?xml version="1.0" encoding="UTF-8"?>

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="general">
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="disabled" xsi:type="boolean">true</item>
            </argument>
        </field>
    </fieldset>
</form>

Điều này có hiệu quả loại bỏ 'tiêu đề' khỏi $components mảng.

Điều này là do createChildComponentphương thức trong Magento\Framework\View\Element\UiComponentFactorylớp:

 protected function createChildComponent(
        array $bundleComponents,
        ContextInterface $renderContext,
        $identifier
    ) {
        list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
        if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
            return null;
        }
        $components = [];
        foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
            $children = $this->createChildComponent(
                $childrenData,
                $renderContext,
                $childrenIdentifier
            );
            $components[$childrenIdentifier] = $children;
        }
        $components = array_filter($components);
        $arguments['components'] = $components;
        if (!isset($arguments['context'])) {
            $arguments['context'] = $renderContext;
        }

        return $this->objectManager->create($className, $arguments);
    }

Đây không phải là thứ tôi đang tìm kiếm ... Tôi muốn một cách để thêm các phương thức mới vào một lớp Trừu tượng ... đây chỉ là một ví dụ ... ví dụ, nếu tôi muốn loại bỏ các phần tử một cách linh hoạt thì sao? Trong bình luận của bạn, bạn đề cập đến "hoàn thành ghi đè" làm thế nào bạn làm điều đó ??
Matias

Sau đó, bạn sẽ cần xác định các phương thức mới của mình trong một lớp mở rộng lớp trừu tượng và sau đó tạo các lớp cho các lớp con của lớp trừu tượng thay vì kế thừa từ lớp của bạn và đặt các tùy chọn trong di.xml. Đó là điều tôi muốn nói khi 'hoàn toàn lấn át cả lớp.' Tôi đã cố gắng đưa ra một ví dụ về cách tránh làm điều đó.
Aaron Allen

Vâng, tôi hiểu bạn ... nhưng giải pháp hoàn toàn không thể mở rộng ... Tôi không thể tin rằng M2 đã loại bỏ khả năng ghi đè các lớp trừu tượng ... Tôi nghĩ rằng họ sẽ cải thiện nó, thay vì loại bỏ nó .. .
Matias


0

quá tải một lớp trong M1 trong trình tải tự động thông qua thư mục cộng đồng hoặc cục bộ (như được đề xuất trong câu hỏi bạn đã liên kết) được coi là thực hành xấu ở M1 vì những lý do rất chính đáng.

Chủ yếu là bạn mất khả năng nâng cấp thể hiện Magento của mình nếu lớp gốc bị thay đổi ở những nơi, bạn đã không xem xét trong lớp quá tải của mình.

Trên thực tế, tôi không thể nghĩ ra bất kỳ usecase nào, nơi bạn thực sự cần thêm các phương thức vào một lớp trừu tượng, vì bạn luôn có thể thêm logic của riêng mình vào một lớp riêng, tích hợp nó trong một cấu hình plugin / observer / viewModel / xml

Cách tốt nhất là, giới thiệu một lớp mới mở rộng lớp trừu tượng cho trường hợp sử dụng cụ thể của bạn và sau đó sử dụng lớp của bạn khi cần thiết.

Nếu bạn cần xóa các thành phần khỏi Thành phần Ui, có thể có cách tốt hơn để thực hiện thông qua bố cục / plugin trên bộ xử lý bố cục / thay đổi tệp js yêu cầu.

Vì vậy, nếu bạn mô tả usecase cụ thể của bạn, có thể có một câu trả lời tốt hơn cho điều này.


Tôi biết, làm điều đó là một thực hành xấu, nhưng ít nhất, bạn có một cách để làm điều đó. Ví dụ, hãy xem xét trường hợp bạn muốn thêm bộ đệm cho mỗi mô hình duy nhất bạn tải. Điều này có thể được thực hiện bằng cách sửa đổi phương thức tải trong lớp trừu tượng và sau đó thay đổi này sẽ được truyền tới tất cả các lớp. Nếu bạn không có điều này, bạn phải sửa đổi từng mô hình bạn có, và điều đó hoàn toàn không thể mở rộng được.
Matias

Trường hợp sử dụng thứ hai, có thể là nếu bạn muốn thực hiện những gì tôi nói trong vé, bỏ đặt / xóa các phần tử khỏi mảng đó (xem xét như một ví dụ), bạn có thể nghĩ về bất cứ điều gì khác ... bạn cần tạo một chức năng mới trong lớp trừu tượng, nếu không, bạn sẽ buộc phải tạo cùng một hàm trong mỗi lớp mở rộng và điều đó một lần nữa không thể mở rộng được ... Và tệ nhất, bởi vì các biến trong lõi Magento là riêng tư thay vì được bảo vệ, vì vậy Cách duy nhất để làm điều đó là thêm một phương thức trong lớp trừu tượng ...
Matias

ví dụ đầu tiên hoàn toàn dễ dàng bằng cách chỉ cần thêm một plugin xung quanh vào mô hình trừu tượng và lưu trữ kết quả tải trên mỗi mô hình. Điều đó sẽ tốt hơn nhiều sau đó làm quá tải lớp trừu tượng sẽ phá vỡ mọi cập nhật trong tương lai nơi mô hình trừu tượng được thay đổi. Bạn "ví dụ" thứ hai tôi không thể nói cho bạn nhiều về, vì về cơ bản bạn hỏi chính xác về việc thêm một phương thức vào lớp trừu tượng, thay vì nói rõ trường hợp sử dụng thực tế của bạn
David Verholen

btw vẫn có thể có trong Magento2 vì bạn có thể điều khiển trình tải tự động của nhà soạn nhạc, nhưng rất nản lòng vì bạn sẽ gặp vấn đề với các bản cập nhật magento.stackexchange.com/questions/164455/ trộm
David Verholen

Đó không phải là một lựa chọn
Matias
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.