Wie überschreibe oder deaktiviere ich Kern-Plugins in Magento2?


14

Ich baue mit Magento2 einen Marktplatz auf. Aus diesem Grund muss ich in der Lage sein, die Bestellung des Kunden unter Verwendung der Kundenanmeldeinformationen des Verkäufers zu laden.

Das Problem dabei ist, dass Magento2 ein Plugin verwendet, um zu überprüfen, dass nur der Kunde dieser Bestellung (oder ein Administrator) die Bestellung laden kann.

In diesem Fall muss ich entweder das Plugin als Ganzes überschreiben oder die geschützte Methode überschreiben isAllowed(). Was kann ich tun, ohne den Kern zu verändern?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Sieht aus wie das:

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

Antworten:


23

1) Sie können das Plugin nach Namen deaktivieren. In deinem Fall 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>

Dann sollten Sie eine eigene Klasse erstellen, die die Magento-Plugin-Klasse erweitert. In der eigenen Klasse können Sie geschützte Methoden überschreiben.

2) Sie können es tun, ohne das Plugin zu löschen und neu zu erstellen:

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

Beispielcode Ihrer Plugin-Klasse:

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

Ich habe versucht, indem ich das Plugin im Ordner
webapi_rest überschreibe,

6

Wenn Sie die erste Lösung von sergei.ss verwenden, erhalten Sie den Fehler , dass Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Authorization doppelt vorhanden
ist.

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.