PHPixie/Bundle-Framework

View on GitHub
src/PHPixie/BundleFramework/Configuration.php

Summary

Maintainability
B
5 hrs
Test Coverage
<?php

namespace PHPixie\BundleFramework;

use PHPixie\Processors\Processor;
use PHPixie\Slice\Data;

/**
 * Framework configuration
 */
class Configuration implements \PHPixie\Framework\Configuration
{
    /**
     * @var Builder
     */
    protected $builder;

    /**
     * @var array
     */
    protected $instances = array();

    /**
     * Constructor
     * @param Builder $builder
     */
    public function __construct($builder)
    {
        $this->builder = $builder;
    }

    /**
     * Configuration
     * @return Data
     */
    public function config()
    {
        return $this->instance('config');
    }

    /**
     * Bundles configuration
     * @return Data
     */
    public function bundlesConfig()
    {
        return $this->instance('bundlesConfig');
    }

    /**
     * @inheritdoc
     */
    public function databaseConfig()
    {
        return $this->instance('databaseConfig');
    }

    /**
     * @inheritdoc
     */
    public function httpConfig()
    {
        return $this->instance('httpConfig');
    }

    /**
     * @inheritdoc
     */
    public function templateConfig()
    {
        return $this->instance('templateConfig');
    }

    /**
     * @inheritdoc
     */
    public function imageDefaultDriver()
    {
        return $this->instance('imageDefaultDriver');
    }

    /**
     * @inheritdoc
     */
    public function filesystemRoot()
    {
        return $this->builder->assets()->root();
    }

    /**
     * ORM configuration merger
     * @return Configuration\ORM
     */
    public function orm()
    {
        return $this->instance('orm');
    }

    /**
     * @inheritdoc
     */
    public function ormConfig()
    {
        return $this->orm()->configData();
    }

    /**
     * @inheritdoc
     */
    public function ormWrappers()
    {
        return $this->orm()->wrappers();
    }

    /**
     * @inheritdoc
     */
    public function authConfig()
    {
        return $this->instance('authConfig');
    }

    /**
     * @inheritdoc
     */
    public function socialConfig()
    {
        return $this->instance('socialConfig');
    }
    
    /**
     * @inheritdoc
     */
    public function migrateRoot()
    {
        return $this->builder->assets()->migrateRoot();
    }
    
    /**
     * @inheritdoc
     */
    public function migrateConfig()
    {
        return $this->instance('migrateConfig');
    }

    /**
     * @inheritdoc
     */
    public function cacheRoot()
    {
        return $this->builder->assets()->cacheRoot();
    }

    /**
     * @inheritdoc
     */
    public function cacheConfig()
    {
        return $this->instance('cacheConfig');
    }

    /**
     * @inheritdoc
     */
    public function authRepositories()
    {
        $components = $this->builder->components();
        return $components->bundles()->auth();
    }

    /**
     * @inheritdoc
     */
    public function httpProcessor()
    {
        return $this->instance('httpProcessor');
    }

    /**
     * @inheritdoc
     */
    public function httpRouteResolver()
    {
        return $this->instance('httpRouteResolver');
    }

    /**
     * @inheritdoc
     */
    public function templateLocator()
    {
        return $this->instance('templateLocator');
    }
    
    /**
     * @inheritdoc
     */
    public function consoleProvider()
    {
        $components = $this->builder->components();
        
        return $components->bundles()->console();
    }
    
    /**
     * @inheritdoc
     */
    public function logger()
    {
        return $this->builder->logger();
    }

    /**
     * @param string $name
     * @return mixed
     */
    protected function instance($name)
    {
        if(!array_key_exists($name, $this->instances)) {
            $method = 'build'.ucfirst($name);
            $this->instances[$name] = $this->$method();
        }

        return $this->instances[$name];
    }

    /**
     * @return Data
     */
    protected function buildConfig()
    {
        $assets = $this->builder->assets();
        $configStorage = $assets->configStorage();
        $parameterStorage = $assets->parameterStorage();

        $configOverlay = $parameterStorage->get('configOverlay');
        if($configOverlay === null) {
            return $configStorage;
        }

        $slice = $this->builder->components()->slice();
        return $slice->mergeData(
            $configStorage,
            $configStorage->slice($configOverlay)
        );
    }

    /**
     * @return Data
     */
    protected function buildBundlesConfig()
    {
        return $this->config()->arraySlice('bundles');
    }

    /**
     * @return Data
     */
    protected function buildDatabaseConfig()
    {
        return $this->config()->arraySlice('database');
    }

    /**
     * @return Data
     */
    protected function buildHttpConfig()
    {
        return $this->config()->arraySlice('http');
    }

    /**
     * @return Data
     */
    protected function buildTemplateConfig()
    {
        return $this->config()->arraySlice('template');
    }

    /**
     * @return Data
     */
    protected function buildAuthConfig()
    {
        return $this->config()->arraySlice('auth');
    }

    /**
     * @return string
     */
    protected function buildImageDefaultDriver()
    {
        return $this->config()->get('image.defaultDriver', 'gd');
    }

    /**
     * @return Data
     */
    protected function buildSocialConfig()
    {
        return $this->config()->arraySlice('social');
    }
    
    /**
     * @return Data
     */
    protected function buildMigrateConfig()
    {
        return $this->config()->arraySlice('migrate');
    }

    /**
     * @return Data
     */
    protected function buildCacheConfig()
    {
        return $this->config()->arraySlice('cache');
    }

    /**
     * @return Configuration\ORM
     */
    protected function buildOrm()
    {
        $components = $this->builder->components();

        return new Configuration\ORM(
            $components->slice(),
            $components->bundles()->orm()
        );
    }

    /**
     * @return Processor
     */
    protected function buildHttpProcessor()
    {
        $components = $this->builder->components();

        return $components->httpProcessors()->attributeRegistryDispatcher(
            $components->bundles()->httpProcessors(),
            'bundle'
        );
    }

    /**
     * @return \PHPixie\Route\Resolvers\Resolver
     */
    protected function buildHttpRouteResolver()
    {
        $components = $this->builder->components();

        return $components->route()->buildResolver(
            $this->config()->arraySlice('http.resolver'),
            $components->bundles()->routeResolvers()
        );
    }

    /**
     * @return Configuration\FilesystemLocator\Template
     */
    protected function buildTemplateLocator()
    {
        $components = $this->builder->components();
        $bundleLocators = $components->bundles()->templateLocators();

        $overridesLocator = null;

        $overridesConfig = $this->config()->arraySlice('template.locator');
        if($overridesConfig->get('type') !== null) {
            $overridesLocator = $components->filesystem()->buildLocator(
                $overridesConfig,
                $bundleLocators
            );
        }

        return new Configuration\FilesystemLocator\Template(
            $bundleLocators,
            $this->builder->assets(),
            $overridesLocator
        );
    }
}