Plugin cho ma thuật / setters


9

Tôi đang cố gắng để làm cho trạng thái của một đánh giá approvedthay vì pendingkhi người dùng đăng nó ở frontend trong Magento 2.
Và tôi đã thực hiện phương pháp này. Tạo một plugin trước, chỉ có sẵn trong khu vực lối vào, cho phương thức setStatusIdcho giao Magento\Review\Model\Reviewdiện giống như thế này

public function beforeSetStatusId(\Magento\Review\Model\Review $review, $status)
{
    return [\Magento\Review\Model\Review::STATUS_APPROVED];
}

Nó nối với tôi như một ý tưởng tốt. Và nó sẽ hoạt động kể từ khi tôi trở lại trạng thái được phê duyệt. Phương thức thực tế sau đó nên chọn cái này làm tham số.
nhưng thật ngạc nhiên là nó không hoạt động.
Sau đó, tôi đã đào lên và thấy rằng phương thức setStatusIdnày không tồn tại trong mô hình đánh giá. Nó được gọi một cách kỳ diệu và nó thực sự chạy setData('status_id', $status).
Tôi đã xem xét trong phần đánh chặn được tạo và thực sự không có setStatusIdphương pháp nào.

Làm cách nào tôi có thể bổ sung các getters / setters ma thuật trong magento 2? Điều đó thậm chí có thể?

Lưu ý: Tôi không cần một giải pháp để thực hiện đánh giá tự động. Tôi biết tôi có thể thực hiện các phương pháp khác, như các save_beforesự kiện. Điều này không quan trọng bây giờ.

Câu trả lời:


14

Điều đó thậm chí có thể?

Đúng.

Làm cách nào tôi có thể bổ sung các getters / setters ma thuật trong magento 2?

Theo cách tương tự như một phương pháp công cộng khác. Bạn cần khai báo plugin trong di.xmlcấu hình và thêm mã tùy chỉnh trong plugin.

public function before__call(\Magento\Review\Model\Review $review, $method, $args)
{
    if ($method == 'setStatusId') {
        if (isset($args[0])) {
            $args[0] = \Magento\Review\Model\Review::STATUS_APPROVED;
            return [$method, $args];
        }
    }
    //leave everything unchanged
    return null;
}

Nhưng việc bổ sung các lớp DTO không phải là ý kiến ​​hay. Cố gắng tùy chỉnh các bộ điều khiển / dịch vụ phù hợp để sửa đổi hành vi ứng dụng và không thêm plugin trên đối tượng DTO. Tùy chỉnh này sẽ phá hủy các lớp ứng dụng . Tôi hiểu rằng bạn đang sử dụng một cách nhanh chóng và dễ dàng nhất, nhưng trong một số trường hợp, đó là chiến lược sai.


Tôi đồng ý với bạn về tùy biến. Đây chỉ là một bằng chứng về khái niệm.
Marius

@Marius yeah, tuyệt
Tối

Tôi đã thực hiện phương pháp này, nhưng điều này sẽ thất bại khi / nếu mô-đun đánh giá được tái cấu trúc để sử dụng các hợp đồng dịch vụ. Bây giờ thì ổn rồi. Cảm ơn.
Marius

vâng, chắc chắn, nhưng câu hỏi của bạn là "Làm thế nào tôi có thể bổ sung các getters / setters ma thuật trong magento 2? Điều đó thậm chí có thể không?". Tùy chọn tốt nhất sẽ chỉ sử dụng các plugin cho các phương thức và dịch vụ api công cộng, nhưng trong một số mô-đun magento không có bất kỳ API nào hoặc nó kém.
Tối đa

4

Tôi đã từng có một vấn đề tương tự. Tôi đã kết thúc với việc bổ sung -method setData(), mặc dù theo ý kiến ​​của tôi, nó tạo ra một sự lãng phí tài nguyên to lớn ... :-(


Đồng ý. đây là một cách tiếp cận làm việc +1. Nhưng tôi hy vọng cho lựa chọn sạch hơn (với điều kiện là có một).
Marius

Tôi hy vọng như vậy. Tôi vẫn khóc mỗi đêm vì bản sửa lỗi này trông rất bẩn. Tôi nghĩ rằng toàn bộ lý do vẫn còn các phương pháp ma thuật là do mã kế thừa của Magento 1. Tôi nghĩ rằng chừng nào mô hình đánh giá chưa được tái cấu trúc thành mô hình dữ liệu thì bạn không gặp may cho mô hình dữ liệu này.
Giel Berkers

Tôi nhận ra rằng đó là vì mã di sản. Và tôi đã học được một bài học tốt từ điều này. Đừng dựa vào ma thuật cho các mô-đun CRUD tùy chỉnh.
Marius

Tôi đã sử dụng cách tiếp cận được Max giải thích ở đây chủ yếu vì plugin của tôi sẽ chỉ được gọi khi một trình thiết lập ma thuật được gọi và không phải cho tất cả các setDatacuộc gọi. Nó không hoàn hảo nhưng tốt hơn một chút so với sử dụng setData. Có lẽ bạn cũng có thể thay đổi cách tiếp cận của mình và ngủ ngon hơn một chút vào ban đêm. :)
Marius
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.