Pull to refresh

Вышел Symfony 2.2

PHP *Symfony *
Сегодня вышел Symfony 2.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, которая выйдет в конце мая и будет поддерживаться в течение двух лет.
Tags:
Hubs:
Total votes 21: ↑15 and ↓6 +9
Views 8.1K
Comments 25
Comments Comments 25