Skip to content

Commit

Permalink
moved the requirement of the bootstrap.php later in the process
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed May 7, 2010
1 parent 75f0d47 commit 16055d2
Show file tree
Hide file tree
Showing 5 changed files with 2 additions and 358 deletions.
2 changes: 2 additions & 0 deletions src/Symfony/Foundation/Kernel.php
Expand Up @@ -102,6 +102,8 @@ public function boot()
throw new \LogicException('The kernel is already booted.');
}

require_once __DIR__.'/bootstrap.php';

$this->bundles = $this->registerBundles();
$this->bundleDirs = $this->registerBundleDirs();

Expand Down
355 changes: 0 additions & 355 deletions src/Symfony/Foundation/bootstrap.php
Expand Up @@ -331,361 +331,6 @@ static protected function writeCacheFile($file, $content)
}


namespace Symfony\Foundation;

use Symfony\Components\DependencyInjection\ContainerInterface;
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\BuilderConfiguration;
use Symfony\Components\DependencyInjection\Dumper\PhpDumper;
use Symfony\Components\DependencyInjection\FileResource;
use Symfony\Components\HttpKernel\Request;
use Symfony\Components\HttpKernel\HttpKernelInterface;




abstract class Kernel implements HttpKernelInterface, \Serializable
{
protected $bundles;
protected $bundleDirs;
protected $container;
protected $rootDir;
protected $environment;
protected $debug;
protected $booted;
protected $name;
protected $startTime;
protected $request;

const VERSION = '2.0.0-DEV';


public function __construct($environment, $debug)
{
$this->environment = $environment;
$this->debug = (Boolean) $debug;
$this->booted = false;
$this->rootDir = realpath($this->registerRootDir());
$this->name = basename($this->rootDir);

if ($this->debug) {
ini_set('display_errors', 1);
error_reporting(-1);

$this->startTime = microtime(true);
} else {
ini_set('display_errors', 0);
}
}

abstract public function registerRootDir();

abstract public function registerBundles();

abstract public function registerBundleDirs();

abstract public function registerContainerConfiguration();

abstract public function registerRoutes();


public function isBooted()
{
return $this->booted;
}


public function boot()
{
if (true === $this->booted) {
throw new \LogicException('The kernel is already booted.');
}

$this->bundles = $this->registerBundles();
$this->bundleDirs = $this->registerBundleDirs();

$this->container = $this->initializeContainer();
$this->container->setService('kernel', $this);

foreach ($this->bundles as $bundle) {
$bundle->boot($this->container);
}

$this->booted = true;

return $this;
}


public function shutdown()
{
$this->booted = false;

foreach ($this->bundles as $bundle) {
$bundle->shutdown($this->container);
}

$this->container = null;
}


public function reboot()
{
$this->shutdown();
$this->boot();
}


public function getRequest()
{
return $this->request;
}


public function handle(Request $request = null, $main = true, $raw = false)
{
if (false === $this->booted) {
$this->boot();
}

if (null === $request) {
$request = $this->container->getRequestService();
} else {
$this->container->setService('request', $request);
}

if (true === $main) {
$this->request = $request;
}

return $this->container->getHttpKernelService()->handle($request, $main, $raw);
}

public function getBundleDirs()
{
return $this->bundleDirs;
}

public function getBundles()
{
return $this->bundles;
}

public function getName()
{
return $this->name;
}

public function getEnvironment()
{
return $this->environment;
}

public function isDebug()
{
return $this->debug;
}

public function getRootDir()
{
return $this->rootDir;
}

public function getContainer()
{
return $this->container;
}

public function getStartTime()
{
return $this->debug ? $this->startTime : -INF;
}

public function getCacheDir()
{
return $this->rootDir.'/cache/'.$this->environment;
}

public function getLogDir()
{
return $this->rootDir.'/logs';
}

protected function initializeContainer()
{
$class = $this->name.'ProjectContainer';
$location = $this->getCacheDir().'/'.$class;
$reload = $this->debug ? $this->needsReload($class, $location) : false;

if ($reload || !file_exists($location.'.php')) {
$this->buildContainer($class, $location.'.php');
}

require_once $location.'.php';

return new $class();
}

public function getKernelParameters()
{
$bundles = array();
foreach ($this->bundles as $bundle) {
$bundles[] = get_class($bundle);
}

return array_merge(
array(
'kernel.root_dir' => $this->rootDir,
'kernel.environment' => $this->environment,
'kernel.debug' => $this->debug,
'kernel.name' => $this->name,
'kernel.cache_dir' => $this->getCacheDir(),
'kernel.logs_dir' => $this->getLogDir(),
'kernel.bundle_dirs' => $this->bundleDirs,
'kernel.bundles' => $bundles,
'kernel.charset' => 'UTF-8',
),
$this->getEnvParameters()
);
}

protected function getEnvParameters()
{
$parameters = array();
foreach ($_SERVER as $key => $value) {
if ('SYMFONY__' === substr($key, 0, 9))
{
$parameters[strtolower(str_replace('__', '.', substr($key, 9)))] = $value;
}
}

return $parameters;
}

protected function needsReload($class, $location)
{
if (!file_exists($location.'.meta') || !file_exists($location.'.php')) {
return true;
}

$meta = unserialize(file_get_contents($location.'.meta'));
$time = filemtime($location.'.php');
foreach ($meta as $resource) {
if (!$resource->isUptodate($time))
{
return true;
}
}

return false;
}

protected function buildContainer($class, $file)
{
$container = new Builder($this->getKernelParameters());

$configuration = new BuilderConfiguration();
foreach ($this->bundles as $bundle) {
$configuration->merge($bundle->buildContainer($container));
}
$configuration->merge($this->registerContainerConfiguration());
$container->merge($configuration);
$this->optimizeContainer($container);

foreach (array('cache', 'logs') as $name) {
$dir = $container->getParameter(sprintf('kernel.%s_dir', $name));
if (!is_dir($dir)) {
if (false === @mkdir($dir, 0777, true))
{
die(sprintf('Unable to create the %s directory (%s)', $name, dirname($dir)));
}
} elseif (!is_writable($dir)) {
die(sprintf('Unable to write in the %s directory (%s)', $name, $dir));
}
}

$dumper = new PhpDumper($container);
$content = $dumper->dump(array('class' => $class));
if (!$this->debug) {
$content = self::stripComments($content);
}
$this->writeCacheFile($file, $content);

if ($this->debug) {
$parent = new \ReflectionObject($this);
$configuration->addResource(new FileResource($parent->getFileName()));
while ($parent = $parent->getParentClass()) {
$configuration->addResource(new FileResource($parent->getFileName()));
}

$this->writeCacheFile($this->getCacheDir().'/'.$class.'.meta', serialize($configuration->getResources()));
}
}

public function optimizeContainer(Builder $container)
{
foreach ($container->getDefinitions() as $definition) {
if (false !== strpos($class = $definition->getClass(), '%'))
{
$definition->setClass(Builder::resolveValue($class, $container->getParameters()));
unset($container[substr($class, 1, -1)]);
}
}
}

static public function stripComments($source)
{
if (!function_exists('token_get_all')) {
return $source;
}

$ignore = array(T_COMMENT => true, T_DOC_COMMENT => true);
$output = '';
foreach (token_get_all($source) as $token) {
if (isset($token[1]))
{
if (!isset($ignore[$token[0]])) {
$output .= $token[1];
}
} else {
$output .= $token;
}
}

return $output;
}

protected function writeCacheFile($file, $content)
{
$tmpFile = tempnam(dirname($file), basename($file));
if (!$fp = @fopen($tmpFile, 'wb')) {
die(sprintf('Failed to write cache file "%s".', $tmpFile));
}
@fwrite($fp, $content);
@fclose($fp);

if ($content != file_get_contents($tmpFile)) {
die(sprintf('Failed to write cache file "%s" (cache corrupted).', $tmpFile));
}

@rename($tmpFile, $file);
chmod($file, 0644);
}

public function serialize()
{
return serialize(array($this->environment, $this->debug));
}

public function unserialize($data)
{
list($environment, $debug) = unserialize($data);

$this->__construct($environment, $debug);
}
}


namespace Symfony\Foundation;

use Symfony\Components\EventDispatcher\EventDispatcher as BaseEventDispatcher;
Expand Down
1 change: 0 additions & 1 deletion src/Symfony/Foundation/packager.php
Expand Up @@ -29,6 +29,5 @@
'Symfony\\Foundation\\Bundle\\KernelExtension',
'Symfony\\Foundation\\Debug\\ErrorHandler',
'Symfony\\Foundation\\ClassCollectionLoader',
'Symfony\\Foundation\\Kernel',
'Symfony\\Foundation\\EventDispatcher',
), __DIR__, 'bootstrap', false);
@@ -1,7 +1,6 @@
<?php

require_once __DIR__.'/../src/autoload.php';
require_once __DIR__.'/../src/vendor/Symfony/src/Symfony/Foundation/bootstrap.php';

use Symfony\Foundation\Kernel;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader as ContainerLoader;
Expand Down
@@ -1,7 +1,6 @@
<?php

require_once __DIR__.'/../src/autoload.php';
require_once __DIR__.'/../src/vendor/Symfony/src/Symfony/Foundation/bootstrap.php';

use Symfony\Foundation\Kernel;
use Symfony\Components\DependencyInjection\Loader\YamlFileLoader as ContainerLoader;
Expand Down

0 comments on commit 16055d2

Please sign in to comment.