Jak zastąpić lub wyłączyć podstawowe wtyczki w Magento2?

15

Buduję rynek za pomocą Magento2. Z tego powodu muszę mieć możliwość załadowania zamówienia klienta przy użyciu poświadczeń klienta dostawcy.

Problem polega na tym, że Magento2 używa wtyczki do sprawdzenia, czy tylko klient tego zamówienia (lub administrator) może załadować zamówienie.

W takim przypadku muszę zastąpić wtyczkę jako całość lub zastąpić chronioną metodę isAllowed(). Co mogę zrobić bez modyfikacji rdzenia?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Wygląda tak:

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
źródło

Odpowiedzi:

23

1) Możesz wyłączyć wtyczkę według nazwy. W twoim przypadku to 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>

Następnie powinieneś stworzyć własną klasę, która rozszerzy klasę wtyczek magento. We własnej klasie możesz zastąpić chronioną metodę.

2) Możesz to zrobić bez usuwania i ponownego tworzenia wtyczki:

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

Przykładowy kod twojej klasy wtyczek:

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
źródło
próbowałem, zastępując wtyczkę w folderze webapi_rest, ale nie działa
bhargav shastri 17.01.19
6

Jeśli użyjesz 1. rozwiązania sergei.sss , pojawi się błąd duplikatu Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Autoryzacja
Prawidłowym sposobem jest:

<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
źródło