как часть разработки моей 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);
Кто переопределил сущности, которые доктрина призовет в связи с картиной, которую я посылаю ему (вы знаете, ту, которую я определил незадолго до этого)).
Этим я даю возможность переопределить сущности с одинаковыми именами.
Что делать ?? .. Признаюсь, что больше не могу сделать ...
Заранее спасибо друзья;)