Новое в Symfony 2.8: PropertyInfo компонент

PHP является слабо типизированный языком программирования. Это означает, что вам не надо объявить тип переменных (например, INT, BOOL), и вы можете хранить различные виды данных (например, числа и строки) в одной и той же переменной.

Разработчики частично пытаются преодолеть это ограничение посредствам комментариев PHPDoc, также начиная с PHP 7 будет доступено  возвращение типизированного значения. Тем не менее, в некоторых случаях по-прежнему необходимо знать тип в PHP. Вот почему Symfony добавил новый компонент под названием PropertyInfo.

Этот компонент получает информацию о свойствах класса от нескольких поставщиков метаданных, таких как: Doctrine ORM аннотации, PHPDoc комментарии, PHP type, сериализатор метаданных, и т.д.

Рассмотрим следующий PHP класс сущности доктрины, которая содержит различные типы свойств:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @Entity
 */
class FooClass
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    public $id;

    /**
     * This is a date (short description).
     *
     * With a long description.
     *
     * @var \DateTime
     */
    public $foo;

    private $bar;

    public function setBar(\SplFileInfo $bar)
    {
        $this->bar = $bar;
    }
}

Перед использованием компонента PropertyInfo для извлечения информации, необходимо создать и настроить экстракторы метаданных (ReflectionExtractor, PhpDocExtractor, DoctrineExtractor и SerializerExtractor встроены, но вы можете создавать также свои собственные экстракторы):

use Symfony\Component\PropertyInfo\PropertyInfo;

$propertyInfo = new PropertyInfo(
    array($reflectionExtractor),
    array($doctrineExtractor, $phpDocExtractor, $reflectionExtractor),
    array($phpDocExtractor),
    array($reflectionExtractor)
);

Теперь вы можете проанализировать каждое свойство следующим образом:

$propertyInfo->getTypes('FooClass', 'foo');
// array(1) {
//   [0] =>
//   class Symfony\Component\PropertyInfo\Type#36 (6) {
//     private $builtinType => string(6) "object"
//     private $nullable => bool(false)
//     private $class => string(8) "DateTime"
//     private $collection => bool(false)
//     private $collectionKeyType => NULL
//     private $collectionValueType => NULL
//   }
// }

$propertyInfo->getTypes('FooClass', 'id');
// array(1) {
//   [0] =>
//   class Symfony\Component\PropertyInfo\Type#36 (6) {
//     private $builtinType => string(3) "int"
//     private $nullable => bool(false)
//     private $class => NULL
//     private $collection => bool(false)
//     private $collectionKeyType => NULL
//     private $collectionValueType => NULL
//   }
// }

$propertyInfo->getTypes('FooClass', 'bar');
// array(1) {
//   [0] =>
//   class Symfony\Component\PropertyInfo\Type#245 (6) {
//     private $builtinType => string(6) "object"
//     private $nullable => bool(false)
//     private $class => string(11) "SplFileInfo"
//     private $collection => bool(false)
//     private $collectionKeyType => NULL
//     private $collectionValueType => NULL
//   }
// }

Данный компонент включает другие утилиты для извлечения полезной информации:

$propertyInfo->getProperties('FooClass');
// ['id', 'foo', 'Bar']

$propertyInfo->isReadable('FooClass', 'id');   // true
$propertyInfo->isReadable('FooClass', 'bar');  // false
$propertyInfo->isWritable('FooClass', 'foo');  // true
$propertyInfo->isWritable('FooClass', 'bar');  // true

$propertyInfo->getShortDescription('FooClass', 'foo');
// "This is a date (short description)."

$propertyInfo->getLongDescription('FooClass', 'foo');
// "With a long description."

Источник: http://symfony.com/blog/new-in-symfony-2-8-propertyinfo-component

 

Добавить комментарий

Ваш адрес email не будет опубликован.

10 + 12 =