[FEATURE] Add methods to get class tag values via reflection 14/32714/10
authorFrank Nägler <typo3@naegler.net>
Wed, 10 Sep 2014 20:30:54 +0000 (22:30 +0200)
committerMarkus Klein <klein.t3@reelworx.at>
Sun, 26 Oct 2014 17:14:58 +0000 (18:14 +0100)
This patch adds ReflectionService::getClassTagsValues($className) and
ReflectionService::getClassTagValues($className, $tag) to get class
tag values via reflection.

Also the unit test changed to test the new methods.

Resolves: #60822
Releases: master
Change-Id: I45962c30f2559ad1b10fe33a64c541425c80db90
Reviewed-on: http://review.typo3.org/32714
Reviewed-by: Alexander Opitz <opitz.alexander@googlemail.com>
Tested-by: Alexander Opitz <opitz.alexander@googlemail.com>
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
typo3/sysext/core/Documentation/Changelog/master/Feature-60822-AddMethodsToGetClassTagValuesViaReflection.rst [new file with mode: 0644]
typo3/sysext/extbase/Classes/Reflection/ReflectionService.php
typo3/sysext/extbase/Tests/Unit/Reflection/ReflectionServiceTest.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-60822-AddMethodsToGetClassTagValuesViaReflection.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-60822-AddMethodsToGetClassTagValuesViaReflection.rst
new file mode 100644 (file)
index 0000000..ecee642
--- /dev/null
@@ -0,0 +1,35 @@
+=================================================================
+Feature: #60822 - Class annotations in extbase reflection service
+=================================================================
+
+Description
+===========
+
+The extbase reflection service can now return tags/annotations added to a class.
+
+Suppose the given class:
+
+::
+
+/**
+ * @SomeClassAnnotation A value
+ */
+ class Foo {
+ }
+
+..
+
+Those annotation can be fetched with the reflection service:
+
+::
+
+$service = new \TYPO3\CMS\Extbase\Reflection\ReflectionService();
+$classValues = $service->getClassTagsValues('Foo');
+$classValue = $service->getClassTagValue('Foo', 'SomeClassAnnotation');
+
+..
+
+Impact
+======
+
+Getting class tags by ReflectionService is now possible.
index 7fc4e32..edcbecf 100644 (file)
@@ -192,6 +192,39 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
        }
 
        /**
+        * Returns all tags and their values the specified class is tagged with
+        *
+        * @param string $className Name of the class
+        * @return array An array of tags and their values or an empty array if no tags were found
+        */
+       public function getClassTagsValues($className) {
+               if (!isset($this->reflectedClassNames[$className])) {
+                       $this->reflectClass($className);
+               }
+               if (!isset($this->classTagsValues[$className])) {
+                       return array();
+               }
+               return isset($this->classTagsValues[$className]) ? $this->classTagsValues[$className] : array();
+       }
+
+       /**
+        * Returns the values of the specified class tag
+        *
+        * @param string $className Name of the class containing the property
+        * @param string $tag Tag to return the values of
+        * @return array An array of values or an empty array if the tag was not found
+        */
+       public function getClassTagValues($className, $tag) {
+               if (!isset($this->reflectedClassNames[$className])) {
+                       $this->reflectClass($className);
+               }
+               if (!isset($this->classTagsValues[$className])) {
+                       return array();
+               }
+               return isset($this->classTagsValues[$className][$tag]) ? $this->classTagsValues[$className][$tag] : array();
+       }
+
+       /**
         * Returns the names of all properties of the specified class
         *
         * @param string $className Name of the class to return the property names of
@@ -225,7 +258,6 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
         * @param string $className Name of the class containing the method
         * @param string $methodName Name of the method
         * @return boolean
-        * @api
         */
        public function hasMethod($className, $methodName) {
                try {
@@ -303,7 +335,6 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
         * @param string $propertyName Name of the tagged property
         * @param string $tag Tag to return the values of
         * @return array An array of values or an empty array if the tag was not found
-        * @api
         */
        public function getPropertyTagValues($className, $propertyName, $tag) {
                if (!isset($this->reflectedClassNames[$className])) {
@@ -321,7 +352,6 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
         *
         * @param string $className Name of the class
         * @return boolean If the class is reflected by this service
-        * @api
         */
        public function isClassReflected($className) {
                return isset($this->reflectedClassNames[$className]);
@@ -333,7 +363,6 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
         * @param string $className Name of the class
         * @param string $tag Tag to check for
         * @return boolean TRUE if the class is tagged with $tag, otherwise FALSE
-        * @api
         */
        public function isClassTaggedWith($className, $tag) {
                if ($this->initialized === FALSE) {
@@ -355,7 +384,6 @@ class ReflectionService implements \TYPO3\CMS\Core\SingletonInterface {
         * @param string $propertyName Name of the property
         * @param string $tag Tag to check for
         * @return boolean TRUE if the class property is tagged with $tag, otherwise FALSE
-        * @api
         */
        public function isPropertyTaggedWith($className, $propertyName, $tag) {
                if (!isset($this->reflectedClassNames[$className])) {
index f03ef18..2da992b 100644 (file)
@@ -13,11 +13,16 @@ namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection;
  *
  * The TYPO3 project - inspiring people to share!
  */
+use TYPO3\CMS\Core\Tests\UnitTestCase;
+use TYPO3\CMS\Extbase\Reflection\ReflectionService;
 
 /**
  * Test case
+ * @firsttest test for reflection
+ * @anothertest second test for reflection
+ * @anothertest second test for reflection with second value
  */
-class ReflectionServiceTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
+class ReflectionServiceTest extends UnitTestCase {
 
        /**
         * @param array $foo The foo parameter
@@ -29,8 +34,31 @@ class ReflectionServiceTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
        /**
         * @test
         */
+       public function getClassTagsValues() {
+               $service = new ReflectionService();
+               $classValues = $service->getClassTagsValues(get_class($this));
+               $this->assertEquals(array(
+                       'firsttest' => array('test for reflection'),
+                       'anothertest' => array('second test for reflection', 'second test for reflection with second value')
+               ), $classValues);
+       }
+
+       /**
+        * @test
+        */
+       public function getClassTagValues() {
+               $service = new ReflectionService();
+               $classValues = $service->getClassTagValues(get_class($this), 'firsttest');
+               $this->assertEquals(array(
+                       'test for reflection',
+               ), $classValues);
+       }
+
+       /**
+        * @test
+        */
        public function hasMethod() {
-               $service = new \TYPO3\CMS\Extbase\Reflection\ReflectionService();
+               $service = new ReflectionService();
                $this->assertTrue($service->hasMethod(get_class($this), 'fixtureMethodForMethodTagsValues'));
                $this->assertFalse($service->hasMethod(get_class($this), 'notExistentMethod'));
        }
@@ -39,7 +67,7 @@ class ReflectionServiceTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
         * @test
         */
        public function getMethodTagsValues() {
-               $service = new \TYPO3\CMS\Extbase\Reflection\ReflectionService();
+               $service = new ReflectionService();
                $tagsValues = $service->getMethodTagsValues(get_class($this), 'fixtureMethodForMethodTagsValues');
                $this->assertEquals(array(
                        'param' => array('array $foo The foo parameter'),
@@ -51,7 +79,7 @@ class ReflectionServiceTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
         * @test
         */
        public function getMethodParameters() {
-               $service = new \TYPO3\CMS\Extbase\Reflection\ReflectionService();
+               $service = new ReflectionService();
                $parameters = $service->getMethodParameters(get_class($this), 'fixtureMethodForMethodTagsValues');
                $this->assertEquals(array(
                        'foo' => array(