Сегодня вышел 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, которая выйдет в конце мая и будет поддерживаться в течение двух лет.