<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sensio\Bundle\DistributionBundle\Configurator;
use Sensio\Bundle\DistributionBundle\Configurator\Step\StepInterface;
/**
* Configurator.
*
* @author Marc Weistroff <marc.weistroff@gmail.com>
*/
class Configurator
{
protected $filename;
protected $steps;
protected $parameters;
public function __construct($kernelDir)
{
$this->kernelDir = $kernelDir;
$this->filename = $kernelDir.'/config/parameters.ini';
$this->steps = array();
$this->parameters = $this->read();
}
public function isFileWritable()
{
return is_writable($this->filename);
}
public function clean()
{
if (file_exists($this->getCacheFilename())) {
@unlink($this->getCacheFilename());
}
}
/**
* @param StepInterface $step
*/
public function addStep(StepInterface $step)
{
$this->steps[] = $step;
}
/**
* @param integer $index
*
* @return StepInterface
*/
public function getStep($index)
{
if (isset($this->steps[$index])) {
return $this->steps[$index];
}
}
/**
* @return array
*/
public function getSteps()
{
return $this->steps;
}
/**
* @return array
*/
public function getParameters()
{
return $this->parameters;
}
/**
* @return integer
*/
public function getStepCount()
{
return count($this->steps);
}
/**
* @param array $parameters
*/
public function mergeParameters($parameters)
{
$this->parameters = array_merge($this->parameters, $parameters);
}
/**
* @return array
*/
public function getRequirements()
{
$majors = array();
foreach ($this->steps as $step) {
foreach ($step->checkRequirements() as $major) {
$majors[] = $major;
}
}
return $majors;
}
/**
* @return array
*/
public function getOptionalSettings()
{
$minors = array();
foreach ($this->steps as $step) {
foreach ($step->checkOptionalSettings() as $minor) {
$minors[] = $minor;
}
}
return $minors;
}
/**
* Renders parameters as a string.
*
* @return string
*/
public function render()
{
$lines[] = "[parameters]\n";
foreach ($this->parameters as $key => $value) {
if (is_integer($value) || is_float($value)) {
} elseif (is_bool($value)) {
$value = $value ? 'true' : 'false';
} elseif (false === strpos($value, '"')) {
$value = '"'.$value.'"';
} else {
throw new \RuntimeException('A value in an ini file can not contain double quotes (").');
}
$lines[] = sprintf(" %s=%s\n", $key, $value);
}
return implode('', $lines);
}
/**
* Writes parameters to parameters.ini or temporary in the cache directory.
*
* @return boolean
*/
public function write()
{
$filename = $this->isFileWritable() ? $this->filename : $this->getCacheFilename();
return file_put_contents($filename, $this->render());
}
/**
* Reads parameters from file.
*
* @return array
*/
protected function read()
{
$filename = $this->filename;
if (!$this->isFileWritable() && file_exists($this->getCacheFilename())) {
$filename = $this->getCacheFilename();
}
$ret = parse_ini_file($filename, true);
if (false === $ret || array() === $ret) {
throw new \InvalidArgumentException(sprintf('The %s file is not valid.', $filename));
}
if (isset($ret['parameters']) && is_array($ret['parameters'])) {
return $ret['parameters'];
} else {
return array();
}
}
/**
* getCacheFilename
*
* @return string
*/
protected function getCacheFilename()
{
return $this->kernelDir.'/cache/parameters.ini';
}
}