顧名思義,after插件是在觀察到的方法之后運行的狱从。在編寫after插件時膨蛮,有幾個要點需要記住:
傳遞給插件的第一個參數(shù)是一個觀察到的類型實例季研。進入插件的第二個參數(shù)是觀察到的方法的結果敞葛,通常調用data)。
所有其他參數(shù)都是observe方法的參數(shù)与涡。插件必須返回相同類型的data變量惹谐,因為我們可以自由修改值讨盒。讓我們來看看Magento的一個插件后實現(xiàn)墅垮,該實現(xiàn)在模塊目錄/etc/di.xml文件中指定:
<type name="Magento\Indexer\Model\Config\Data">
<plugin name="indexerProductFlatConfigGet" type="Magento\Catalog\Model\Indexer\Product\Flat\Plugin\IndexerConfigData" />
</type>
此插件的原始目標方法是Magento\Indexer\Model\Config\Data類的get方法:
public function get($path = null, $default = null) { // The rest of the code... return $data;}
after插件的實現(xiàn)是通過Magento\Catalog\Model\Indexer\Product\Flat\plugin\IndexerConfigData類的afterGet方法提供的,如以下部分示例所示:
public function afterGet(Magento\Indexer\Model\Config\Data, $data, $path = null, $default = null) { // The rest of the code... return $data;}
使用插件時應特別小心廓鞠。雖然它們提供了很大的靈活性酌畜,但也很容易引發(fā)錯誤怎囚、性能瓶頸和其他不太明顯的不穩(wěn)定性——如果幾個插件都在觀察相同的方法,情況更是如此桥胞。