123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696 |
- <?php
- namespace Symfony\Foundation\Bundle;
- use Symfony\Components\DependencyInjection\ContainerInterface;
- abstract class Bundle implements BundleInterface
- {
- public function buildContainer(ContainerInterface $container)
- {
- }
- public function boot(ContainerInterface $container)
- {
- }
- }
- namespace Symfony\Foundation\Bundle;
- use Symfony\Components\DependencyInjection\ContainerInterface;
- interface BundleInterface
- {
- public function buildContainer(ContainerInterface $container);
- public function boot(ContainerInterface $container);
- }
- namespace Symfony\Foundation\Bundle;
- use Symfony\Foundation\Bundle\Bundle;
- use Symfony\Foundation\ClassCollectionLoader;
- use Symfony\Components\DependencyInjection\ContainerInterface;
- use Symfony\Components\DependencyInjection\Loader\Loader;
- use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
- use Symfony\Components\DependencyInjection\BuilderConfiguration;
- class KernelBundle extends Bundle
- {
- public function buildContainer(ContainerInterface $container)
- {
- Loader::registerExtension(new KernelExtension());
- $configuration = new BuilderConfiguration();
- $loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
- $configuration->merge($loader->load('services.xml'));
- if ($container->getParameter('kernel.debug'))
- {
- $configuration->merge($loader->load('debug.xml'));
- $configuration->setDefinition('event_dispatcher', $configuration->findDefinition('debug.event_dispatcher'));
- }
- return $configuration;
- }
- public function boot(ContainerInterface $container)
- {
- $container->getErrorHandlerService();
- ClassCollectionLoader::load($container->getParameter('kernel.compiled_classes'), $container->getParameter('kernel.cache_dir'), 'classes', $container->getParameter('kernel.debug'));
- }
- }
- namespace Symfony\Foundation\Bundle;
- use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
- use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
- use Symfony\Components\DependencyInjection\BuilderConfiguration;
- class KernelExtension extends LoaderExtension
- {
- public function configLoad($config)
- {
- $configuration = new BuilderConfiguration();
- if (isset($config['charset']))
- {
- $configuration->setParameter('kernel.charset', $config['charset']);
- }
- if (!array_key_exists('compilation', $config))
- {
- $classes = array(
- 'Symfony\\Components\\Routing\\Router',
- 'Symfony\\Components\\Routing\\RouterInterface',
- 'Symfony\\Components\\EventDispatcher\\Event',
- 'Symfony\\Components\\Routing\\Matcher\\UrlMatcherInterface',
- 'Symfony\\Components\\Routing\\Matcher\\UrlMatcher',
- 'Symfony\\Components\\RequestHandler\\RequestInterface',
- 'Symfony\\Components\\RequestHandler\\Request',
- 'Symfony\\Components\\RequestHandler\\RequestHandler',
- 'Symfony\\Components\\RequestHandler\\ResponseInterface',
- 'Symfony\\Components\\RequestHandler\\Response',
- 'Symfony\\Components\\Templating\\Loader\\LoaderInterface',
- 'Symfony\\Components\\Templating\\Loader\\Loader',
- 'Symfony\\Components\\Templating\\Loader\\FilesystemLoader',
- 'Symfony\\Components\\Templating\\Engine',
- 'Symfony\\Components\\Templating\\Renderer\\RendererInterface',
- 'Symfony\\Components\\Templating\\Renderer\\Renderer',
- 'Symfony\\Components\\Templating\\Renderer\\PhpRenderer',
- 'Symfony\\Components\\Templating\\Storage\\Storage',
- 'Symfony\\Components\\Templating\\Storage\\FileStorage',
- 'Symfony\\Framework\\WebBundle\\Controller',
- 'Symfony\\Framework\\WebBundle\\Listener\\RequestParser',
- 'Symfony\\Framework\\WebBundle\\Listener\\ControllerLoader',
- 'Symfony\\Framework\\WebBundle\\Listener\\ResponseFilter',
- 'Symfony\\Framework\\WebBundle\\Templating\\Engine',
- );
- }
- else
- {
- $classes = array();
- foreach (explode("\n", $config['compilation']) as $class)
- {
- if ($class)
- {
- $classes[] = trim($class);
- }
- }
- }
- $configuration->setParameter('kernel.compiled_classes', $classes);
- if (array_key_exists('error_handler_level', $config))
- {
- $configuration->setParameter('error_handler.level', $config['error_handler_level']);
- }
- return $configuration;
- }
-
- public function getXsdValidationBasePath()
- {
- return false;
- }
- public function getNamespace()
- {
- return 'http://www.symfony-project.org/schema/dic/symfony/kernel';
- }
- public function getAlias()
- {
- return 'kernel';
- }
- }
- namespace Symfony\Foundation\Debug;
- class ErrorHandler
- {
- protected $levels = array(
- E_WARNING => 'Warning',
- E_NOTICE => 'Notice',
- E_USER_ERROR => 'User Error',
- E_USER_WARNING => 'User Warning',
- E_USER_NOTICE => 'User Notice',
- E_STRICT => 'Runtime Notice',
- E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
- );
- protected $level;
-
- public function __construct($level = null)
- {
- $this->level = null === $level ? error_reporting() : $level;
- }
- public function register()
- {
- set_error_handler(array($this, 'handle'));
- }
- public function handle($level, $message, $file, $line, $context)
- {
- if (0 === $this->level)
- {
- return false;
- }
- if (error_reporting() & $level && $this->level & $level)
- {
- throw new \ErrorException(sprintf('%s: %s in %s line %d', isset($this->levels[$level]) ? $this->levels[$level] : $level, $message, $file, $line));
- }
- return false;
- }
- }
- namespace Symfony\Foundation;
- class ClassCollectionLoader
- {
- static public function load($classes, $cacheDir, $name, $autoReload)
- {
- $cache = $cacheDir.'/'.$name.'.php';
- $reload = false;
- if ($autoReload)
- {
- $metadata = $cacheDir.'/'.$name.'.meta';
- if (!file_exists($metadata) || !file_exists($cache))
- {
- $reload = true;
- }
- else
- {
- $time = filemtime($cache);
- $meta = unserialize(file_get_contents($metadata));
- if ($meta[1] != $classes)
- {
- $reload = true;
- }
- else
- {
- foreach ($meta[0] as $resource)
- {
- if (!file_exists($resource) || filemtime($resource) > $time)
- {
- $reload = true;
- break;
- }
- }
- }
- }
- }
- if (!$reload && file_exists($cache))
- {
- require_once $cache;
- return;
- }
- $files = array();
- $content = '';
- foreach ($classes as $class)
- {
- if (!class_exists($class) && !interface_exists($class))
- {
- throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class));
- }
- $r = new \ReflectionClass($class);
- $files[] = $r->getFileName();
- $content .= preg_replace(array('/^\s*<\?php/', '/\?>\s*$/'), '', file_get_contents($r->getFileName()));
- }
- if (!is_dir(dirname($cache)))
- {
- mkdir(dirname($cache), 0777, true);
- }
- self::writeCacheFile($cache, Kernel::stripComments('<?php '.$content));
- if ($autoReload)
- {
- self::writeCacheFile($metadata, serialize(array($files, $classes)));
- }
- }
- static 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);
- }
- }
- 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\RequestHandler\RequestInterface;
- abstract class Kernel
- {
- protected $bundles;
- protected $bundleDirs;
- protected $container;
- protected $rootDir;
- protected $environment;
- protected $debug;
- protected $booted;
- protected $name;
- protected $parameters;
- protected $startTime;
- const VERSION = '2.0.0-DEV';
-
- public function __construct($environment, $debug, $parameters = array())
- {
- $this->debug = (Boolean) $debug;
- if ($this->debug)
- {
- ini_set('display_errors', 1);
- error_reporting(-1);
- }
- else
- {
- ini_set('display_errors', 0);
- }
- if ($this->debug)
- {
- $this->startTime = microtime(true);
- }
- $this->booted = false;
- $this->environment = $environment;
- $this->parameters = $parameters;
- $this->bundles = $this->registerBundles();
- $this->bundleDirs = $this->registerBundleDirs();
- $this->rootDir = realpath($this->registerRootDir());
- $this->name = basename($this->rootDir);
- }
- 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->container = $this->initializeContainer();
- $this->container->setService('kernel', $this);
- foreach ($this->bundles as $bundle)
- {
- $bundle->boot($this->container);
- }
- $this->booted = true;
- return $this;
- }
- public function run()
- {
- $this->handle()->send();
- }
- public function handle(RequestInterface $request = null)
- {
- if (false === $this->booted)
- {
- $this->boot();
- }
- if (null === $request)
- {
- $request = $this->container->getRequestService();
- }
- return $this->container->getRequestHandlerService()->handle($request);
- }
- 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 getParameters()
- {
- return $parameters;
- }
- public function getDefaultParameters()
- {
- $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->rootDir.'/cache/'.$this->environment,
- 'kernel.logs_dir' => $this->rootDir.'/logs',
- 'kernel.bundle_dirs' => $this->bundleDirs,
- 'kernel.bundles' => $bundles,
- 'kernel.charset' => 'UTF-8',
- ),
- $this->getEnvParameters(),
- $this->parameters
- );
- }
- protected function initializeContainer()
- {
- $parameters = $this->getDefaultParameters();
- $class = $this->name.'ProjectContainer';
- $file = $parameters['kernel.cache_dir'].'/'.$class.'.php';
- $reload = $this->debug ? $this->needsReload($class, $file, $parameters) : false;
- if ($reload || !file_exists($file))
- {
- $this->buildContainer($class, $file, $parameters);
- }
- require_once $file;
- return new $class();
- }
- 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, $file, $parameters)
- {
- $metadata = $parameters['kernel.cache_dir'].'/'.$class.'.meta';
- if (!file_exists($metadata) || !file_exists($file))
- {
- return true;
- }
- $meta = unserialize(file_get_contents($metadata));
- $time = filemtime($file);
- foreach ($meta as $resource)
- {
- if (!$resource->isUptodate($time))
- {
- return true;
- }
- }
- return false;
- }
- protected function buildContainer($class, $file, $parameters)
- {
- $container = new Builder($parameters);
- $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)
- {
- $key = sprintf('kernel.%s_dir', $name);
- if (!is_dir($parameters[$key]))
- {
- if (false === @mkdir($parameters[$key], 0777, true))
- {
- die(sprintf('Unable to create the %s directory (%s)', $name, dirname($parameters['kernel.cache_dir'])));
- }
- }
- elseif (!is_writable($parameters[$key]))
- {
- die(sprintf('Unable to write in the %s directory (%s)', $name, $parameters['kernel.cache_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)
- {
- $this->writeCacheFile($parameters['kernel.cache_dir'].'/'.$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);
- }
- }
- namespace Symfony\Foundation;
- use Symfony\Components\EventDispatcher\EventDispatcher as BaseEventDispatcher;
- use Symfony\Components\EventDispatcher\Event;
- use Symfony\Components\DependencyInjection\ContainerInterface;
- class EventDispatcher extends BaseEventDispatcher
- {
- protected $container;
-
- public function __construct(ContainerInterface $container)
- {
- $this->container = $container;
- foreach ($container->findAnnotatedServiceIds('kernel.listener') as $id => $attributes)
- {
- foreach ($attributes as $attribute)
- {
- if (isset($attribute['event']))
- {
- $this->connect($attribute['event'], array($id, isset($attribute['method']) ? $attribute['method'] : 'handle'));
- }
- }
- }
- }
-
- public function getListeners($name)
- {
- if (!isset($this->listeners[$name]))
- {
- return array();
- }
- foreach ($this->listeners[$name] as $i => $listener)
- {
- if (is_array($listener) && is_string($listener[0]))
- {
- $this->listeners[$name][$i] = array($this->container->getService($listener[0]), $listener[1]);
- }
- }
- return $this->listeners[$name];
- }
- }
|