Magento2 में कोर प्लग को ओवरराइड या अक्षम कैसे करें?


15

मैं Magento2 का उपयोग करके एक बाज़ार का निर्माण कर रहा हूं। उस कारण से मुझे विक्रेता के ग्राहक क्रेडेंशियल्स का उपयोग करके ग्राहक के ऑर्डर को लोड करने में सक्षम होना चाहिए।

इसके साथ समस्या यह है कि Magento2 यह पुष्टि करने के लिए एक प्लगइन का उपयोग करता है कि केवल इस आदेश का ग्राहक (या कोई व्यवस्थापक) आदेश लोड कर सकता है।

इस मामले में मुझे या तो प्लगइन को पूरी तरह से ओवरराइड करना होगा, या संरक्षित विधि को ओवरराइड करना होगा isAllowed()। कोर को संशोधित किए बिना मैं क्या कर सकता हूं?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization इस तरह दिखता है:

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

जवाबों:


23

1) आप नाम से प्लगइन को निष्क्रिय कर सकते हैं। आपके मामले में 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>

फिर आपको खुद की क्लास बनानी चाहिए, जो मैगनेटो प्लगइन क्लास का विस्तार करेगी। स्वयं की कक्षा में आप संरक्षित पद्धति को अधिलेखित कर सकते हैं।

2) आप इसे बिना डिलीट और रीक्रिएट प्लगइन के कर सकते हैं:

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

आपके प्लगइन वर्ग का नमूना कोड:

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

मैं webapi_rest फ़ोल्डर के अंदर प्लगइन overriding द्वारा की कोशिश की है, लेकिन इसके काम नहीं कर रहा है
bhargav shastri

6

यदि आप 1 समाधान का उपयोग sergei.sss करते हैं, तो आपको डुप्लिकेट Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ प्राधिकरण
की त्रुटि मिलेगी यह करने का सही तरीका है:

<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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.