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.

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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.