# Annotation reference Bellow you will find all annotation descriptions used in these extensions. There will be introduction on usage with examples. For more detailed usage on extensions, refer to their specific documentation. [blog_reference]: http://gediminasm.org/article/annotation-reference-for-extensions "Doctrine2 extensions annotation reference and examples" Content: - Best [practices](#em-setup) for setting up - [Tree](#gedmo-tree) - [Translatable](#gedmo-translatable) - [Sluggable](#gedmo-sluggable) - [Timestampable](#gedmo-timestampable) - [Loggable](#gedmo-loggable) ## Annotation mapping Starting from **doctrine2.1.x** versions you have to import all used annotations by an **use** statement, see example bellow: ``` php namespace MyApp\Entity; use Gedmo\Mapping\Annotation as Gedmo; // this will be like an alias for Gedmo extensions annotations use Doctrine\ORM\Mapping\Id; // includes single annotation use Doctrine\ORM\Mapping as ORM; // alias for doctrine ORM annotations /** * @ORM\Entity * @Gedmo\TranslationEntity(class="something") */ class Article { /** * @Id * @Gedmo\Slug(fields={"title"}, updatable=false, separator="_") * @ORM\Column(length=32, unique=true) */ private $id; /** * @Gedmo\Translatable * @ORM\Column(length=64) */ private $title; /** * @Gedmo\Timestampable(on="create") * @ORM\Column(type="datetime") */ private $created; } ``` **Note:** this mapping applies only if you use **doctrine-common** library at version **2.1.x** or higher, extension library still supports old mapping styles if you manually set the mapping drivers ## Best practices for setting up with annotations New annotation reader does not depend on any namespaces, for that reason you can use single reader instance for whole project. The example bellow shows how to setup the mapping and listeners: **Note:** using this repository you can test and check the [example demo configuration](https://github.com/l3pp4rd/DoctrineExtensions/blob/master/example/em.php) ``` php addDriver($annotationDriver, 'Entity'); // general ORM configuration $config = new Doctrine\ORM\Configuration; $config->setProxyDir(sys_get_temp_dir()); $config->setProxyNamespace('Proxy'); $config->setAutoGenerateProxyClasses(false); // this can be based on production config. // register metadata driver $config->setMetadataDriverImpl($driverChain); // use our allready initialized cache driver $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); // create event manager and hook prefered extension listeners $evm = new Doctrine\Common\EventManager(); // gedmo extension listeners, remove which are not used // sluggable $sluggableListener = new Gedmo\Sluggable\SluggableListener; // you should set the used annotation reader to listener, to avoid creating new one for mapping drivers $sluggableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($sluggableListener); // tree $treeListener = new Gedmo\Tree\TreeListener; $treeListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($treeListener); // loggable, not used in example $loggableListener = new Gedmo\Loggable\LoggableListener; $loggableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($loggableListener); // timestampable $timestampableListener = new Gedmo\Timestampable\TimestampableListener; $timestampableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($timestampableListener); // translatable $translatableListener = new Gedmo\Translatable\TranslatableListener; // current translation locale should be set from session or hook later into the listener // most important, before entity manager is flushed $translatableListener->setTranslatableLocale('en'); $translatableListener->setDefaultLocale('en'); $translatableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($translatableListener); // sortable, not used in example $sortableListener = new Gedmo\Sortable\SortableListener; $sortableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($sortableListener); // mysql set names UTF-8 if required $evm->addEventSubscriber(new Doctrine\DBAL\Event\Listeners\MysqlSessionInit()); // DBAL connection $connection = array( 'driver' => 'pdo_mysql', 'host' => '127.0.0.1', 'dbname' => 'test', 'user' => 'root', 'password' => '' ); // Finally, create entity manager $em = Doctrine\ORM\EntityManager::create($connection, $config, $evm); ``` **Note:** that symfony2 StofDoctrineExtensionsBundle does it automatically this way you will maintain a single instance of annotation reader. It relates only to doctrine-common-2.1.x branch and newer. ## Tree annotations Tree can use diferent adapters. Currently **Tree** extension supports **NestedSet** and **Closure** strategies which has a difference for annotations used. Note, that tree will automatically map indexes which are considered necessary for best performance. ### @Gedmo\Mapping\Annotation\Tree (required for all tree strategies) **class** annotation Is the main identificator of tree used for domain object which should **act as Tree**. **options:** - **type** - (string) _optional_ default: **nested** example: ``` php ## Translatable annotations Translatable additionaly can have unmapped property, which would override the locale used by listener. ### @Gedmo\Mapping\Annotation\TranslationEntity (optional) **class** annotation This class annotation can force translatable to use **personal Entity** to store translations. In large tables this can be very handy. **options:** - **class** - (string) _required_ example: ``` php ## Sluggable annotations Sluggable ensures unique slugs and correct length of the slug. It also uses utf8 to ascii table map to create correct ascii slugs. ### @Gedmo\Mapping\Annotation\Slug (required) **property** annotation It will use this **string** property to store the generated slug. **options:** - **fields** - (array) _required_, must at least contain one field - **updatable** - (boolean) _optional_ default: **true** - **separator** - (string) _optional_ default: **-** - **unique** - (boolean) _optional_ default: **true** - **style** - (string) _optional_ default: **default** lowercase, can be **camel** also - **handlers** - (array) _optional_ default: empty array, refer to the documentation below, possible elements: **Gedmo\Mapping\Annotation\SlugHandler** ### Slug handlers: - Gedmo\Sluggable\Handler\TreeSlugHandler - transforms a tree slug into path based, example "food/fruits/apricots/king-apricots" - Gedmo\Sluggable\Handler\RelativeSlugHandler - takes a raliotion slug and prefixes the slug, example "singers/michael-jackson" in order to synchronize updates regarding the relation changes, you will need to hood **InversedRelativeSlugHandler** to the relation mentioned. - Gedmo\Sluggable\Handler\InversedRelativeSlugHandler - updates prefixed slug for an inversed relation which is mapped by **RelativeSlugHandler** examples: ``` php ## Timestampable annotations Timestampable will update date fields on create, update or property change. If you set/force date manualy it will not update it. ### @Gedmo\Mapping\Annotation\Timestampable (required) **property** annotation Marks a **date, datetime or time** field as timestampable. **options:** - **on** - (string) _optional_ default: **update**, other choise is **create** or **change** - **field** - (string) _conditional_ required only if it triggers on **change**, name of the **field** or if it is a relation **property.field** - **value** - (mixed) _conditional_ required only if it triggers on **change**, value of property which would trigger an update. example: ``` php ## Loggable annotations Loggable is used to log all actions made on annotated object class, it logs insert, update and remove actions for a username which currently is logged in for instance. Further more, it stores all **Versioned** property changes in the log which allows a version management implementation for this object. ### @Gedmo\Mapping\Annotation\Loggable (required) **class** annotation This class annotation marks object as being loggable and logs all actions being done to this class records. **options:** - **logEntryClass** - (string) _optional_ personal log storage class example: ``` php