доктрина odm аннотации или композитор autoload.php не работает? - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь использовать бета-версию Doctrine MongoDB ODM 2.0 в проекте с каркасом Yii2, с версией Composer 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);

Я уже пытался посмотреть Как правильно автозагрузить аннотации Doctrine ODM? и 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, но затем у меня возникла проблема

[Семантическая ошибка] Аннотация "@Doctrine \ ODM \ MongoDB \ Mapping \ Annotations \ Document" в классе Documents \ Message не существует или не может быть загружена автоматически.

Итаканнотации не загружаются автоматически, и я понятия не имею, как это исправить.В модели, которую я имею:

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

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

1 Ответ

0 голосов
/ 27 мая 2019

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

...