Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
50.00% covered (danger)
50.00%
4 / 8
CRAP
96.12% covered (success)
96.12%
99 / 103
ToolsService
0.00% covered (danger)
0.00%
0 / 1
50.00% covered (danger)
50.00%
4 / 8
26
96.12% covered (success)
96.12%
99 / 103
 renderAllAssets
100.00% covered (success)
100.00%
1 / 1
8
100.00% covered (success)
100.00%
59 / 59
 emptyCache
0.00% covered (danger)
0.00%
0 / 1
9
96.55% covered (success)
96.55%
28 / 29
 getConsole
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
2 / 3
 setConsole
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getMvcEvent
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
2 / 3
 setMvcEvent
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getAssetsBundleService
0.00% covered (danger)
0.00%
0 / 1
2.15
66.67% covered (warning)
66.67%
2 / 3
 setAssetsBundleService
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
<?php
namespace AssetsBundle\Service;
class ToolsService
{
    /**
     * @var \Zend\Console\Adapter\AdapterInterface
     */
    protected $console;
    /**
     * @var \Zend\Mvc\MvcEvent
     */
    protected $mvcEvent;
    /**
     * @var \AssetsBundle\Service\Service
     */
    protected $assetsBundleService;
    /**
     * @return \AssetsBundle\Service\ToolsService
     */
    public function renderAllAssets() : \AssetsBundle\Service\ToolsService
    {
        // Initialize AssetsBundle service
        $oAssetsBundleService = $this->getAssetsBundleService();
        $oAssetsBundleService->getOptions()->setRenderer(new \Zend\View\Renderer\PhpRenderer());
        // Start process
        $oConsole = $this->getConsole();
        $oConsole->writeLine('');
        $oConsole->writeLine('======================================================================', \Zend\Console\ColorInterface::WHITE);
        $oConsole->writeLine('Render all assets for ' . ($oAssetsBundleService->getOptions()->isProduction() ? 'production' : 'development'), \Zend\Console\ColorInterface::GREEN);
        $oConsole->writeLine('======================================================================', \Zend\Console\ColorInterface::WHITE);
        $oConsole->writeLine('');
        // Empty cache directory
        $this->emptyCache();
        $oConsole->writeLine('');
        $oConsole->writeLine('Start rendering assets : ', \Zend\Console\ColorInterface::GREEN);
        $oConsole->writeLine('-------------------------', \Zend\Console\ColorInterface::WHITE);
        $oConsole->writeLine('');
        $aUnwantedKeys = array_fill_keys(\AssetsBundle\AssetFile\AssetFile::ALL_ASSET_TYPES, true);
        
        // Retrieve MvcEvent
        $oMvcEvent = $this->getMvcEvent();
        // Reset route match and request
        $oMvcEvent->setRouteMatch(new \Zend\Router\RouteMatch(array()))->setRequest(new \Zend\Http\Request());
        // Retrieve AssetsBundle service options
        $oOptions = $oAssetsBundleService->getOptions();
        $aAssetsConfiguration = $oOptions->getAssets();
        // Render all assets
        foreach (array_diff_key($aAssetsConfiguration, $aUnwantedKeys) as $sModuleName => $aModuleConfig) {
            // Render module assets
            $oOptions->setModuleName($sModuleName);
            // If module has global assets
            if (array_intersect_key($aModuleConfig, $aUnwantedKeys)) {
                $oConsole->write(' * ', \Zend\Console\ColorInterface::WHITE);
                $oConsole->write('[' . $sModuleName . ']', \Zend\Console\ColorInterface::LIGHT_CYAN);
                $oConsole->write('[No controller]', \Zend\Console\ColorInterface::LIGHT_BLUE);
                $oConsole->write('[No action]' . PHP_EOL, \Zend\Console\ColorInterface::LIGHT_WHITE);
                // Render assets for no_controller and no_action
                $oOptions->setControllerName(\AssetsBundle\Service\ServiceOptions::NO_CONTROLLER)
                        ->setActionName(\AssetsBundle\Service\ServiceOptions::NO_ACTION);
                $oAssetsBundleService->renderAssets($oMvcEvent);
            }
            foreach (array_diff_key($aAssetsConfiguration[$sModuleName], $aUnwantedKeys) as $sControllerName => $aControllerConfig) {
                // Render controller assets
                $oOptions->setControllerName($sControllerName);
                // If controller has global assets
                if (array_intersect_key($aControllerConfig, $aUnwantedKeys)) {
                    $oConsole->write(' * ', \Zend\Console\ColorInterface::WHITE);
                    $oConsole->write('[' . $sModuleName . ']', \Zend\Console\ColorInterface::LIGHT_CYAN);
                    $oConsole->write('[' . $sControllerName . ']', \Zend\Console\ColorInterface::LIGHT_BLUE);
                    $oConsole->write('[No action]' . PHP_EOL, \Zend\Console\ColorInterface::LIGHT_WHITE);
                    // Render assets for no_action
                    $oOptions->setActionName(\AssetsBundle\Service\ServiceOptions::NO_ACTION);
                    $oAssetsBundleService->renderAssets($oMvcEvent);
                }
                foreach (array_diff_key($aAssetsConfiguration[$sModuleName][$sControllerName], $aUnwantedKeys) as $sActionName => $aActionConfig) {
                    // Render assets for action
                    if (array_intersect_key($aActionConfig, $aUnwantedKeys)) {
                        $oConsole->write(' * ', \Zend\Console\ColorInterface::WHITE);
                        $oConsole->write('[' . $sModuleName . ']', \Zend\Console\ColorInterface::LIGHT_CYAN);
                        $oConsole->write('[' . $sControllerName . ']', \Zend\Console\ColorInterface::LIGHT_BLUE);
                        $oConsole->write('[' . $sActionName . ']' . PHP_EOL, \Zend\Console\ColorInterface::LIGHT_WHITE);
                        $oAssetsBundleService->getOptions()->setActionName($sActionName);
                        $oAssetsBundleService->renderAssets($oMvcEvent);
                    }
                }
            }
        }
        //Render global assets
        $oConsole->write(' * ', \Zend\Console\ColorInterface::WHITE);
        $oConsole->write('[No module]', \Zend\Console\ColorInterface::LIGHT_CYAN);
        $oConsole->write('[No controller]', \Zend\Console\ColorInterface::LIGHT_BLUE);
        $oConsole->write('[No action]' . PHP_EOL, \Zend\Console\ColorInterface::LIGHT_WHITE);
        $oAssetsBundleService->getOptions()
                ->setModuleName(\AssetsBundle\Service\ServiceOptions::NO_MODULE)
                ->setControllerName(\AssetsBundle\Service\ServiceOptions::NO_CONTROLLER)
                ->setActionName(\AssetsBundle\Service\ServiceOptions::NO_ACTION);
        $oAssetsBundleService->renderAssets($oMvcEvent);
        $oConsole->writeLine('');
        $oConsole->writeLine('---------------', \Zend\Console\ColorInterface::WHITE);
        $oConsole->writeLine('Assets rendered', \Zend\Console\ColorInterface::GREEN);
        $oConsole->writeLine('');
        return $this;
    }
    /**
     * @param bool $bDisplayConsoleMessage
     * @return \AssetsBundle\Service\ToolsService
     */
    public function emptyCache(bool $bDisplayConsoleMessage = true) : \AssetsBundle\Service\ToolsService
    {
        if ($bDisplayConsoleMessage) {
            $oConsole = $this->getConsole();
            $oConsole->writeLine('');
            $oConsole->writeLine('========================', \Zend\Console\ColorInterface::WHITE);
            $oConsole->writeLine('Empty cache', \Zend\Console\ColorInterface::GREEN);
            $oConsole->writeLine('========================', \Zend\Console\ColorInterface::WHITE);
            $oConsole->writeLine('');
        }
        // Initialize AssetsBundle service
        $oAssetsBundleService = $this->getAssetsBundleService();
        // List directories to be emptied
        $aDirectories = array(
            'Cache' => $oAssetsBundleService->getOptions()->getCachePath(),
            'Config cache' => dirname($oAssetsBundleService->getAssetFilesManager()->getAssetFilesConfiguration()->getConfigurationFilePath()),
            'Tmp' => $oAssetsBundleService->getOptions()->getTmpDirPath(),
        );
        // Retrieve Asset File Filters cache directories
        $oAssetFileFiltersManager = $oAssetsBundleService->getAssetFilesManager()->getAssetFileFiltersManager();
        $aRegisteredAssetFileFilters = $oAssetFileFiltersManager->getRegisteredAssetFileFilters();
        foreach ($aRegisteredAssetFileFilters as $sFilter) {
            $oFilter = $oAssetFileFiltersManager->get($sFilter);
            $aDirectories[$oFilter->getAssetFileFilterName() . ' filter cache'] = $oFilter->getAssetFileFilterProcessedDirPath();
        }
        // Empty directories except .gitignore
        foreach ($aDirectories as $sName => $sDirectoryPath) {
            if (!is_dir($sDirectoryPath)) {
                continue;
            }
            foreach (new \RecursiveIteratorIterator(
                new \RecursiveDirectoryIterator($sDirectoryPath, \RecursiveDirectoryIterator::SKIP_DOTS),
                \RecursiveIteratorIterator::CHILD_FIRST
            ) as $oFileinfo) {
                if ($oFileinfo->isDir()) {
                    rmdir($oFileinfo->getRealPath());
                } elseif ($oFileinfo->getBasename() !== '.gitignore') {
                    unlink($oFileinfo->getRealPath());
                }
            }
            if ($bDisplayConsoleMessage) {
                $oConsole->writeLine(' * "'.$sName.'" directory is empty', \Zend\Console\ColorInterface::WHITE);
            }
        }
        
        return $this;
    }
    /**
     * @return \Zend\Console\Adapter\AdapterInterface
     * @throws \LogicException
     */
    public function getConsole() : \Zend\Console\Adapter\AdapterInterface
    {
        if ($this->console instanceof \Zend\Console\Adapter\AdapterInterface) {
            return $this->console;
        }
        throw new \LogicException('Console is undefined');
    }
    /**
     * @param \Zend\Console\Adapter\AdapterInterface $oConsole
     * @return \AssetsBundle\Service\ToolsService
     */
    public function setConsole(\Zend\Console\Adapter\AdapterInterface $oConsole) : \AssetsBundle\Service\ToolsService
    {
        $this->console = $oConsole;
        return $this;
    }
    /**
     * @return \Zend\Mvc\MvcEvent
     * @throws \LogicException
     */
    public function getMvcEvent() : \Zend\Mvc\MvcEvent
    {
        if ($this->mvcEvent instanceof \Zend\Mvc\MvcEvent) {
            return $this->mvcEvent;
        }
        throw new \LogicException('Mvc event is undefined');
    }
    /**
     * @param \Zend\Mvc\MvcEvent $oMvcEvent
     * @return \AssetsBundle\Service\ToolsService
     */
    public function setMvcEvent(\Zend\Mvc\MvcEvent $oMvcEvent) : \AssetsBundle\Service\ToolsService
    {
        $this->mvcEvent = $oMvcEvent;
        return $this;
    }
    /**
     * @return \AssetsBundle\Service\Service
     * @throws \LogicException
     */
    public function getAssetsBundleService() : \AssetsBundle\Service\Service
    {
        if ($this->assetsBundleService instanceof \AssetsBundle\Service\Service) {
            return $this->assetsBundleService;
        }
        throw new \LogicException('AssetsBundle service is undefined');
    }
    /**
     * @param \AssetsBundle\Service\Service $oAssetsBundleService
     * @return \AssetsBundle\Service\ToolsService
     */
    public function setAssetsBundleService(\AssetsBundle\Service\Service $oAssetsBundleService) : \AssetsBundle\Service\ToolsService
    {
        $this->assetsBundleService = $oAssetsBundleService;
        return $this;
    }
}