Bagaimana cara mengganti atau menonaktifkan Plugin inti di Magento2?


14

Saya membangun pasar menggunakan Magento2. Untuk alasan itu saya harus dapat memuat urutan pelanggan menggunakan kredensial pelanggan vendor.

Masalah dengan ini adalah bahwa Magento2 menggunakan Plugin untuk memverifikasi bahwa hanya Pelanggan pesanan ini (atau Admin) yang dapat memuat pesanan.

Dalam hal ini saya perlu mengganti Plugin secara keseluruhan, atau mengganti metode yang dilindungi isAllowed(). Apa yang bisa saya lakukan tanpa memodifikasi inti?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Terlihat seperti ini:

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;
    }
}

Jawaban:


23

1) Anda dapat menonaktifkan plugin dengan nama. Dalam kasus Anda itu 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>

Maka Anda harus membuat kelas sendiri, yang akan memperpanjang kelas plugin magento. Di kelas sendiri Anda dapat menimpa metode yang dilindungi.

2) Anda dapat melakukannya tanpa menghapus dan membuat ulang 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>

Kode contoh kelas plugin Anda:

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
    }
}

saya telah mencoba dengan menimpa plugin di dalam folder webapi_rest tetapi tidak berfungsi
bhargav shastri

6

Jika Anda menggunakan solusi pertama sergei.sss , Anda akan mendapatkan kesalahan duplikat Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Otorisasi
Cara yang benar untuk melakukannya adalah:

<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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.