Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
CRAP
62.79% covered (warning)
62.79%
27 / 43
ServiceFactory
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
40.61
62.79% covered (warning)
62.79%
27 / 43
 __invoke
0.00% covered (danger)
0.00%
0 / 1
40.61
62.79% covered (warning)
62.79%
27 / 43
<?php
namespace AssetsBundle\Factory;
class ServiceFactory implements \Zend\ServiceManager\Factory\FactoryInterface
{
    /**
     * @see \Zend\ServiceManager\Factory\FactoryInterface::__invoke()
     * @param \Interop\Container\ContainerInterface $oServiceLocator
     * @param string $sRequestedName
     * @param array $aOptions
     * @throws \UnexpectedValueException
     * @return \AssetsBundle\Service\Service
     */
    public function __invoke(\Interop\Container\ContainerInterface $oServiceLocator, $sRequestedName, array $aOptions = null)
    {
        $aConfiguration = $oServiceLocator->get('Config');
        if (!isset($aConfiguration['assets_bundle'])) {
            throw new \UnexpectedValueException('AssetsBundle configuration is undefined');
        }
        // Initialize AssetsBundle service with options
        $oAssetsBundleService = new \AssetsBundle\Service\Service($oServiceLocator->get('AssetsBundleServiceOptions'));
        // Retrieve filters
        if (isset($aConfiguration['assets_bundle']['filters'])) {
            $aFilters = $aConfiguration['assets_bundle']['filters'];
            if ($aFilters instanceof \Traversable) {
                $aFilters = \Zend\Stdlib\ArrayUtils::iteratorToArray($aFilters);
            } elseif (!is_array($aFilters)) {
                throw new \InvalidArgumentException('Assets bundle "filters" option expects an array or Traversable object; received "' . (is_object($aFilters) ? get_class($aFilters) : gettype($aFilters)) . '"');
            }
            
            $oAssetFilesManager = $oAssetsBundleService->getAssetFilesManager();
            if (!$oAssetFilesManager->hasAssetFileFiltersManager()) {
                $oAssetFileFiltersManager = new \AssetsBundle\AssetFile\AssetFileFiltersManager($oServiceLocator);
                $oAssetFilesManager->setAssetFileFiltersManager($oAssetFileFiltersManager);
            }
            $oAssetFileFiltersManager = $oAssetFilesManager->getAssetFileFiltersManager();
            foreach ($aFilters as $sFilterAliasName => $oFilter) {
                if ($oFilter === null) {
                    continue;
                }
                if ($oFilter instanceof \AssetsBundle\AssetFile\AssetFileFilter\AssetFileFilterInterface) {
                    $oAssetFileFiltersManager->setService($oFilter->getFilterName(), $oFilter);
                    continue;
                }
                if (is_string($oFilter)) {
                    $sFilterName = $oFilter;
                    $oFilter = array();
                } else {
                    if ($oFilter instanceof \Traversable) {
                        $oFilter = \Zend\Stdlib\ArrayUtils::iteratorToArray($oFilter);
                    }
                    if (is_array($oFilter)) {
                        if (isset($oFilter['filter_name'])) {
                            $sFilterName = $oFilter['filter_name'];
                            unset($oFilter['filter_name']);
                        }
                    } elseif (!is_array($oFilter)) {
                        throw new \InvalidArgumentException('Filter expect expects a string, an array or Traversable object; received "' . (is_object($oFilter) ? get_class($oFilter) : gettype($oFilter)) . '"');
                    }
                }
                //Retrieve filter
                if ($oServiceLocator->has($sFilterName)) {
                    $oFilter = $oServiceLocator->get($sFilterName);
                } elseif (class_exists($sFilterName)) {
                    $oFilter = new $sFilterName($oFilter);
                } else {
                    throw new \InvalidArgumentException('Filter "' . $sFilterName . '" is not an available service or an existing class');
                }
                if ($oFilter instanceof \AssetsBundle\AssetFile\AssetFileFilter\AssetFileFilterInterface) {
                    $oAssetFileFiltersManager->setService($sAssetFileFilterName = $oFilter->getAssetFileFilterName(), $oFilter);
                    if (!$oAssetFileFiltersManager->has($sFilterAliasName)) {
                        $oAssetFileFiltersManager->setAlias($sFilterAliasName, $sAssetFileFilterName);
                    }
                } else {
                    throw new \InvalidArgumentException('Filter expects an instance of \AssetsBundle\AssetFile\AssetFileFilter\AssetFileFilterInterface, "' . get_class($oFilter) . '" given');
                }
            }
        }
        return $oAssetsBundleService;
    }
}