121 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the Doctrine Bundle
 | 
						|
 *
 | 
						|
 * The code was originally distributed inside the Symfony framework.
 | 
						|
 *
 | 
						|
 * (c) Fabien Potencier <fabien@symfony.com>
 | 
						|
 * (c) Doctrine Project, Benjamin Eberlei <kontakt@beberlei.de>
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Doctrine\Bundle\DoctrineBundle;
 | 
						|
 | 
						|
use Doctrine\Common\Util\ClassUtils;
 | 
						|
use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
 | 
						|
use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
 | 
						|
use Doctrine\Bundle\DoctrineBundle\Command\Proxy\RunSqlDoctrineCommand;
 | 
						|
use Symfony\Component\Console\Application;
 | 
						|
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
 | 
						|
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
						|
use Symfony\Component\HttpKernel\Bundle\Bundle;
 | 
						|
use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\DoctrineValidationPass;
 | 
						|
use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass;
 | 
						|
use Symfony\Bridge\Doctrine\DependencyInjection\Security\UserProvider\EntityFactory;
 | 
						|
 | 
						|
/**
 | 
						|
 * Bundle.
 | 
						|
 *
 | 
						|
 * @author Fabien Potencier <fabien@symfony.com>
 | 
						|
 * @author Jonathan H. Wage <jonwage@gmail.com>
 | 
						|
 */
 | 
						|
class DoctrineBundle extends Bundle
 | 
						|
{
 | 
						|
    private $autoloader;
 | 
						|
 | 
						|
    public function build(ContainerBuilder $container)
 | 
						|
    {
 | 
						|
        parent::build($container);
 | 
						|
 | 
						|
        $container->addCompilerPass(new RegisterEventListenersAndSubscribersPass('doctrine.connections', 'doctrine.dbal.%s_connection.event_manager', 'doctrine'), PassConfig::TYPE_BEFORE_OPTIMIZATION);
 | 
						|
 | 
						|
        if ($container->hasExtension('security')) {
 | 
						|
            $container->getExtension('security')->addUserProviderFactory(new EntityFactory('entity', 'doctrine.orm.security.user.provider'));
 | 
						|
        }
 | 
						|
        $container->addCompilerPass(new DoctrineValidationPass('orm'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function boot()
 | 
						|
    {
 | 
						|
        // Register an autoloader for proxies to avoid issues when unserializing them
 | 
						|
        // when the ORM is used.
 | 
						|
        if ($this->container->hasParameter('doctrine.orm.proxy_namespace')) {
 | 
						|
            $namespace = $this->container->getParameter('doctrine.orm.proxy_namespace');
 | 
						|
            $dir = $this->container->getParameter('doctrine.orm.proxy_dir');
 | 
						|
            // See https://github.com/symfony/symfony/pull/3419 for usage of
 | 
						|
            // references
 | 
						|
            $container =& $this->container;
 | 
						|
 | 
						|
            $this->autoloader = function($class) use ($namespace, $dir, &$container) {
 | 
						|
                if (0 === strpos($class, $namespace)) {
 | 
						|
                    $fileName = str_replace('\\', '', substr($class, strlen($namespace) +1));
 | 
						|
                    $file = $dir.DIRECTORY_SEPARATOR.$fileName.'.php';
 | 
						|
 | 
						|
                    if (!is_file($file) && $container->getParameter('kernel.debug')) {
 | 
						|
                        $originalClassName = ClassUtils::getRealClass($class);
 | 
						|
                        $registry = $container->get('doctrine');
 | 
						|
 | 
						|
                        // Tries to auto-generate the proxy file
 | 
						|
                        foreach ($registry->getManagers() as $em) {
 | 
						|
 | 
						|
                            if ($em->getConfiguration()->getAutoGenerateProxyClasses()) {
 | 
						|
                                $classes = $em->getMetadataFactory()->getAllMetadata();
 | 
						|
 | 
						|
                                foreach ($classes as $classMetadata) {
 | 
						|
                                    if ($classMetadata->name == $originalClassName) {
 | 
						|
                                        $em->getProxyFactory()->generateProxyClasses(array($classMetadata));
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
 | 
						|
                        clearstatcache($file);
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (file_exists($file)) {
 | 
						|
                        require $file;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            };
 | 
						|
            spl_autoload_register($this->autoloader);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function shutdown()
 | 
						|
    {
 | 
						|
        if (null !== $this->autoloader) {
 | 
						|
            spl_autoload_unregister($this->autoloader);
 | 
						|
            $this->autoloader = null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function registerCommands(Application $application)
 | 
						|
    {
 | 
						|
        // Use the default logic when the ORM is available.
 | 
						|
        // This avoids listing all ORM commands by hand.
 | 
						|
        if (class_exists('Doctrine\\ORM\\Version')) {
 | 
						|
            parent::registerCommands($application);
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        // Register only the DBAL commands if the ORM is not available.
 | 
						|
        $application->add(new CreateDatabaseDoctrineCommand());
 | 
						|
        $application->add(new DropDatabaseDoctrineCommand());
 | 
						|
        $application->add(new RunSqlDoctrineCommand());
 | 
						|
    }
 | 
						|
}
 |