Magento 2 После плагина с параметром

8

Я пытаюсь реализовать после плагина к следующему способу.

public function getCategoryUrl($category)
{
    if ($category instanceof ModelCategory) {
        return $category->getUrl();
    }
    return $this->_categoryFactory->create()->setData($category->getData())->getUrl();
}

Обратите внимание на $categoryпараметр, переданный вышеуказанному методу.

В качестве разрешения я реализовал приведенный ниже код.

public function afterGetCategoryUrl(\Magento\Catalog\Helper\Category $subject, $result)
{
    return $result;
} 

Теперь мой вопрос: как мне $categoryпередать параметр, передаваемый в родительском методе, моему плагину? Я просто хочу изменить результат на основе определенного значения в $categoryобъекте.

Codrain Technolabs Pvt Ltd
источник

Ответы:

13

Если вам нужны входные параметры и вам также нужно изменить вывод, вы должны использовать плагин вокруг , а не плагин после :

public function aroundGetCategoryUrl(
    \Magento\Catalog\Helper\Category $subject,
    \Closure $proceed,
    $category
) {
   ...
   // Do your stuffs here, now you have $category
   // If you need you can call the original method with:
   // $proceed($category);
   ...
   return $something;
} 

В вашем случае это может быть что-то вроде этого:

public function aroundGetCategoryUrl(
    \Magento\Catalog\Helper\Category $subject,
    \Closure $proceed,
    $category
) {
   $originalResult = $proceed($category);

   if (...) {
      ...
      return $otherResult;
   }

   return $originalResult;
} 

Просто примечание:

Обратите внимание, что если вы собираетесь изменить внутреннее поведение, предпочтение может быть лучше, чем плагин . Это зависит от того, что вы собираетесь делать.

Phoenix128_RiccardoT
источник
Я просто хочу изменить результат.
Codrain Technolabs Pvt Ltd
Смотрите мой обновленный пост.
Phoenix128_RiccardoT
Да, это (AroundPlugin) работает, но было бы здорово, если бы мы могли добиться этого, используя (AfterPlugin).
Codrain Technolabs Pvt Ltd
С плагинами "after" нет никакого способа, так как он не предназначен для работы таким образом, что вам нужно сделать только с плагинами "вокруг".
Phoenix128_RiccardoT
Спасибо за ваш быстрый ответ. со
мной тоже все
13

Начиная с Magento 2.2 возможно иметь входные параметры после плагина

namespace My\Module\Plugin;

class AuthLogger
{
    private $logger;

    public function __construct(\Psr\Log\LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @param \Magento\Backend\Model\Auth $authModel
     * @param null $result
     * @param string $username
     * @return void
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function afterLogin(\Magento\Backend\Model\Auth $authModel, $result, $username)
    {
        $this->logger->debug('User ' . $username . ' signed in.');
    }
}

Подробности смотрите в документации Magento https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
источник