annotations icon indicating copy to clipboard operation
annotations copied to clipboard

DCOM-165: Entities seems not be recognized by AnnotationDriver

Open guilhermeblanco opened this issue 9 years ago • 1 comments

From @doctrinebot on September 2, 2012 20:7

Jira issue originally created by user maartendekeizer:

Problem:

"$em->getMetadataFactory()->getAllMetadata()" Will result in an empty array. The entitiy manager is correctly configured and the entities files are loaded (echo's in the files will be displayed).

Debug steps:

Looking in the code for the problem I created the following debug points first:

file AnnotationDriver.php method getAllClassNames() after the line: "$includedFiles[] = $sourceFile;" add: "echo $sourceFile . ' is loaded' . PHP_EOL;"

file AnnotationDriver.php method getAllClassNames() after the line: "$sourceFile = $rc->getFileName();" add: "echo $className . ' is loaded from: ' . $sourceFile . ' in the includedFiles array? ' . (in_array($sourceFile, $includedFiles) ? 'YES' : 'not found :-(') . PHP_EOL;"

the following output will be displayed: ... f:\workspace\nl.markei.posto-2.3\lib\relaties\Contact.php is loaded ... nl\markei\posto\relaties\Contact is loaded from: F:\workspace\nl.markei.posto-2.3\lib\relaties\Contact.php in the includedFiles array? not found :-(

It seems that Doctrine includes the file from f: but ReflectionClass say it is loaded from F:. The in_array() will fail and Doctrine will not recognized the entity.

But this is not the full problem. I created a new debug point:

file AnnotationDriver.php method getAllClassNames() after the line: "foreach ($this->_paths as $path) {" add: "echo 'path: ' . $path . ' after realpath: ' . realpath($path) . PHP_EOL;"

This will result in the following output: "path: F:\domains\markei.nl\lib\nl.markei.posto\ after realpath: f:\workspace\nl.markei.posto-2.3\lib"

So the conversion of the F: to f: is done by realpath; its look like :-)

A simple fix should be in AnnotationDriver.php / getAllClassNames() replace: "$sourceFile = $rc->getFileName();" by: "$sourceFile = realpath($rc->getFileName());"

After I did that, the problem still exists. So I add to echo's (one with realpath and one without at the part of the code). And both echo's result in a path starting with "F:".

So my first reaction was freaky!

After some frustrating hours I found the problem in the symlink I used. "F:\domains\markei.nl\lib\nl.markei.posto" was a symlink to "f:\workspace\nl.markei.posto-2.3\lib" and realpath will not convert the driver char in the target of the symlink for some freaky reason. After changing the symlink target to "F:\workspace...." everything works fine.

Summary:

realpath results are not consistent on Windows. This will resulting in problems under Windows.

Possible solutions:

Saying "this is a PHP bug". It is possible that there are more case sensitive problems hidding here on Windows. Maybe it is better to use (for Windows only!) a case insensitive in_array-alternative in AnnotationDriver.php getAllClassNames() (or convert all paths for to lowercase for Windows)

Copied from original issue: doctrine/common#466

guilhermeblanco avatar Mar 27 '16 03:03 guilhermeblanco

From @doctrinebot on January 23, 2013 23:6

Comment created by @ocramius:

[~maartendekeizer] looks like the issue is still there in doctrine/annotations. Are you able to come up with a failing test case?

guilhermeblanco avatar Mar 27 '16 03:03 guilhermeblanco