Magento 2 After plugin con parámetro

8

Estoy tratando de implementar después del complemento para el siguiente método.

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

Tenga en cuenta el $categoryparámetro pasado al método anterior.

Como resolución, he implementado el siguiente código.

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

Ahora, mi pregunta es: ¿cómo hago para que el $categoryparámetro pase el método principal a mi complemento? Solo quiero modificar el resultado en función del cierto valor en el $categoryobjeto.

Codrain Technolabs Pvt Ltd
fuente

Respuestas:

13

Si necesita parámetros de entrada y también es necesario para el cambio de salida, se debe utilizar un torno complemento, no una después de plugin:

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

En su caso, podría ser algo como esto:

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

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

   return $originalResult;
} 

Solo una nota:

Tenga en cuenta que si va a cambiar un comportamiento interno, una preferencia podría ser una mejor opción que un complemento . Depende de lo que vayas a hacer.

Phoenix128_RiccardoT
fuente
Solo quiero modificar el resultado.
Codrain Technolabs Pvt Ltd
Ver mi publicación actualizada.
Phoenix128_RiccardoT
Sí, eso (AroundPlugin) funciona, pero sería genial si pudiéramos lograr esto usando (AfterPlugin).
Codrain Technolabs Pvt Ltd
No hay forma con los complementos "después" ya que no está diseñado para funcionar de esta manera, lo que necesita solo se puede hacer con complementos "alrededor".
Phoenix128_RiccardoT
Gracias por su rápida respuesta. estoy bien con "alrededor" también
Codrain Technolabs Pvt Ltd
13

Desde Magento 2.2 es posible tener parámetros de entrada después del complemento

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.');
    }
}

Consulte la documentación de Magento para obtener detalles https://devdocs.magento.com/guides/v2.2/extension-dev-guide/plugins.html#after-methods

Alex
fuente