Permalink
Browse files

Merge pull request #406 from Ocramius/DCOM-96

[DCOM-96] Moving proxy generation and autoloading to common
  • Loading branch information...
2 parents 35fda90 + a58d4ae commit afee16e56bae9bfe93c96ef1398f077e534962a0 @beberlei beberlei committed Feb 14, 2013
View
@@ -8,4 +8,5 @@ lib/Doctrine/Common
lib/Doctrine/DBAL
/.settings/
.buildpath
-.project
+.project
+.idea
@@ -52,7 +52,7 @@ public function generate(EntityManager $em, $entity)
$identifier = array();
foreach ($idFields as $idField) {
- $value = $class->reflFields[$idField]->getValue($entity);
+ $value = $class->getFieldValue($entity, $idField);
if ( ! isset($value)) {
throw ORMException::entityMissingAssignedIdForField($entity, $idField);
@@ -605,7 +605,7 @@ class ClassMetadataInfo implements ClassMetadata
/**
* The ReflectionProperty instances of the mapped class.
*
- * @var array
+ * @var \ReflectionProperty[]
*/
public $reflFields = array();
@@ -693,13 +693,14 @@ public function getIdentifierValues($entity)
return $id;
}
- $value = $this->reflFields[$this->identifier[0]]->getValue($entity);
+ $id = $this->identifier[0];
+ $value = $this->reflFields[$id]->getValue($entity);
- if ($value !== null) {
- return array($this->identifier[0] => $value);
+ if (null === $value) {
+ return array();
}
- return array();
+ return array($id => $value);
}
/**
@@ -853,9 +853,10 @@ public function matching(Criteria $criteria)
$newObjects = $this->coll->matching($criteria)->toArray();
}
- $targetClass = $this->em->getClassMetadata(get_class($this->owner));
-
- $id = $targetClass->getSingleIdReflectionProperty()->getValue($this->owner);
+ $id = $this->em
+ ->getClassMetadata(get_class($this->owner))
+ ->getSingleIdReflectionProperty()
+ ->getValue($this->owner);
$builder = Criteria::expr();
$ownerExpression = $builder->eq($this->backRefFieldName, $id);
$expression = $criteria->getWhereExpression();
@@ -19,82 +19,11 @@
namespace Doctrine\ORM\Proxy;
-use Doctrine\ORM\Configuration;
-use Closure;
+use Doctrine\Common\Proxy\Autoloader as BaseAutoloader;
/**
- * Special Autoloader for Proxy classes because them not being PSR-0 compatible.
- *
- * @author Benjamin Eberlei <kontakt@beberlei.de>
+ * @deprecated use \Doctrine\Common\Proxy\Autoloader instead
*/
-class Autoloader
+class Autoloader extends BaseAutoloader
{
- /**
- * Resolves proxy class name to a filename based on the following pattern.
- *
- * 1. Remove Proxy namespace from class name
- * 2. Remove namespace seperators from remaining class name.
- * 3. Return PHP filename from proxy-dir with the result from 2.
- *
- * @param string $proxyDir
- * @param string $proxyNamespace
- * @param string $className
- *
- * @return string
- *
- * @throws ProxyException
- */
- static public function resolveFile($proxyDir, $proxyNamespace, $className)
- {
- if (0 !== strpos($className, $proxyNamespace)) {
- throw ProxyException::notProxyClass($className, $proxyNamespace);
- }
-
- $className = str_replace('\\', '', substr($className, strlen($proxyNamespace) +1));
- return $proxyDir . DIRECTORY_SEPARATOR . $className.'.php';
- }
-
- /**
- * Registers and returns autoloader callback for the given proxy dir and
- * namespace.
- *
- * @param string $proxyDir
- * @param string $proxyNamespace
- * @param \Closure $notFoundCallback Invoked when the proxy file is not found.
- *
- * @return \Closure
- */
- static public function register($proxyDir, $proxyNamespace, Closure $notFoundCallback = null)
- {
- $proxyNamespace = ltrim($proxyNamespace, "\\");
- $autoloader = function($className) use ($proxyDir, $proxyNamespace, $notFoundCallback) {
- if (0 === strpos($className, $proxyNamespace)) {
- $file = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className);
-
- if ($notFoundCallback && ! file_exists($file)) {
- $notFoundCallback($proxyDir, $proxyNamespace, $className);
- }
-
- require $file;
- }
- };
-
- spl_autoload_register($autoloader, true, true);
-
- return $autoloader;
- }
-
- /**
- * Registers and returns autoloader callback from a Configuration instance
- *
- * @param Configuration $config
- * @param \Closure $notFoundCallback
- *
- * @return \Closure
- */
- static public function registerFromConfiguration(Configuration $configuration, Closure $notFoundCallback)
- {
- return self::register($configuration->getProxyDir(), $configuration->getProxyNamespace(), $notFoundCallback);
- }
}
-
@@ -19,7 +19,7 @@
namespace Doctrine\ORM\Proxy;
-use Doctrine\Common\Persistence\Proxy as BaseProxy;
+use Doctrine\Common\Proxy\Proxy as BaseProxy;
/**
* Interface for proxy classes.
@@ -1,69 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace Doctrine\ORM\Proxy;
-
-/**
- * ORM Proxy Exception.
- *
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @link www.doctrine-project.com
- * @since 1.0
- * @author Benjamin Eberlei <kontakt@beberlei.de>
- */
-class ProxyException extends \Doctrine\ORM\ORMException
-{
- /**
- * @return ProxyException
- */
- public static function proxyDirectoryRequired()
- {
- return new self("You must configure a proxy directory. See docs for details");
- }
-
- /**
- * @return ProxyException
- */
- public static function proxyDirectoryNotWritable()
- {
- return new self("Your proxy directory must be writable.");
- }
-
- /**
- * @return ProxyException
- */
- public static function proxyNamespaceRequired()
- {
- return new self("You must configure a proxy namespace. See docs for details");
- }
-
- /**
- * @param $className
- * @param $proxyNamespace
- *
- * @return ProxyException
- */
- public static function notProxyClass($className, $proxyNamespace)
- {
- return new self(sprintf(
- "The class %s is not part of the proxy namespace %s",
- $className, $proxyNamespace
- ));
- }
-}
Oops, something went wrong.

4 comments on commit afee16e

Something in this PR seems to have broken lazy loading for me. Scenario: load Entity A by $em->find(), Access A->someAssociatedEntity->getId(), returns null instead of ID.

Prior to calling getId on the associated entity, var_dump shows the proxy as expected, with only the ID set. After calling getId, var_dump shows the now loaded proxy, with all properties set except the ID.

I'll try and write a test case for this this evening.

Owner

Ocramius replied Feb 19, 2013

@wschalle can you please file an issue on http://www.doctrine-project.org/jira/browse/DDC with the code causing this in your case? The identifier is set when the proxy is built and should never be unset later on.

The issue is in UnitOfWork.php, and I've pounded out a test case for this and created an issue.

DDC-2306

Thanks ---

Owner

Ocramius replied Feb 20, 2013

@wschalle thank you!

Please sign in to comment.