Аннотации доктрины odm или композитор autoload.php не работают?

Я пытаюсь использовать бета-версию 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 и т. д.), совсем не помогает. Я не уверен, какая другая информация была бы полезна, иначе я бы опубликовал ее.

Заранее спасибо.

Вы пробовали бегать composer dump-autoload (или что-то в этом роде)? Я помню, что у меня была такая же ошибка, и повторный дамп файла автозагрузки сработал. Обязательно обновите/установите все свои приложения перед запуском composer dump-autoload.

Etshy 15.03.2019 15:35

@Etshy Да, я это сделал, но я все еще понимаю Fatal error: Uncaught Error: Call to a member function add() on boolean, где работает код $loader->add('Documents', __DIR__);

klickers 17.03.2019 04:47

довольно странно. Что у тебя в C:/path/to/vendor/autoload.php? он должен содержать еще один require autoload_real.php и вызывать метод getLoader(), он есть в вашем случае?

Etshy 18.03.2019 19:41

Да, он содержит файл autoload_real.php и getLoader(). Выглядит примерно так: require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit[longstring]::getLoader();

klickers 19.03.2019 05:33

да вроде правильно. странно, что возвращенное $loader - это логическое значение. У вас есть класс в файле autoload_real.php ? в autoload_psr4.php у вас есть пространство имен Annotation в списке? В зависимости от вашей конфигурации он может загружаться из autoload_static.php вместо autoload_psr4.php, но обычно это autoload_psr4.php.

Etshy 19.03.2019 11:33

Да... в autoload_psr4.php есть строчка 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), и она же в autoload_static.php как 'Doctrine\\Common\\Annotations\\' => 28,. Как проверить свою конфигурацию? Я не знаю о классе в autoload_real.php. Спасибо!

klickers 19.03.2019 12:38

Я видел, что вы решили свою проблему с созданной вами проблемой mongodb github, поэтому напоминаем вам также добавить ответ здесь и пометить сообщение как решенное.

Etshy 24.05.2019 11:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
547
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме