Example #1
0
 /**
  * Invoke next plugin in chain
  *
  * @param string $type
  * @param string $method
  * @param string $previousPluginCode
  * @param InterceptorInterface $subject
  * @param array $arguments
  * @return mixed|void
  */
 public function invokeNext($type, $method, InterceptorInterface $subject, array $arguments, $previousPluginCode = null)
 {
     $pluginInfo = $this->pluginList->getNext($type, $method, $previousPluginCode);
     $capMethod = ucfirst($method);
     $result = null;
     if (isset($pluginInfo[DefinitionInterface::LISTENER_BEFORE])) {
         foreach ($pluginInfo[DefinitionInterface::LISTENER_BEFORE] as $code) {
             $beforeResult = call_user_func_array([$this->pluginList->getPlugin($type, $code), 'before' . $capMethod], array_merge([$subject], $arguments));
             if ($beforeResult) {
                 $arguments = $beforeResult;
             }
         }
     }
     if (isset($pluginInfo[DefinitionInterface::LISTENER_AROUND])) {
         $chain = $this;
         $code = $pluginInfo[DefinitionInterface::LISTENER_AROUND];
         $next = function () use($chain, $type, $method, $subject, $code) {
             return $chain->invokeNext($type, $method, $subject, func_get_args(), $code);
         };
         $result = call_user_func_array([$this->pluginList->getPlugin($type, $code), 'around' . $capMethod], array_merge([$subject, $next], $arguments));
     } else {
         $result = $subject->___callParent($method, $arguments);
     }
     if (isset($pluginInfo[DefinitionInterface::LISTENER_AFTER])) {
         foreach ($pluginInfo[DefinitionInterface::LISTENER_AFTER] as $code) {
             $result = $this->pluginList->getPlugin($type, $code)->{'after' . $capMethod}($subject, $result);
         }
     }
     return $result;
 }
 /**
  * Calls plugins for a given method.
  *
  * @param string $method
  * @param array $arguments
  * @param array $pluginInfo
  * @return mixed|null
  */
 protected function ___callPlugins($method, array $arguments, array $pluginInfo)
 {
     $capMethod = ucfirst($method);
     $result = null;
     if (isset($pluginInfo[DefinitionInterface::LISTENER_BEFORE])) {
         // Call 'before' listeners
         foreach ($pluginInfo[DefinitionInterface::LISTENER_BEFORE] as $code) {
             $beforeResult = call_user_func_array(
                 [$this->pluginList->getPlugin($this->subjectType, $code), 'before'. $capMethod],
                 array_merge([$this], $arguments)
             );
             if ($beforeResult) {
                 $arguments = $beforeResult;
             }
         }
     }
     if (isset($pluginInfo[DefinitionInterface::LISTENER_AROUND])) {
         // Call 'around' listener
         $chain = $this->chain;
         $type = $this->subjectType;
         /** @var \Magento\Framework\Interception\InterceptorInterface $subject */
         $subject = $this;
         $code = $pluginInfo[DefinitionInterface::LISTENER_AROUND];
         $next = function () use ($chain, $type, $method, $subject, $code) {
             return $chain->invokeNext($type, $method, $subject, func_get_args(), $code);
         };
         $result = call_user_func_array(
             [$this->pluginList->getPlugin($this->subjectType, $code), 'around' . $capMethod],
             array_merge([$this, $next], $arguments)
         );
     } else {
         // Call original method
         $result = call_user_func_array(['parent', $method], $arguments);
     }
     if (isset($pluginInfo[DefinitionInterface::LISTENER_AFTER])) {
         // Call 'after' listeners
         foreach ($pluginInfo[DefinitionInterface::LISTENER_AFTER] as $code) {
             $result = $this->pluginList->getPlugin($this->subjectType, $code)
                 ->{'after' . $capMethod}($this, $result);
         }
     }
     return $result;
 }