فهرست منبع

[DoctrineBundle] Tries to auto-generate the missing proxy files on the
autoloader

Grégoire Passault 13 سال پیش
والد
کامیت
e866a678d2
1فایلهای تغییر یافته به همراه26 افزوده شده و 1 حذف شده
  1. 26 1
      src/Symfony/Bundle/DoctrineBundle/DoctrineBundle.php

+ 26 - 1
src/Symfony/Bundle/DoctrineBundle/DoctrineBundle.php

@@ -42,12 +42,37 @@ class DoctrineBundle extends Bundle
         if ($this->container->hasParameter('doctrine.orm.proxy_namespace')) {
             $namespace = $this->container->getParameter('doctrine.orm.proxy_namespace');
             $dir = $this->container->getParameter('doctrine.orm.proxy_dir');
+            $doctrine = $this->container->get('doctrine');
 
-            spl_autoload_register(function($class) use ($namespace, $dir) {
+            spl_autoload_register(function($class) use ($namespace, $dir, $doctrine) {
                 if (0 === strpos($class, $namespace)) {
                     $className = substr($class, strlen($namespace) +1);
                     $file = $dir.DIRECTORY_SEPARATOR.$className.'.php';
 
+                    if (!file_exists($file)) {
+                        // Tries to auto-generate the proxy file
+                        if (preg_match('/^(.+)\\\\([a-z0-9_]+)Proxy$/i', $class, $matches)) {
+                            $className = $matches[2];
+
+                            foreach ($doctrine->getEntityManagers() as $em) {
+                                $em = $doctrine->getEntityManager();
+
+                                if ($em->getConfiguration()->getAutoGenerateProxyClasses()) {
+
+                                    $classes = $em->getMetadataFactory()->getAllMetadata();
+                                    foreach ($classes as $class) 
+                                    {
+                                        $name = str_replace('\\', '', $class->name);
+
+                                        if ($name == $className) {
+                                            $em->getProxyFactory()->generateProxyClasses(array($class));
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
                     if (!file_exists($file)) {
                         throw new \RuntimeException(sprintf('The proxy file "%s" does not exist. If you still have objects serialized in the session, you need to clear the session manually.', $file));
                     }