findMultipleComponents($subnamespace, $componentTypeClass); foreach ($components as $class) { if ($class === $desiredComponentClass) { return new $class(); } } Log::debug("ComponentFactory::%s: Could not find requested component (args = ['%s', '%s', '%s']).", __FUNCTION__, $pluginName, $componentClassSimpleName, $componentTypeClass); return null; } /** * Finds a component instance that satisfies a given predicate. * * @param string $componentTypeClass The fully qualified class name of the component type, eg, * `"Piwik\Plugin\Report"`. * @param string $pluginName|false The name of the plugin the component is expected to belong to, * eg, `'DevicesDetection'`. * @param callback $predicate * @return mixed The component that satisfies $predicate or null if not found. */ public static function getComponentIf($componentTypeClass, $pluginName, $predicate) { $pluginManager = PluginManager::getInstance(); // get components to search through $subnamespace = $componentTypeClass::COMPONENT_SUBNAMESPACE; if (empty($pluginName)) { $components = $pluginManager->findMultipleComponents($subnamespace, $componentTypeClass); } else { $plugin = self::getActivatedPlugin(__FUNCTION__, $pluginName); if (empty($plugin)) { return null; } $components = $plugin->findMultipleComponents($subnamespace, $componentTypeClass); } // find component that satisfieds predicate foreach ($components as $class) { $component = new $class(); if ($predicate($component)) { return $component; } } Log::debug("ComponentFactory::%s: Could not find component that satisfies predicate (args = ['%s', '%s', '%s']).", __FUNCTION__, $componentTypeClass, $pluginName, get_class($predicate)); return null; } /** * @param string $function * @param string $pluginName * @return null|\Piwik\Plugin */ private static function getActivatedPlugin($function, $pluginName) { $pluginManager = PluginManager::getInstance(); try { if (!$pluginManager->isPluginActivated($pluginName)) { Log::debug("ComponentFactory::%s: component for deactivated plugin ('%s') requested.", $function, $pluginName); return null; } return $pluginManager->getLoadedPlugin($pluginName); } catch (Exception $e) { Log::debug($e); return null; } } }