Symfony 4 Проблема пользовательских аннотаций @ORM \ Entity не существует - PullRequest
0 голосов
/ 06 ноября 2019

как часть разработки моей CMS, которую я публикую через некоторое время .. Я столкнулся с проблемой.

ошибка:

[Семантическая ошибка] Аннотация "@Doctrine \ ORM \ Mapping \ Entity" в классе ScyLabs \ GiftCodeBundle \ Entity \ GiftCode не существует или не может бытьавтоматически загружается.

Я объясняю вам,

В принципе, в проекте все является переопределенным, это уже имеет место, с конфигурациями в файле services.yaml.

По очевидным причинам простоты и насущной необходимости позволить мне создать второй пакет, унаследованный от него. Я сказал себе, что делать свое «Переопределение» или говорить проекту: «Привет, я здесь, я использую класс» очень удобно с аннотациями (и намного понятнее).

Итак, я создаюпользовательская аннотация (пока все хорошо ..), которую вы найдете здесь ..

<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 04/11/2019
 * Time: 14:25
 */

namespace ScyLabs\NeptuneBundle\Annotation\ScyLabsNeptune;


/**
 * @Annotation
 * @Target({"CLASS"})
 * @Attributes({
 *  @Attribute("key",type="string"),
 *  @Attribute("classNameSpace",type="string"),
 * })
 */
class Override
{
    /**
     * @var string
     */
    public $key;
    /**
     * @var string
     */
    public $classNameSpace;

    public function __construct(array $opts) {

        $this->key = $opts['value'];
        $this->classNameSpace = $opts['class'];

    }
}

Ну, моя аннотация была на месте, сейчас я помещу ее в сущность, .. Как здесь

<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 05/11/2019
 * Time: 10:20
 */

namespace ScyLabs\GiftCodeBundle\Entity;

use ScyLabs\NeptuneBundle\Annotation\ScyLabsNeptune;
use Doctrine\ORM\Mapping as ORM;

/**
 *  @ScyLabsNeptune\Override("gift",class="ScyLabs\GiftCodeBundle\Entity\GiftCode")
 *  @ORM\Entity()
 */
class GiftCode
{

}

Зачем это? И на самом деле, в Нептуне все автоматизировано, за исключением особого случая, он автоматически сгенерирует все URL-адреса, необходимые для правильного функционирования объекта (ADD / EDIT / DELETE / LIST) ... И для этого он должен указывать напроект, в котором сущность существует, и что она должна быть частью этой системы.

Итак, до сих пор я использую очень полную конфигурацию в services.yaml, в которой я заполняю таблицу keys = = value, соответствующуюto "key" => "Пространство имен"

В моем случае: "gift" => "ScyLabs \ GiftCodeBundle \ Entity \ GiftCode"

Короче, неожиданно для переопределения я делаюобработка на этапе компиляции

<?php
/**
 * Created by PhpStorm.
 * User: alex
 * Date: 01/08/2018
 * Time: 09:46
 */

namespace ScyLabs\NeptuneBundle;


class ScyLabsNeptuneBundle extends Bundle
{
    public function getContainerExtension()
    {

// Compilation de l'extension
        return new ScyLabsNeptuneExtension();
    }
}

И в этом расширении у меня есть этот фрагмент кода, который делает все

$bundles = require $projectDir.'/config/bundles.php';

        foreach ($bundles as $bundle => $env){

            if($bundle === ScyLabsNeptuneBundle::class)
                continue;
            if(method_exists(new $bundle,'getParent') && (new $bundle)->getParent() === ScyLabsNeptuneBundle::class){


                $reader = new AnnotationReader();

                $reflClass = new \ReflectionClass(GiftCode::class);

                $classAnotations = $reader->getClassAnnotation($reflClass,"Override");

                foreach ($classAnotations as $classAnotation){
                    if($classAnotation instanceof Override && class_exists($classAnotation->classNameSpace)){
                        $config['override'][$classAnotation->key] = $classAnotation->classNameSpace;                    }
                }
            }
        }

Из того, что я подозреваю после многих исследований, во время компиляцииЭтап моего расширения, @ORM \ Entity и / или Autowire, кажется, еще не скомпилирован.

Проблема в том, что внезапно, когда я получаю свою личную аннотацию (Override), я не могу восстановить@ORM \ Entity, и я не могу удалить его, потому что он больше не будет работать как объект.

Зачем это здесь? Потому что позади у меня есть еще один шаг к объединению (CompilationPass)

$container->addCompilerPass(new ResolveDoctrineTargetEntitiesPass(),PassConfig::TYPE_BEFORE_OPTIMIZATION,1000);

Кто переопределил сущности, которые доктрина призовет в связи с картиной, которую я посылаю ему (вы знаете, ту, которую я определил незадолго до этого)).

Этим я даю возможность переопределить сущности с одинаковыми именами.

Что делать ?? .. Признаюсь, что больше не могу сделать ...

Заранее спасибо друзья;)

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

спасибо за ваш ответ.

Но это не работает, и эта функция устарела и удалена в Аннотации 2.0.

НО, когда я пытаюсь найти разрешение.

Когда я перехожу по вашей ссылке и пробую код на странице, я пробую эту функцию

AnnotationRegistry#registerFile($file)

Для получения пути к файлу @ORM \ Entity я использую

new \ReflectionClass(ORM\Entity::class);

И, эта работа. Я удалил функцию AnnotationRegistry#registerFile($file), и эта работа.

Спасибо за помощь;) Ты лучший

0 голосов
/ 06 ноября 2019

По умолчанию программа чтения аннотаций не использует тот же автозагрузчик, что и классы. Вы должны сказать ему, как загрузить класс аннотаций следующим образом:

AnnotationRegistry::registerUniqueLoader('class_exists');

Для более подробного объяснения вы можете посмотреть на doc https://www.doctrine -project.org / projects / doctrine-annotations /ан / 1,6 / annotations.html # регистрирующий-аннотаций

...