Làm cách nào để ghi đè hoặc vô hiệu hóa các Plugin lõi trong Magento2?


14

Tôi đang xây dựng một thị trường bằng Magento2. Vì lý do đó, tôi cần có thể tải đơn đặt hàng của khách hàng bằng thông tin xác thực khách hàng của nhà cung cấp.

Vấn đề với điều này là Magento2 sử dụng Plugin để xác minh rằng chỉ Khách hàng của đơn hàng này (hoặc Quản trị viên) mới có thể tải đơn hàng.

Trong trường hợp này, tôi cần ghi đè toàn bộ Plugin hoặc ghi đè phương thức được bảo vệ isAllowed(). Tôi có thể làm gì mà không sửa đổi lõi?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Trông như thế này:

use Magento\Authorization\Model\UserContextInterface;
use Magento\Framework\Exception\NoSuchEntityException;
class Authorization
{
    /**
     * @var UserContextInterface
     */
    protected $userContext;

    /**
     * @param UserContextInterface $userContext
     */
    public function __construct(
        \Magento\Authorization\Model\UserContextInterface $userContext
    ) {
        $this->userContext = $userContext;
    }

    /**
     * Checks if order is allowed
     *
     * @param \Magento\Sales\Model\ResourceModel\Order $subject
     * @param callable $proceed
     * @param \Magento\Framework\Model\AbstractModel $order
     * @param mixed $value
     * @param null|string $field
     * @return \Magento\Sales\Model\Order
     * @throws NoSuchEntityException
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function aroundLoad(
        \Magento\Sales\Model\ResourceModel\Order $subject,
        \Closure $proceed,
        \Magento\Framework\Model\AbstractModel $order,
        $value,
        $field = null
    ) {
        $result = $proceed($order, $value, $field);
        if (!$this->isAllowed($order)) {
            throw NoSuchEntityException::singleField('orderId', $order->getId());
        }
        return $result;
    }

    /**
     * Checks if order is allowed for current customer
     *
     * @param \Magento\Sales\Model\Order $order
     * @return bool
     */
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
        return $this->userContext->getUserType() == UserContextInterface::USER_TYPE_CUSTOMER
            ? $order->getCustomerId() == $this->userContext->getUserId()
            : true;
    }
}

Câu trả lời:


23

1) Bạn có thể tắt plugin theo tên. Trong trường hợp của bạn nó authorization.

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
</type>
<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Sau đó, bạn nên tạo lớp riêng, sẽ mở rộng lớp plugin magento. Trong lớp riêng bạn có thể ghi đè lên phương thức được bảo vệ.

2) Bạn có thể làm điều đó mà không cần xóa và tạo lại plugin:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Mã mẫu của lớp plugin của bạn:

namespace Vendor\Name\Model\ResourceModel\Plugin\Sales\Order;
class Authorization extends \Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization
{
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
            ///You code here
    }
}

tôi đã thử bằng cách ghi đè plugin trong thư mục webapi_rest nhưng nó không hoạt động
bhargav shastri

6

Nếu bạn sử dụng giải pháp sergei.sss 1st, bạn sẽ gặp lỗi trùng lặp Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Authorization
Cách chính xác để làm điều đó là:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>
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.