Comment remplacer ou désactiver les plugins principaux dans Magento2?

14

Je crée une place de marché en utilisant Magento2. Pour cette raison, je dois être en mesure de charger la commande du client à l'aide des informations d'identification client du fournisseur.

Le problème avec cela est que Magento2 utilise un plugin pour vérifier que seul le client de cette commande (ou un administrateur) peut charger la commande.

Dans ce cas, je dois remplacer le plugin dans son ensemble ou remplacer la méthode protégée isAllowed(). Que puis-je faire sans modifier le noyau?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Ressemble à ça:

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;
    }
}
awavi
la source

Réponses:

23

1) Vous pouvez désactiver le plugin par son nom. Dans votre cas, ça 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>

Ensuite, vous devez créer votre propre classe, qui étendra la classe du plugin magento. Dans sa propre classe, vous pouvez remplacer la méthode protégée.

2) Vous pouvez le faire sans supprimer et recréer le 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>

Exemple de code de votre classe de 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
    }
}
sergei.sss
la source
j'ai essayé en surchargeant le plugin dans le dossier webapi_rest mais cela ne fonctionne pas
bhargav shastri
6

Si vous utilisez la première solution sergei.sss , vous obtiendrez l'erreur de Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Authorization en
double . La façon correcte de procéder est:

<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>
fudu
la source