doctrine/mongodb-odm

Call to a member function getClassAnnotations() on array

dq042000 opened this issue · 6 comments

Hi,

Running mongodb gives error:

<?php
$captchaImageMongo = new \Base\Document\CaptchaImage();
$captchaImageMongo->setFile($imgFile);
$captchaImageMongo->setSourceId($id);
$dm->persist($captchaImageMongo);
$dm->flush();

Error message:

app.error.file:
/var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Driver/AnnotationDriver.php : 81
        
app.error.message:
Call to a member function getClassAnnotations() on array
app.error.trace:
#0 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php(79): Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver->loadMetadataForClass('Base\\Document\\C...', Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata))
#1 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadataFactory.php(175): Doctrine\Persistence\Mapping\Driver\MappingDriverChain->loadMetadataForClass('Base\\Document\\C...', Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata))
#2 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php(414): Doctrine\ODM\MongoDB\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata), NULL, false, Array)
#3 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php(281): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('Base\\Document\\C...')
#4 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/DocumentManager.php(316): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('Base\\Document\\C...')
#5 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/UnitOfWork.php(1742): Doctrine\ODM\MongoDB\DocumentManager->getClassMetadata('Base\\Document\\C...')
#6 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/DocumentManager.php(469): Doctrine\ODM\MongoDB\UnitOfWork->persist(Object(Base\Document\CaptchaImage))
#7 /var/app/module/Base/src/Captcha/Mongo.php(43): Doctrine\ODM\MongoDB\DocumentManager->persist(Object(Base\Document\CaptchaImage))

Working environment:
PHP 8.1
doctrine/mongodb-odm 2.4.2

Thanks @dq042000 for the report! I'm afraid we can't do much without a failing test case. Please take a look at our functional test suite and send as a PR with a test reproducing issue you're facing.

Thanks @malarzm for the reply,

I found the problem, but I don't know where to set it?
./vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Driver/AnnotationDriver.php:58

public function __construct($reader, $paths = null)
{
        $this->reader = $reader;

        $this->addPaths((array) $paths);
}

print_r $this->reader:

Array
(
    [0] => module/Base/src/Document
)

This gives me the error message:

app.error.file:
/var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Driver/AnnotationDriver.php : 81
        
app.error.message:
Call to a member function getClassAnnotations() on array
app.error.trace:
#0 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php(79): Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver->loadMetadataForClass('Base\\Document\\C...', Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata))
#1 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadataFactory.php(175): Doctrine\Persistence\Mapping\Driver\MappingDriverChain->loadMetadataForClass('Base\\Document\\C...', Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata))
#2 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php(414): Doctrine\ODM\MongoDB\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ODM\MongoDB\Mapping\ClassMetadata), NULL, false, Array)
#3 /var/app/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php(281): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('Base\\Document\\C...')
#4 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/DocumentManager.php(316): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('Base\\Document\\C...')
#5 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/UnitOfWork.php(1742): Doctrine\ODM\MongoDB\DocumentManager->getClassMetadata('Base\\Document\\C...')
#6 /var/app/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/DocumentManager.php(469): Doctrine\ODM\MongoDB\UnitOfWork->persist(Object(Base\Document\CaptchaImage))
#7 /var/app/module/Base/src/Captcha/Mongo.php(43): Doctrine\ODM\MongoDB\DocumentManager->persist(Object(Base\Document\CaptchaImage))

but I add $reader = new AnnotationReader() to works fine:

public function __construct($reader, $paths = null)
{
        $reader = new AnnotationReader();
        $this->reader = $reader;

        $this->addPaths((array) $paths);
}

I'm sorry but I have no idea what are you trying to do

It seems you're using ODM directly? If so you can take a look at the Symfony's bundle or Laminas' module how to wire ODM.

Thanks @malarzm

For anybody that gets here and happens to use Laminas: doctrine/DoctrineModule#788