082a0130c2
Signed-off-by: Gergely POLONKAI (W00d5t0ck) <polesz@w00d5t0ck.info>
106 lines
3.0 KiB
PHP
106 lines
3.0 KiB
PHP
<?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\GeneratorBundle\Manipulator;
|
|
|
|
use Symfony\Component\HttpKernel\KernelInterface;
|
|
|
|
/**
|
|
* Changes the PHP code of a Kernel.
|
|
*
|
|
* @author Fabien Potencier <fabien@symfony.com>
|
|
*/
|
|
class KernelManipulator extends Manipulator
|
|
{
|
|
private $kernel;
|
|
private $reflected;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param KernelInterface $kernel A KernelInterface instance
|
|
*/
|
|
public function __construct(KernelInterface $kernel)
|
|
{
|
|
$this->kernel = $kernel;
|
|
$this->reflected = new \ReflectionObject($kernel);
|
|
}
|
|
|
|
/**
|
|
* Adds a bundle at the end of the existing ones.
|
|
*
|
|
* @param string $bundle The bundle class name
|
|
*
|
|
* @return Boolean true if it worked, false otherwise
|
|
*
|
|
* @throws \RuntimeException If bundle is already defined
|
|
*/
|
|
public function addBundle($bundle)
|
|
{
|
|
if (!$this->reflected->getFilename()) {
|
|
return false;
|
|
}
|
|
|
|
$src = file($this->reflected->getFilename());
|
|
$method = $this->reflected->getMethod('registerBundles');
|
|
$lines = array_slice($src, $method->getStartLine() - 1, $method->getEndLine() - $method->getStartLine() + 1);
|
|
|
|
// Don't add same bundle twice
|
|
if (false !== strpos(implode('', $lines), $bundle)) {
|
|
throw new \RuntimeException(sprintf('Bundle "%s" is already defined in "AppKernel::registerBundles()".', $bundle));
|
|
}
|
|
|
|
$this->setCode(token_get_all('<?php '.implode('', $lines)), $method->getStartLine());
|
|
while ($token = $this->next()) {
|
|
// $bundles
|
|
if (T_VARIABLE !== $token[0] || '$bundles' !== $token[1]) {
|
|
continue;
|
|
}
|
|
|
|
// =
|
|
$this->next();
|
|
|
|
// array
|
|
$token = $this->next();
|
|
if (T_ARRAY !== $token[0]) {
|
|
return false;
|
|
}
|
|
|
|
// add the bundle at the end of the array
|
|
while ($token = $this->next()) {
|
|
// look for );
|
|
if (')' !== $this->value($token)) {
|
|
continue;
|
|
}
|
|
|
|
if (';' !== $this->value($this->peek())) {
|
|
continue;
|
|
}
|
|
|
|
// ;
|
|
$this->next();
|
|
|
|
$lines = array_merge(
|
|
array_slice($src, 0, $this->line - 2),
|
|
// Appends a separator comma to the current last position of the array
|
|
array(rtrim(rtrim($src[$this->line - 2]), ',') . ",\n"),
|
|
array(sprintf(" new %s(),\n", $bundle)),
|
|
array_slice($src, $this->line - 1)
|
|
);
|
|
|
|
file_put_contents($this->reflected->getFilename(), implode('', $lines));
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|