Magento2 dał bardzo dobrą koncepcję o nazwie Plugin
możemy zrobić to, co kiedykolwiek po i przed funkcją podstawową, a także mamy jeszcze jedną wywoływaną wokół, która zrobi zarówno przed, jak i poniżej, kod, który obejmie wszystkie informacje
Utwórz plik di.xml w Mymodule / etc / di.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Block\Product\View">
<plugin name="inroduct-custom-module" type="Sugarcode\Test\Block\Plugin\Product\View" sortOrder="1"/>
</type>
<type name="Magento\Catalog\Model\Product">
<plugin name="getname-test-module" type="Sugarcode\Test\Model\Plugin\Product" sortOrder="10"/>
</type>
</config>
w tym wziąłem przykład modelu produktu i bloku widoku produktu
Użyłem w bloku widoku produktu, który jest dowolną funkcją, użyj prefiksu wokół, a następnie upewnij się, że 2 parametr powinien być pierwszy, który to obiekt, którego używasz 2. zamknięcie, które zachowuje stare informacje o zwrocie
<?php
namespace Sugarcode\Test\Block\Plugin\Product;
class View
{
public function aroundGetProduct(\Magento\Catalog\Block\Product\View $subject, \Closure $proceed)
{
echo 'Do Some Logic Before <br>';
$returnValue = $proceed(); // it get you old function return value
//$name='#'.$returnValue->getName().'#';
//$returnValue->setName($name);
echo 'Do Some Logic After <br>';
return $returnValue; // if its object make sure it return same object which you addition data
}
}
W modelu i używany przed i po nim jest
<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Sugarcode\Test\Model\Plugin;
class Product
{
public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
{
return array('(' . $name . ')');
}
public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
{
return '|' . $result . '|';
}
}
w ten sposób możemy zachować stary kod, więc jeśli jutro podstawowy kod Magento zostanie zaktualizowany, będziemy mieli zarówno nowy zaktualizowany kod, jak i naszą niestandardową logikę, jeśli bezpośrednio zastąpimy, stracimy nowy zaktualizowany kod tej funkcji lub pliku :-)
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html