Определите, какие классы имеют аннотацию, и получите значение свойств, которые также имеют аннотацию - PullRequest
0 голосов
/ 14 июля 2020

Я читал это doctrine do c, чтобы использовать пользовательские аннотации в моем проекте, но я не совсем понял, что делать, я вроде тупой

Мой оригинал Идея заключалась в создании производителя форматов. Что-то вроде написания некоторого текста, затем некоторых переменных, окруженных фигурными скобками, а затем переменных с фактическим значением, я хочу, чтобы моя система знала, какие классы можно использовать для форматирования и какие из его свойств может использовать система.

Предположим, что на этом изображении всегда извлекается объект с идентификатором 1, и этот идентификатор всегда существует (забыл его нарисовать)

example of what I want to do

What I want to do is to have one or more classes with an annotations and then identify which of the classes have that annotation and let me know which classes they are. In the example from above those available classes should be in the dropdown

/*
 * @Format
*/
public class Pizza {
    public $hasCheese;
    /*
     * @FormatField("pizzaPrice")
    */
    public $price;

Предположим У меня есть несколько классов, и единственный, у которого есть моя аннотация Format, и некоторые из его свойств имеют аннотацию FormatField, тогда я хотел бы иметь способ сообщить мне что-то вроде "It looks like the class Pizza can be used in a Format", а затем какие свойства доступны для форматирования, те, которые имеют FormatField, а затем каким-то образом извлекают значение этого свойства через псевдоним pizzaPrice

Я написал этот псевдокод, чтобы, надеюсь, лучше проиллюстрировать то, что я хочу узнать

var availableClasses = getClassesThatHaveFormatAnnotation();
foreach (availableClasses as availableClass) {
    var properties = availableClass.findFormatFields()
    print("Looks like the " + availableClass->name + " class has the Format annotation")
    foreach (properties as property) {
        print("Field available: " + property.name)
        print("Value: " + property.value)
    }
}
var pizza = findPizzaById(1);

Имея эту пиццу, я хочу иметь доступ только к свойствам, над которыми есть @FormatField. через его псевдоним, например {{pizzaPrice}}, но {{hasCheese}} не должен работать, потому что у него нет аннотации @FormatField;

1 Ответ

0 голосов
/ 15 июля 2020

Вот пример кода, который находит объекты и их аннотированные свойства. Результат можно куда-нибудь выложить. Но без замены аннотированного объекта вам будут доступны все свойства, поэтому, возможно, вам нужно создать прослушиватель, который будет прослушивать событие ядра symfony и изменять данные вашего ответа.

    $annotationReader = new \Doctrine\Common\Annotations\AnnotationReader();

    $entities = [];
    foreach ($entities as $entity) {
        $reflectionClass = new \ReflectionClass($entity);
        if (empty($annotationReader->getClassAnnotation($reflectionClass, CustomAnnotation::class))) {
            continue;
        }

        foreach ($reflectionClass->getProperties() as $property) {
            if (empty($annotationReader->getPropertyAnnotation($property, CustomPropertyAnnotation::class))) {
                continue;
            }

            $propertyName = $property->getName();
            $propertyValue = $property->getValue($entity);
        }
    }
...