Come sovrascrivere o disabilitare i plugin principali in Magento2?


14

Sto costruendo un marketplace usando Magento2. Per tale motivo, devo essere in grado di caricare l'ordine del cliente utilizzando le credenziali del cliente del fornitore.

Il problema è che Magento2 utilizza un plugin per verificare che solo il cliente di questo ordine (o un amministratore) possa caricare l'ordine.

In questo caso, ho bisogno di sovrascrivere il Plugin nel suo insieme o di ignorare il metodo protetto isAllowed(). Cosa posso fare senza modificare il core?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Somiglia a questo:

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

Risposte:


23

1) Puoi disabilitare il plugin per nome. Nel tuo caso 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>

Quindi dovresti creare la tua classe, che estenderà la classe del plugin magento. Nella propria classe è possibile sovrascrivere il metodo protetto.

2) Puoi farlo senza cancellare e ricreare 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>

Codice di esempio della tua classe di plugin:

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

ho provato sovrascrivendo il plugin all'interno della cartella webapi_rest ma non funziona
bhargav shastri

6

Se usi la prima soluzione sergei.sss , otterrai l'errore di Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Authorization duplicato
Il modo corretto per farlo è:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.