Я пытаюсь использовать бета-версию Doctrine MongoDB ODM 2.0 в проекте с инфраструктурой Yii2, с версией композитора 1.8.4 и PHP 7.2, но я продолжаю получать сообщение об ошибке Fatal error: Uncaught Error: Call to a member function add() on boolean, где выполняется код $loader->add('Documents', __DIR__);
bootstrap.php файл (в DIR/bootstrap.php):
<?php
use Doctrine\Common\Annotations\AnnotationRegistry;
use Doctrine\ODM\MongoDB\Configuration;
use Doctrine\ODM\MongoDB\DocumentManager;
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;
if ( ! file_exists($file = 'C:/path/to/vendor/autoload.php')) {
throw new RuntimeException('Install dependencies to run this script.');
}
$loader = require_once $file;
$loader->add('Documents', __DIR__);
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
$config = new Configuration();
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Proxies');
$config->setHydratorDir(__DIR__ . '/Hydrators');
$config->setHydratorNamespace('Hydrators');
$config->setDefaultDB('fsa');
$config->setMetadataDriverImpl(AnnotationDriver::create(__DIR__ . '/Documents'));
$dm = DocumentManager::create(null, $config);
Я уже пытался искать Как правильно загружать аннотации ODM Autoload Doctrine? и Laravel & Couchdb-ODM — аннотация «@Doctrine\ODM\CouchDB\Mapping\Annotations\Document» не существует или не может быть загружена автоматически и множество других потоков, которые я не могу вспомнить, чтобы получить помощь, но я не смог найти решение.
Я также попытался прокомментировать строки ниже
if ( ! file_exists($file = 'C:/path/to/vendor/autoload.php')) {
throw new RuntimeException('Install dependencies to run this script.');
}
$loader = require_once $file;
$loader->add('Documents', __DIR__);
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
и запустил composer dump-autoload и в командной строке он вернул Generated autoload files containing 544 classes, но потом у меня возникла проблема
[Semantical Error] The annotation "@Doctrine\ODM\MongoDB\Mapping\Annotations\Document" in class Documents\Message does not exist, or could not be auto-loaded.
Так что аннотации не загружаются автоматически, и я понятия не имею, как это исправить. В модели у меня есть:
<?php
namespace Documents;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use \Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
/** @ODM\Document */
class Message
{
/** @ODM\Id */
private $id;
/** @ODM\Field(type = "int") */
private $sender_id;
...
Я также разместил ветку на github по адресу https://github.com/doctrine/mongodb-odm/issues/1976. Один комментатор заявил, что «По умолчанию файл автозагрузки композитора возвращает рассматриваемый автозагрузчик, что, похоже, не относится к вам». Как я могу это исправить? Единственная информация, которую я могу найти в Интернете, это поместить (внутри composer.json) строки:
"autoload": {
"psr-4": {
"Class\\": "src/"
}
},
но тогда какой класс я должен загружать?
Я очень запутался, и то, что я новичок во всех этих инструментах (mongodb, yii2 и т. д.), совсем не помогает. Я не уверен, какая другая информация была бы полезна, иначе я бы опубликовал ее.
Заранее спасибо.
@Etshy Да, я это сделал, но я все еще понимаю Fatal error: Uncaught Error: Call to a member function add() on boolean, где работает код $loader->add('Documents', __DIR__);
довольно странно. Что у тебя в C:/path/to/vendor/autoload.php? он должен содержать еще один require autoload_real.php и вызывать метод getLoader(), он есть в вашем случае?
Да, он содержит файл autoload_real.php и getLoader(). Выглядит примерно так: require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit[longstring]::getLoader();
да вроде правильно. странно, что возвращенное $loader - это логическое значение. У вас есть класс в файле autoload_real.php ? в autoload_psr4.php у вас есть пространство имен Annotation в списке? В зависимости от вашей конфигурации он может загружаться из autoload_static.php вместо autoload_psr4.php, но обычно это autoload_psr4.php.
Да... в autoload_psr4.php есть строчка 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), и она же в autoload_static.php как 'Doctrine\\Common\\Annotations\\' => 28,. Как проверить свою конфигурацию? Я не знаю о классе в autoload_real.php. Спасибо!
Я видел, что вы решили свою проблему с созданной вами проблемой mongodb github, поэтому напоминаем вам также добавить ответ здесь и пометить сообщение как решенное.






Получается, что проблема (как упоминалось в https://github.com/doctrine/mongodb-odm/issues/1976) заключалась в том, что autoload.php требовалось дважды — один раз в bootstrap.php и один раз в web/index.php (фреймворка). После удаления строки require в index.php все заработало нормально.
Вы пробовали бегать
composer dump-autoload(или что-то в этом роде)? Я помню, что у меня была такая же ошибка, и повторный дамп файла автозагрузки сработал. Обязательно обновите/установите все свои приложения перед запускомcomposer dump-autoload.