2012-04-06 18 views
5

Qualcuno sa se è possibile utilizzare un bundle per utilizzare il lettore di annotazioni per leggere nuove annotazioni personalizzate per oggetti non di Doctrine? Tutto ciò che ho visto finora è per un controller o per estendere Doctrine in qualche modo.Symfony2 annotazioni personalizzate per gli oggetti

Quello che mi piacerebbe essere in grado di fare è qualcosa di simile:

class MyTestClass { 

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

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

E poi avere un po 'di codice che quando dato un esempio di MyTestClass potrebbe capire quale l'annotazione applicata al quale attributo.

risposta

10

Giusto, un po 'di più su come Doctrine fa questo e penso di sapere come farlo. Quindi, se qualcun altro ha bisogno di fare questo, ecco come lo sto facendo (apprezzerei qualsiasi feedback)

Ho un servizio che sto usando per leggere le annotazioni così in config.yml ho incluso il annotation_reader servizio che fornisce l'accesso ai metodi per leggere le annotazioni.

Ogni annotazione deve risolvere a una classe e la classe deve estendere la classe di annotazione dottrina di base, in modo da fare l'annotazione Foo dalla mia domanda si farebbe qualcosa di simile:

namespace MyBundleName 

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

} 

Poi si può leggere le annotazioni facendo:

$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 
} 

Spero che possa essere utile a qualcun altro!

Problemi correlati