From 773f56bef2e2ef02c01c05e2121a842e39d0ab65 Mon Sep 17 00:00:00 2001 From: Christian Heinrich Date: Thu, 20 May 2010 15:16:55 +0200 Subject: [PATCH 1/2] Fixed #DDC-597 Added a test on public properties in entities. I did not check whether these properties are actually mapped to a column because personally, I believe that within an entity, there should only be protected / private members. Signed-off-by: David Abdemoulaie --- lib/Doctrine/ORM/Tools/SchemaValidator.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/SchemaValidator.php b/lib/Doctrine/ORM/Tools/SchemaValidator.php index 3df2e3497..802f30fe5 100644 --- a/lib/Doctrine/ORM/Tools/SchemaValidator.php +++ b/lib/Doctrine/ORM/Tools/SchemaValidator.php @@ -55,12 +55,13 @@ class SchemaValidator /** * Checks the internal consistency of mapping files. * - * There are several checks that can't be done at runtime or are to expensive, which can be verified + * There are several checks that can't be done at runtime or are too expensive, which can be verified * with this command. For example: * * 1. Check if a relation with "mappedBy" is actually connected to that specified field. * 2. Check if "mappedBy" and "inversedBy" are consistent to each other. * 3. Check if "referencedColumnName" attributes are really pointing to primary key columns. + * 4. Check if there are public properties that might cause problems with lazy loading. * * @return array */ @@ -71,9 +72,9 @@ class SchemaValidator $classes = $cmf->getAllMetadata(); foreach ($classes AS $class) { + $ce = array(); /* @var $class ClassMetadata */ foreach ($class->associationMappings AS $fieldName => $assoc) { - $ce = array(); if (!$cmf->hasMetadataFor($assoc->targetEntityName)) { $ce[] = "The target entity '" . $assoc->targetEntityName . "' specified on " . $class->name . '#' . $fieldName . ' is unknown.'; } @@ -171,10 +172,16 @@ class SchemaValidator } } } + } - if ($ce) { - $errors[$class->name] = $ce; - } + foreach ($class->reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $publicAttr) { + $ce[] = "Attribute '".$publicAttr->getName()."' in class '".$class->name."' is marked as public. Make sure you initialize your entities manually" + ." before accessing these properties or you will experience strange behaviour as using public properties will disallow Doctrine to use lazy loading. The Doctrine Team strongly" + ." recommends using protected / private properties on entities only. See the manual for more detailed information."; + } + + if ($ce) { + $errors[$class->name] = $ce; } } @@ -183,7 +190,7 @@ class SchemaValidator /** * Check if the Database Schema is in sync with the current metadata state. - * + * * @return bool */ public function schemaInSyncWithMetadata() From 45ec58fc7ece2a314f250d377eec81d86c181cdb Mon Sep 17 00:00:00 2001 From: Christian Heinrich Date: Thu, 20 May 2010 23:50:59 +0200 Subject: [PATCH 2/2] Updated message and added behaviour for public static vars Signed-off-by: David Abdemoulaie --- lib/Doctrine/ORM/Tools/SchemaValidator.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/SchemaValidator.php b/lib/Doctrine/ORM/Tools/SchemaValidator.php index 802f30fe5..5fbe6fc72 100644 --- a/lib/Doctrine/ORM/Tools/SchemaValidator.php +++ b/lib/Doctrine/ORM/Tools/SchemaValidator.php @@ -175,9 +175,10 @@ class SchemaValidator } foreach ($class->reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $publicAttr) { - $ce[] = "Attribute '".$publicAttr->getName()."' in class '".$class->name."' is marked as public. Make sure you initialize your entities manually" - ." before accessing these properties or you will experience strange behaviour as using public properties will disallow Doctrine to use lazy loading. The Doctrine Team strongly" - ." recommends using protected / private properties on entities only. See the manual for more detailed information."; + if ($publicAttr->isStatic()) { + continue; + } + $ce[] = "Field '".$publicAttr->getName()."' in class '".$class->name."' must be private or protected. Public fields break lazy-loading."; } if ($ce) {