Yii 2.0.3

    Точно в срок вышел релиз PHP фреймворка Yii версии 2.0.3. Порядок обновления и установки описан на странице http://www.yiiframework.com/download/.

    В данную версию вошли около 50 улучшений и исправлений. Полный список можно посмотреть на GitHub. Пользуясь случаем команда выражает благодарность всем, кто нам помогает.

    Отдельное спасибо тем, кто улучшает документацию и переводит её на множество языков.

    За процессом разработки фреймворка удобно следить на GitHub, поставив проекту звёздочку или использовав кнопку watch. Подписывайтесь на наш Twitter и Facebook.

    Ниже мы рассмотрим самые важные улучшения данной версии.



    Криптография



    Это довольно серьёзное изменение, хоть и внутреннее. Для yii\base\Security мы заменили Mcrypt (который заброшен уже восемь лет) на OpenSSL, за что стоит сказать спасибо Tom Worster, который присматривает за безопасностью Yii. Так как OpenSSL присутствует по умолчанию в большинстве дистрибутивов PHP, проблем с совместимостью возникнуть не должно. Но, если уж возникнут, обязательно сообщите.

    Кэширование RBAC



    Если вы храните данные RBAC в базе данных, вы могли заметить, что производительность при этом не идеальная: каждая проверка выливается в достаточно весомое количество SQL запросов. Для того, чтобы это исправить, мы добавили кэширование в yii\rbac\DbManager. Вся иерархия хранится в кэше, что намного увеличивает производительность checkAccess(). По умолчанию кэширование RBAC выключено. Включается следующим образом:

    return [
        'components' => [
            'authManager' => [
                'class' => 'yii\rbac\DbManager',
                'cache' => 'cache',   // <---- вот так
            ],
            'cache' => [
                'class' => 'yii\caching\ApcCache',
            ]
            // ...
        ],
    ]
    


    Кэширование страниц



    Ранее кэширование страниц ограничивалось лишь HTML. Оно не работало для REST API из за неправильных HTTP заголовков. Теперь можно использовать yii\filters\PageCache для кэширования различных типов данных и заголовков. Вот так можно кэшировать действие index REST-контроллера:

    public function behaviors()
    {
        return [
            [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'duration' => 60,
            ],
        ];
    }
    


    Принудительная загрузка свежих ресурсов



    Ещё одно улучшение на тему кэширования — поддержка принудительной загрузки свежих ресурсов, которая часто полезна на рабочих серверах в том случае, когда включено HTTP кэширование JS или CSS файлов. В этом случае, даже если вы вносите изменения в файлы ресурсов, клиент может получать старую версию из кэша. Теперь можно установить свойству yii\web\AssetManager::appendTimestamp значение true. К URL ресурсов JS и CSS будет добавлено время изменения файлов, так что клиент будет всегда получать последнюю версию:

    return [
        'components' => [
            'assetManager' => [
                'class' => 'yii\web\AssetManager',
                'appendTimestamp' => true,
            ],
            // ...
        ],
    ]
    


    Изменения текущего URL



    Был добавлен новый метод yii\helpers\Url::current(), который облегчает задачу изменения текущего URL путём добавления или удаления GET-параметров:

    // допустим, $_GET = ['id' => 123, 'src' => 'google'], текущий маршрут "post/view"
    
    // /index.php?r=post/view&id=123&src=google
    echo Url::current();
    
    // /index.php?r=post/view&id=123
    echo Url::current(['src' => null]);
    // /index.php?r=post/view&id=100&src=google
    echo Url::current(['id' => 100]);
    


    Отключение ротации логов



    Если вы пишете логи в файлы через yii\log\FileTarget, то теперь можете отключить автоматическую ротацию файлов, что полезно, если этим занимаются дополнительные утилиты:

    return [
        'components' => [
            'log' => [
                'targets' => [
                    [
                        'class' => 'yii\log\FileTarget',
                        'enableRotation' => false,
                    ],
                ],
            ],
        ],
    ];
    


    Атрибуты data



    При использовании yii\helpers\Html атрибут data обрабатывается особым образом:

    // выдаёт: <div data-name="xyz" data-age="20"></div>
    echo Html::tag('div', '', ['data' => ['name' => 'xyz', 'age' => 20]]);
    


    Теперь так же обрабатываются ng и data-ng. Это полезно прежде всего тем, кто работает с AngularJS. Для остальных атрибутов массив будет преобразован в JSON.

    Вы можете задать, какие атрибуты обрабатывать особым образом добавив их в yii\helpers\Html::$dataAttributes.

    Обрезка входных данных



    Если вы используете правило валидации trim, вы обнаружите, что обрезка теперь производится и на клиенте. Отключить данное поведение можно задав свойству enableClientValidation правила валидации trim значение false.

    Максимальная длина поля



    При использовании yii\helpers\Html::activeTextInput() или yii\widgets\ActiveField::textInput() для создания полей ввода вам может понадобиться задать свойство maxlength. Если у соответствующего поля модели есть правило валидации string, maxlength можно брать из него. Для этого maxlength необходимо указать значение true:

    // у "name" есть правило валидации: ['name', 'string', 'max' => 128]
    // generates: <input type="text" ... maxlength="128">
    echo Html::activeTextInput($model, 'name', ['maxlength' => true]);
    


    Конфигурируемые объекты



    Теперь вы можете использовать новый интерфейс yii\base\Configurable для того, чтобы пометить класс как «конфигурируемый». В этом случае yii\di\Container ждёт, что конструктор принимает массив конфигурации:

    class Foo implements \yii\base\Configurable
    {
        public function __construct($a, $b, $config = [])
        {
        }
    }
    
    $container = new \yii\di\Container;
    $object = $container->get('Foo', [1, 2], ['prop1' => 3]);
    // эквивалентно: $object = new Foo(1, 2, ['prop1' => 3]);
    


    Ранее было необходимо наследоваться от yii\base\Object для достижения сходного эффекта.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 12
    • +1
      Спасибо за OpenSSL, mcrypt реально уже староват.
      • 0
        // $object = $container->get('Foo', [1, 2], ['prop1' => 3]);

        Хм. Я ошибаюсь или полезность контейнера сильно падает, когда вызов сервиса завязывается на конкретные значения? Например, меняем $a и $b местами, и код уже не работает.
        • 0
          Ошибаетесь.
          • 0
            Хорошо, вот пример. Есть FileCache и MemcacheCache. Предположим, я забиндил где-то в конфиге FileCache на сервис 'cache'. Предположим, что конструктор FileCache принимает параметр $cache_dir, MemcacheCache — $server_ip. Если я правильно понял, предлагается писать так:

            $cache = $container->get('cache', ['cache_dir' => '/some/cache/dir']);

            Как мне теперь перейти от FileCache к MemcacheCache без необходимости переписывать весь код?
            • 0
              Не задавать параметры через get, задавать их в set.
              • 0
                Ок, а есть реальные примеры того, где это реально нужно? DI призван вынести всю инициализацию в одно место, а ваша идея предполагает часть инициализации сервиса перенести в вызывающий код.
                • +1
                  Да нет же. Я про set говорил, а не про get. То есть настроить можно в конфиге или в коде, который к вызову отношения не имеет. А вызывать уже либо явно, либо через биндинг в конструктор. Это всё в доке есть.
        • 0
          Как же RBAC кэширования не хватало в Yii1. Workaround, конечно же, написан, но не это родное решение.
          • 0
            > RBAC кэширования

            Это здорово, а то запросов к базе было реально многовато.
            • 0
              неужели прикрутили кэширования для RBAC? а то с самых первых версий приходится его всегда расширять/переписывать, чтобы хотя бы кеширование сделать — без него в случае если каждый «чих» проверяется через RBAC просто нереально.
              • 0
                SamDark Поясните пожалуйста, почему у вас версии фреймворка ведутся не по semver.org/lang/ru/
                Чем продиктована такая версионность? По мне так, у вас сейчас должна быть версия 2.3.0 Может быть я что-то не до конца понимаю?
                Заранее спасибо за ответ.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое