Сегодня вышел Symfony 2.2.
Список нововведений из официального блога:
Также в Symfony 2.2 из существующего кода были выделены два компонента:
Далее — более подробно о некоторых изменениях.
PropertyAccess предоставляет доступ к полям структур (массивов, объектов), в том числе и иерархических. Код компонента был извлечен из компонента Form в отдельный компонент, т.к. оказался весьма удобным самостоятельным инструментом, который можно использовать как в Symfony, так и отдельно от него.
Метод
При обращении к объектам метод получает значение первым существующим из перечисленных способов:
Существует и
Нужно это, в первую очередь, когда есть необходимость в вынесении путей в переменные или параметры. Например, для вывода данных структур в виде таблицы.
Секундомер (хотя, скорее, микросекундомер) может быть весьма полезным при отладке. Был извлечен из HttpKernel, и теперь доступен через сервис-контейнер в режиме разработки.
Так его можно использовать в контроллере:
Замеренные промежутки отобразятся в профайлере Symfony.
Повысилась и производительность Finder, т.к. критерии теперь преобразуются в нативные команды Linux, BSD и MacOS.
До версии 2.2 была возможность генерировать два вида URL.
Абсолютный URL:
URL относительно домена (по умолчанию):
Теперь можно генерировать еще два типа URL:
URL относительно схемы:
URL относительно пути:
Появилась возможность задавать маршруты для конкретных хостов, и использовать их шаблоны:
Для запуска внешних процессов в дополнение к методу
Теперь можно так:
Добавлены и методы для получения ошибок
Также расширен список методов получения статуса процесса:
Теперь ждем первую LTS-версию Symfony 2, которая выйдет в конце мая и будет поддерживаться в течение двух лет.
Список нововведений из официального блога:
- Console: Автозавершение в командной строке;
- Console: Прогресс-бар для длинных заданий;
- Console: Скрытие паролей в режиме командной строки;
- Console: Предложение пользователю выбрать из списка возможных вариантов;
- Finder: Фильтрация по пути;
- Finder: Поддержка синтаксиса glob в методе in();
- Finder: Увеличение скорости на некоторых платформах;
- HttpKernel: Новый под-фреймворк для управления фрагментами ресурсов;
- HttpKernel: Улучшен вид вывода фатальных ошибок;
- HttpKernel: Логирование устаревших вызовов;
- Process: Получение промежуточных результатов выполняющихся процессов;
- Process: Перезапуск процесса;
- Process: Получение статуса исполняющегося процесса;
- Routing: Поддержка URL-хостов при маршрутизации;
- Routing: Относительные URL для схемы и пути;
- Security: Интересные утилиты безопасности;
- Validators: Валидаторы относящиеся к платежным системам;
- FrameworkBundle: Улучшение производительности для функциональных тестов;
- FrameworkBundle: Кэширование статических страниц.
Также в Symfony 2.2 из существующего кода были выделены два компонента:
- PropertyAccess;
- Stopwatch.
Далее — более подробно о некоторых изменениях.
Компоненты
PropertyAccess
PropertyAccess предоставляет доступ к полям структур (массивов, объектов), в том числе и иерархических. Код компонента был извлечен из компонента Form в отдельный компонент, т.к. оказался весьма удобным самостоятельным инструментом, который можно использовать как в Symfony, так и отдельно от него.
Метод
getValue($objectOrArray, $propertyPath) получает значение из массива или объекта в соответствии с $propertyPath:use Symfony\Component\PropertyAccess\PropertyAccess; // ... $row = array(); $accessor = PropertyAccess::getPropertyAccessor(); // $row[] = $item[firstName]; $row[] = $accessor->getValue($item, '[firstName]'); // $row[] = $item->getFirstName() $row[] = $accessor->getValue($item, 'firstName'); // $row[] = $item[user][firstName]; $row[] = $accessor->getValue($item, '[user][firstName]'); // $row[] = $item->getUser()->getFirstName() $row[] = $accessor->getValue($item, 'user.firstName');
При обращении к объектам метод получает значение первым существующим из перечисленных способов:
$item->getProp(); $item->isProp(); $item->hasProp(); $item->__get('prop'); $item->prop;
Существует и
setValue($objectOrArray, $propertyPath, $value), который устанавливает значение в $propertyPath.Нужно это, в первую очередь, когда есть необходимость в вынесении путей в переменные или параметры. Например, для вывода данных структур в виде таблицы.
Stopwatch
Секундомер (хотя, скорее, микросекундомер) может быть весьма полезным при отладке. Был извлечен из HttpKernel, и теперь доступен через сервис-контейнер в режиме разработки.
Так его можно использовать в контроллере:
if ($this->has('debug.stopwatch')) { $stopwatch = $this->get('debug.stopwatch'); } $stopwatch->start('foo'); // ... $stopwatch->lap('foo'); // ... $stopwatch->lap('foo'); // ... $event = $stopwatch->stop('foo');
Замеренные промежутки отобразятся в профайлере Symfony.
Изменения в компонентах
Поиск файлов (Finder)
// До версии 2.2 можно было искать файлы по шаблону glob или regexp Finder::create()->files()->name('*.php'); Finder::create()->files()->name('/\.php$/'); // Теперь это доступно и для директорий Finder::create()->path('some/special/dir'); Finder::create()->path('/^foo\/bar/'); // Синтаксис glob доступен в методе in() Finder::create()->files()->in('src/Symfony/*/*/Resources/translations');
Повысилась и производительность Finder, т.к. критерии теперь преобразуются в нативные команды Linux, BSD и MacOS.
Маршрутизация (Routing)
Генерация URL
До версии 2.2 была возможность генерировать два вида URL.
Абсолютный URL:
example.org/blog/what-a-wonderful-world// Twig {{ url('blog', { post: 'what-a-wonderful-world' }) }} // PHP $generator->generate('blog', array('post' => 'what-a-wonderful-world'), true); $generator->generate('blog', array('post' => 'what-a-wonderful-world'), UrlGeneratorInterface::ABSOLUTE_URL);
URL относительно домена (по умолчанию):
/blog/what-a-wonderful-world// Twig {{ path('blog', { post: 'what-a-wonderful-world' }) }} // PHP $generator->generate('blog', array('post' => 'what-a-wonderful-world')); $generator->generate('blog', array('post' => 'what-a-wonderful-world'), UrlGeneratorInterface::ABSOLUTE_PATH);
Теперь можно генерировать еще два типа URL:
URL относительно схемы:
//example.org/blog/what-a-wonderful-world// Twig {{ url('blog', { post: 'what-a-wonderful-world' }, true) }} // PHP $generator->generate('blog', array('post' => 'what-a-wonderful-world'), UrlGeneratorInterface::NETWORK_PATH);
URL относительно пути:
../// Twig {{ path('blog', { post: 'what-a-wonderful-world' }, true) }} // PHP $generator->generate('blog', array('post' => 'what-a-wonderful-world'), UrlGeneratorInterface::RELATIVE_PATH);
Маршруты, зависящие от хоста
Появилась возможность задавать маршруты для конкретных хостов, и использовать их шаблоны:
user_homepage: path: / host: "{user}.example.com" defaults: { _controller: AcmeDemoBundle:User:profile } main_homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
Процессы
Для запуска внешних процессов в дополнение к методу
run() (который принимает лямбда-функцию в качестве аргумента для обработки данных) появилась возможность запустить процесс методом start() и получать данные при помощи метода getOutput(). Кроме того, можно воспользоваться методом getIncrementalOutput(), который возвращает новые данные от процесса с предыдущего вызова этого метода.use Symfony\Component\Process\Process; $process = new Process('ls -lsa'); $process->run(function ($type, $data) { echo $data; });
Теперь можно так:
use Symfony\Component\Process\Process; $process = new Process('ls -lsa'); $process->start(); while ($process->isRunning()) { echo $process->getIncrementalOutput(); sleep(1); }
Добавлены и методы для получения ошибок
getErrorOutput() и getIncrementalErrorOutput().Также расширен список методов получения статуса процесса:
$process->isSuccessful(); $process->hasBeenSignaled(); $process->hasBeenStopped(); $process->isRunning(); // в версии 2.2 $process->isStarted(); $process->isTerminated();
LTS
Теперь ждем первую LTS-версию Symfony 2, которая выйдет в конце мая и будет поддерживаться в течение двух лет.
