2012-04-06 5 views
5

Кто-нибудь знает, возможно ли, чтобы в комплекте с помощью читателя аннотаций можно было читать новые пользовательские аннотации для объектов без доктрины? Все, что я видел до сих пор, либо для контроллера, либо для того, чтобы каким-то образом расширить Доктрина.Пользовательские аннотации Symfony2 для объектов

То, что я хотел бы быть в состоянии сделать что-то вроде этого:

class MyTestClass { 

    /** 
    * @MyBundleName\Foo 
    */ 
    public $foo_var; 

    /** 
    * @MyBundleName\Bar 
    */ 
    public $bar_var; 
} 

И тогда есть некоторый код, который, когда данный экземпляр MyTestClass может работать, какие аннотации применительно к какому атрибуту.

ответ

10

Правильно, немного больше вникаем в то, как это делает Доктрина, и я думаю, что знаю, как это сделать. Так что, если кому-то еще нужно это сделать, вот как я это делаю (будем благодарны за любую обратную связь)

У меня есть служба, которую я использую для чтения аннотаций, поэтому в config.yml Я включил annotation_reader, который предоставляет доступ к методам для чтения ваших аннотаций.

Каждый аннотаций должен разрешаться в класс и класс должен расширить класс аннотаций базы Doctrine, так что сделать аннотацию Foo от моего вопроса вы могли бы сделать что-то вроде:

namespace MyBundleName 

class Foo extends \Doctrine\Common\Annotations\Annotation { 

} 

Тогда вы можете прочитать аннотации:

$class = get_class($object); 
foreach(object_get_vars($object) as $fieldname => $val){ 

    //$this->annotationReader is an instance of the annotation_reader service 
    $annotations = $this->annotationReader 
        ->getPropertyAnnotations(
         new \ReflectionProperty($class, $fieldName) 
        ); 

    //$annotations will now contain an array of matched annotations, most likely just an instance of the annotation class created earlier 
} 

Надеюсь, что это может быть полезно кому-то еще!

Смежные вопросы