Состоялся релиз PHP фреймворка Yii версии 2.0.11. Инструкции по обновлению и установке можно найти на официальном сайте. Версия 2.0.11 содержит более 110 улучшений и исправлений.


Четыре небольших изменения могут затронуть существующие приложения, так что стоит обратить внимание на UPGRADE.md.


Огромное спасибо нашему замечательному сообществу. Мы сделали это вместе!


За процессом разработки Yii 2 можно следить поставив звёздочку на GitHub. Также у нас есть Twitter и Facebook.


Так как уже ведутся работы над Yii 2.1, убедитесь, что версия фреймворка в composer.json прописана как ~2.0.11. В противном случае после релиза 2.1 проект может поломаться.


Далее мы рассмотрим самые интересные изменения и улучшения, вошедшие в релиз. Полный список доступен в CHANGELOG.


Покрытие тестами


Мы решили не принимать pull request-ы без тестов за редким исключением. Это должно улучшить качество кода и уменьшить время, затрачиваемое на его проверку. Более половины pull request-ов для 2.0.11 были приняты согласно этому решению.


Некоторые тесты, такие как тесты для менеджера URL, подверглись значительному рефакторингу. Методы стали меньше, читать их стало проще.


Алексей Рогачёв проделал значительную работу по рефакторингу, исправлению и покрытию тестами JavaScript-части фреймворка.


Консоль


В консоли Bash и Zsh стало довольно просто организовать дополнение для команды ./yii. Настройка описана в руководстве.


Кроме того, при описках консоль подсказывает существующие команды с похожим написанием.


Кеш


Стало возможным выставить глобально длительность хранения данных в кеше через yii\caching\Cache::$defaultDuration.


Появился удобный синтаксис:


$data = $cache->getOrSet($key, function () {
    return $this->calculateSomething();
});

Код выше делает то же, что и:


$data = $cache->get($key);
if ($data === false) {
    $data = $this->calculateSomething();
    $cache->set($key, $data);
}

Конфигурация


После продолжительных обсуждений было решено добавить возможность настраивать контейнер зависимостей через основную конфигурацию приложения:


$config = [
    'id' => 'basic',
    // ...
    'container' => [
        'definitions' => [
            'yii\widgets\LinkPager' => ['maxButtonCount' => 5]
        ],
        'singletons' => [
        ],
    ],
];

Подробнее об этой возможности можно прочитать в разделе «application configurations» официального руководства.


Ещё немного удобства и синтаксиса


С каждым релизом, чтобы сделать разработку приятней, мы пытаемся сделать ошибки всё более полезными и точными. 2.0.11 не исключение. Теперь ошибка при попытке обратиться к несуществующему компоненту сообщает, что именно это и случилось. Ранее фреймворк ругался на невозможность автоматической загрузки класса.


В контроллер добавлены два метода: asJson() и asXml(). Служат они для отдачи данных в формате JSON и XML соответственно.


Производительность


  • Yii избавился от запросов с условиями вида 0=1, которые использовались для связей в AR.
  • RBAC научился пропускать рекурсивные проверки если роли не присвоены какие-либо разрешения.
  • Валидатор unique теперь выбирает только первичные ключи, а не полный набор данных.

Ещё одно улучшение напрямую не влияет на производительность, но определённо поможет её увеличить в приложениях. Мы начали логировать использование памяти и процесс сопоставления роутов. Ожидайте соответствующих панелей в следующем релизе модуля debug.


Базы данных


В yii\db\Query добавлены три новых метода: filterHaving(), andFilterHaving() и orFilterHaving(). Они похожи на остальные методы filter*, которые добавляют условие только если значение не пусто и обычно используются для различных фильтров.


Класс yii\db\Connection стало приятнее использовать в случае с конфигурациями master-slave:


  • Добавлена опция shuffleMasters, при помощи которой можно отключить случайный выбор master-соединения.
  • Добавлен метод getMaster() и свойство master. Они позволяют получить текущее активное master-соединение.

\yii\db\Query теперь можно передавать в insert() как напрямую вторым аргументом, так и в качестве значения одного из параметров:


$db = Yii::$app->db;

// вставляем query

$sourceQuery = new \yii\db\Query()
    ->select([
        'title',
        'content',
    ])->from('{{post_queue}}');

$command = $db->createCommand();
$command->insert('{{post}}', $sourceQuery);

// используем query как значение

$titleQuery = new \yii\db\Query()
    ->select('title')->from('{{titles}}')->limit(1);

$command = $db->createCommand();
$command->insert('{{post}}', [
    'title' => $titleQuery,
    'content' => 'Привет!',
]);

Совместимость с PHP 7


Мы постоянно проверяем фреймворк на совместимость с PHP 7. К 2.0.11 мы нашли и исправили проблему, связанную с обработкой ошибок и Throwable.


Менеджер URL


При генерации URL через UrlManager::createAbsoluteUrl(), Url::to() или Url::toRoute() теперь можно указать схему как пустую для создания протоколо-независимых URL:


echo Url::to('@web/images/logo.gif', '');
// //www.example.com/images/logo.gif

Также при генерации URL стали не обязательными параметры, для которых существуют значения по умолчанию:


echo Url::to(['post/index', 'page' => 1, 'tag' => '']);

// теперь можно так:

echo Url::to(['post/index', 'page' => 1]);

Виджеты


Расширяемость виджетов была значительно улучшена. Добавлены события при инициализации, перед стартом рендеринга и после его завершения. Примеры применения смотрите в описании issue.


Безопасность


В фреймворк было включен фильтр HostControl, при помощи которого можно предотвратить атаку через подмену хоста. В идеале её лучше не допускать правильной конфигурацией веб-сервера, но так как поступило довольно много запросов от тех, кто не имеет доступа к настройке
сервера, решили всё-таки включить данный фильтр в фреймворк. Детально о настройке данного фильтра можно прочитать в руководстве.


Также была найдена и исправлена проблема с экранированием данных на странице ошибки в режиме отладки. Так как проблема не затрагивает рабочие сервера, мы не стали выпускать отдельный патч-релиз.


Инсталлятор Composer


Вместе с релизом фреймворка мы выпускаем новую версию 2.0.5 инсталлера Composer. Этот плагин для Composer отвечает за установку расширений и позволяет обходиться без конфигурации в процессе бутстрапинга. Также он выполняет разные задачи при создании нового проекта. Благодаря Robert Korulczyk, стало возможно выполнять задачи и при composer install, что особенно важно для обработки локальных файлов конфигурации, которые теперь можно копировать при помощи нового метода copyFiles. Более детально можете почитать в README.


Также плагин начал при обновлении пакета yiisoft/yii2 уведомлять о важных изменениях из UPGRADE.md.


Подписанные коммиты и теги


Это первый релиз, с подписанным GPG тегом, что позволяет проверить, что он сделан командой Yii. Позже мы опубликуем детальные инструкции по проверке.


На GitHub подписанные теги можно отличить по надписи "verified": https://github.com/yiisoft/yii2-framework/releases/tag/2.0.11.

Поделиться с друзьями
-->

Комментарии (89)


  1. Caravus
    01.02.2017 23:10
    +5

    Спасибо. И за фреймворк и за новость.


  1. passavlasso
    02.02.2017 00:14

    Дякую за проведену роботу, буде що підучити:)


  1. gogolinsky
    02.02.2017 00:56
    +1

    Отличная новость!) Какие дальнейшие планы?


    1. SamDark
      02.02.2017 02:04
      +1

      Релизы расширений, новый сайт, yiipowered, 2.1.


      1. gogolinsky
        02.02.2017 08:02

        Что такое yiipowered?


        1. russ666999
          02.02.2017 13:13
          +2

          Yii powered websites showcase
          https://github.com/samdark/yiipowered


          1. dimaborisovsky
            02.02.2017 16:38

            А каков собственно функционал этого добра?


            1. SamDark
              02.02.2017 16:38
              +1

              Будет принимать от всех желающих информацию о проектах, сделанных на Yii, и показывать её.


  1. eskrano
    02.02.2017 02:03

    А когда откажетесь от поддержки php 5.4? Я понимаю что это круто (старые версии и шаред хостинги), но все же…


    1. SamDark
      02.02.2017 02:03
      +1

      В 2.1.


      1. Arik
        02.02.2017 08:01

        В сторону php 5.6?


        1. sizeg
          02.02.2017 13:13

          А смысл, если уже есть производительный 7?


          1. SamDark
            02.02.2017 13:14

            Фреймворк и сейчас работает отлично на семёрке. И да, быстрее. Рекомендую обновиться, если ещё нет.


          1. Arik
            03.02.2017 08:30
            +1

            сразу на 7? вроде нижнюю планку обсуждали. Клиенты с простыми сайтами не всегда готовы идти на VPS


            1. zelenin
              03.02.2017 13:24

              5.6 уже на security support, т.е. всё.


              1. SamDark
                03.02.2017 13:37
                +1

                И? Это не наша проблема. Если технически фреймворк работает с 5.4 и проблем ни в поддержке ни в работе с PHP 7 это не вызывает, зачем завышать требования?


                1. zelenin
                  03.02.2017 13:45
                  -1

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


                  1. SamDark
                    03.02.2017 15:06

                    Если бы вопрос выбора сопровождался бы написанием тучи polyfill-ов для этой версии, повышали бы до семёрки не задумываясь. А так как уже всё написано, покрыто тестами и работает, смысла нет.


                    1. zelenin
                      03.02.2017 16:23
                      -1

                      Александр, ты продолжаешь о чем-то своем рассуждать. Речь идет о выборе минимально поддерживаемой версии во время предполагаемого перехода в одной из мажорных версий фреймворка. Ни полифиллы ни тесты здесь не причем.
                      Переход должен быть потому, что 5.4-5.5 уже не поддерживаются даже фиксами безопасности, что создает брешь и в вашем продукте. По этой же причине следующая минимальная версия должна быть поддерживаемой (5.6 на излете).


                      1. Mendel
                        03.02.2017 16:29
                        +3

                        А зачем? Выбор версии софта на сервере это не ответственность фреймворка.
                        Если он МОЖЕТ работать на старом, то он должен на нем работать.
                        Допустим у человека сервер завязан на 5.4 и он не может его проапгрейдить потому что на сервере есть другой софт со своими зависимостями. Но прикладного кода не много, и он тривиален, поэтому совместимость с прошлой версией фреймворка сохраняется или легко апдейтится. Разработчик хочет перейти с 2.0 на 2.1. Но тут мы ему такие специально подляну всунули — код может работать на 5.4., но мы решили подумать за него и всунуть ему в композер зависимость на пхп7. Вот с какого перепуга?


                        1. zelenin
                          03.02.2017 16:35
                          -1

                          поддержка определенной версии — это не столько вопрос плюшек новых версий, сколько вопрос уверенности пользователя (т.е. разработчика/заказчика) в стабильной его работе на данной версии. Заявляя поддержку версии, которая уже не получает фиксов безопасности, ты подставляешь своих пользователей, т.к. не обеспечиваешь эту самую стабильную работу. Поэтому каждая мажорная версия должна поднимать минимально поддерживаемую фреймворком версию вслед за минимальной поддерживаемой версией php его разработчиком.


                          1. Mendel
                            03.02.2017 17:39
                            +3

                            Это не ответственность фреймворка.
                            Обновление версии пхп это ответственность админа, хостера, кого угодно, но не фреймворка. Может сервер живет настолько глубоко, что при всем желании и возможности туда не достучаться злому дяде. Но на нем стоит кастомная сборка пхп5.4, с кастомным расширением в виде бинарника, и выпуск этого расширения под пхп7 неизвестно когда будет. При этом юии2.0 будет менее безопасен чем 2.1 (ну возьмем экзотический случай, что мы дожили до снятия с поддержки 2.0, но еще хотим пхп5.4, ну вот сферический конь в вакууме, но мало ли какие будут комбинации). И вы вынуждаете использовать устаревший софт, просто потому что «так нада».
                            одно дело писать в документации что мол настоятельно рекомендуем обновить пхп, что скоро мы можем прекратить его поддержку и т.п. Но… писать в требованиях не то что надо, а то что кажется верным по религиозным соображениям — моветон.


                            1. zelenin
                              03.02.2017 20:10

                              Это не ответственность фреймворка.
                              это отвественность создателей продукта — поддерживать минимально безопасную экосистему
                              Но… писать в требованиях не то что надо, а то что кажется верным по религиозным соображениям
                              вот такой вот уровень дискуссии — представить мнение, которого придерживается большинство мейнетейнеров фреймворков, религиозным, т. е. маргинальным.


                              1. SamDark
                                03.02.2017 22:50

                                Безопасность тут не при чём. Смотрите: http://php.net/supported-versions.php


                                5.6 в плане безопасности поддерживаться будет дольше, чем 7.0.


                                1. zelenin
                                  04.02.2017 00:28
                                  -1

                                  именно. поэтому и выбирать в качестве минимальной можно не 5.6 и 7.0, а 7.1. но с учетом распространения версий и функциональных изменений разумнее будет выбрать 7.0, которую в качестве минимальной выбирают все зарелизенные в последние полгода популярные в комьюнити библиотеки (от symfony/laravel до phpunit). А мы кстати говорим о 2.1, релиз которого вряд ли произойдет ранее второй половины года, а то и вообще не в 2017, судя по прошлой динамике.


                                  1. SamDark
                                    04.02.2017 15:17

                                    Ну чем разумнее-то? У неё поддержка по времени меньше, чем у 5.6. 7.1 — да, разумно выбрать с точки зрения поддержки, но не разумно потому как никто его ещё не использует и массового перехода в ближайший год не будет.


                                    1. zelenin
                                      04.02.2017 16:00
                                      -1

                                      одинаковая у нее подержка. разница в 3 недели.


                                      1. SamDark
                                        04.02.2017 17:04

                                        Ну тогда почему обязательно 7, а не 5.6?


                                        1. zelenin
                                          04.02.2017 17:10
                                          -1

                                          для стимулирования комьюнити. если бы не было 2.0, то комьюнити до сих пор не знало бы что такое неймспейсы (на форуме и сейчас, в 2017 вылазят люди и говорят, что за неймспейсы вы придумали).


                                          1. SamDark
                                            04.02.2017 17:12

                                            Для стимулирования мы уже написали в гайде "runs best with PHP 7.0+" и на сайте на главной напишем большими буквами. Но требовать это через composer.json, всё-таки, не стоит.


                                  1. SamDark
                                    04.02.2017 15:20

                                    То, что трендово и модно — не отрицаю. Рационально — нет.


                                    1. zelenin
                                      04.02.2017 16:04
                                      -1

                                      yii2 — не про энтерпрайз. не стоит поддерживать все старье в новых мажорных версиях.


                                      1. SamDark
                                        04.02.2017 17:07

                                        Ну, если IBM, Facebook, Альфа-групп, мэрия Москвы, минфин Украины, РТРС, FIFA — это всё не enterprise, то хорошо...


                                        1. zelenin
                                          04.02.2017 17:14
                                          -1

                                          а) смешно (уверен в этом списке нет ничего кроме визиток и небольших личных кабинетов — про фейсбук например я точно помню, что там было.)
                                          б) никто не говорит о миграциях старых продуктов на новые мажорные версии


                                          1. SamDark
                                            04.02.2017 17:29

                                            а) Есть. IBM — сеть моллов в Китае. Альфа-групп — биржа. РТРС — весь интранет с внутренними процессами. FIFA — часть интранета. Facebook, мэрия Москвы, минфин Украины — да, по сути CMS.
                                            б) И как их поддерживать?


                                            1. zelenin
                                              04.02.2017 17:37
                                              -1

                                              вы и не будете их поддерживать, т.к. вы не энтерпрайз. поэтому когда к вам в issue прибегут с проблемой взломов сайтов на yii2, использующих 5.4.*, вы разведете руками — поддержка 5.4 кончилась. Поэтому в ваших же интересах указывать версии php с более долгим сроком поддержки. Проблема в php, а репутация пострадает ваша.


                                              1. SamDark
                                                04.02.2017 17:42

                                                Если у нас в требованиях будет 5.4, руками мы не будем разводить, а решим проблему, если она решаема PHP-кодом, или поднимем минимальные требования, если нет.


                                                1. zelenin
                                                  04.02.2017 17:50

                                                  и сломаете обратную совместимость


                                                  1. SamDark
                                                    04.02.2017 18:00

                                                    Ну а какие ещё варианты есть, если её нельзя не сломать?


                                                    1. Сломать.
                                                    2. Выпустить новую мажорную версию и задепрекейтить текущую.

                                                    По сути это одно и то же. Версионирование только отличается.


                                                    1. zelenin
                                                      04.02.2017 18:12

                                                      Ну а какие ещё варианты есть, если её нельзя не сломать?
                                                      при разработке новой мажорной версии выбрать в качестве минимума не 5.6/7.0, а 7.1/7.2.
                                                      ломать совместимость — это почти то же самое что ничего не делать, т.к. формально вы предлагаете переписать приложение написанное под одну версию php на другую. У кого-то опытного заработает без допилки, а у кого-то весь код в задепрекейченных в новой версии php функциях. В прицнипе звучит достаточно просто, но формально неправильно.


                                                      1. SamDark
                                                        04.02.2017 18:22

                                                        Формальное несоблюдение SemVer да, в этом случае будет. Согласен.


                                                        С другой стороны, какова вероятность того, что 2.1 с 5.6 проработает до начала 2019 без проблем? Как по мне, довольно высокая. Выбирать сейчас 7.1, как по мне — отбить охоту использовать фреймворк у тяжеловесов вроде IBM. Согласование мажорные версии у них проходит с большим скрипом как раз под конец официальной поддержки (знаю по Oracle и Siemens). Выбирать 7.0, если отбросить генерацию хайпа и рассматривать только проблемы с безопасностью, бессмысленно.


                                                        1. zelenin
                                                          04.02.2017 18:37

                                                          Выбирать сейчас 7.1
                                                          ну когда вы собираетесь 2.1 выкатывать? далеко не сейчас же.
                                                          отбить охоту использовать фреймворк у тяжеловесов вроде IBM
                                                          ну что они, на шаредах что ли сайты пилят?) сейчас докер очень популярен в т.ч. и у монстров рынка, а через год и того больше.

                                                          С другой стороны, какова вероятность того, что 2.1 с 5.6 проработает до начала 2019 без проблем? Как по мне, довольно высокая
                                                          ну по мне вероятность довольно высокая чуть ли не на любой версии проработать стабильно разумное кол-во лет. Хоть на 5.4. Но в то же время то одно то другое — curl, openssl, а это все связано.


                                                          1. SamDark
                                                            04.02.2017 19:01

                                                            Когда соберёмся выкатывать, тогда пересмотрим этот вопрос ещё раз.


                              1. Mendel
                                04.02.2017 16:06
                                +1

                                Религиозное это значит «дело вкуса» а не маргинальное.
                                Про SOLID слышали?)
                                Шучу, шучу. Понятно что слышали, и вопрос не без сарказма.
                                Я намекаю на то, что не нужно смешивать ответственности.
                                У каждого инструмента своя ответственность. И если фреймворк сообщает (в автоматическом виде например композеру или текстом в документации, не суть) что его технические ТРЕБОВАНИЯ такие-то, то этот инструмент предназначен для информирования о технических ТРЕБОВАНИЯХ. Можно отдельно писать рекомендации. Можно делать секьюрети-рассылки. Но не нужно навязывать одному инструменту две функции. В требованиях указывается требование. Всё. Если мы будем засовывать в требования пожелания по безопасности, то мы вернемся к лапше девяностых. Во всём.

                                ПС: я бы допустил разговор о завышенных требованиях в шаблонах приложений, но точно не во фреймворке.
                                Ну и комментарий, да. Мол требуем больше чем надо ибо вы ребятки обновляйтесь а не спите.


                                1. zelenin
                                  04.02.2017 16:21

                                  У каждого инструмента своя ответственность. И если фреймворк сообщает (в автоматическом виде например композеру или текстом в документации, не суть) что его технические ТРЕБОВАНИЯ такие-то, то этот инструмент предназначен для информирования о технических ТРЕБОВАНИЯХ. Можно отдельно писать рекомендации. Можно делать секьюрети-рассылки. Но не нужно навязывать одному инструменту две функции.
                                  если я правильно понял, вы против того, чтобы указывать в composer.json зависимости библиотеки — их надо «рекомендовать» в отдельном месте. Либо же вы отделяете зависимости в виде библиотек от зависимости в виде интерпретатора, как будто бы мейнтейнеры должны требовать установки определенных версий библиотек, на которых гарантируется стабильная работа фреймворка, но не должны требовать версию интерпретатора, потому что что-то.


                                  1. SamDark
                                    04.02.2017 17:11
                                    +1

                                    Если свежая версия интерпретатора по факту не требуется для работы кода, зачем указывать её в composer.json?


                                    1. zelenin
                                      04.02.2017 17:20

                                      для стабильной работы. вы не поддерживаете php и сторонние либы, поэтому указываете те версии, на которых гарантируете стабильную работу фреймворка. Либо сами пишите патчи для зависимостей. Вы не энтерпрайз, поэтому непонятно почему вы не можете более свободно относиться к зависимостям, не ломая совместимости в рамках семвера.
                                      Если сейчас было бы уместно указать 5.6/7.0, то к моменту выхода 2.1 до конца поддержки останутся месяцы, дай бог год.


                                      1. SamDark
                                        04.02.2017 17:31

                                        Именно. Не требуется 7.0 для стабильной работы. Мы гарантируем, что 2.1 работает прекрасно на 5.6. Если в процессе разработки 2.1 потребуется технически 7.0 или найдут фатальный недостаток в 5.6, выставим в зависимостях 7.0.


                                        1. zelenin
                                          04.02.2017 17:45

                                          поэтому сообщество зенда, симфони, ларавела будет всегда профессионально развитее, а сообщество yii2 будет состоять из динозавров.
                                          Симфони/Ларавел УЖЕ на 7.0. Зенд УЖЕ на 5.6. PhpUnit6 уже на 7.0. Большинство библиотек из обзора php-новостей на хабре УЖЕ на 7.0. А мы обсуждаем с кор девелопером yii 5.6 или 7.0 выбрать ЧЕРЕЗ ГОД.


                                          1. SamDark
                                            04.02.2017 17:57

                                            Ну как уже, когда Laravel только собирается, Symfony — не ранее ноября. PHPUnit поднял версию ради поднятия версии. Просто потому что все прыгают и я прыгну. Технически в этом необходимости не было. Теперь будут поддерживать несколько веток.


                                            Профессионально развитее потому что фреймворк не работает на 5.6 и при этом не использует ничего из 7.0? Да ладно вам. Я бы ещё понял если бы аргументом была большая степень абстракции или меньшая связанность, но не это...


                                            1. zelenin
                                              04.02.2017 18:07

                                              Ну как уже, когда Laravel только собирается, Symfony — не ранее ноября.
                                              да, ок был не прав. казалось, 3.3 уже вышла. Но тенденция ясна.

                                              Технически в этом необходимости не было
                                              да и не должно быть. Вы не энтерпрайз. Вам надо хайп ловить, привлекать новых членов комьюнити за счет трендов и баззвордов.


                                              1. SamDark
                                                04.02.2017 18:26
                                                +2

                                                Мне очень не хотелось бы в PHP видеть ту же картину, что и в JavaScript: новый тренд каждые два месяца. Начинаем делать проект на трендовом фреймворке, к релизу он уже безбожно "устарел" и не поддерживается официально. Одно дело программировать ради фана и просто забивать на любую поддержку, и совсем другое — делать основу, на которой строятся и поддерживаются годами отличные проекты.


                                                1. Mendel
                                                  05.02.2017 10:12
                                                  +1

                                                  Новые тренды ради новых трендов и академичность ради академичности. Главные болячки мейнстрима среди проф.решений.
                                                  В этом же контексте выплывает другая проблема — меняющиеся как кадры фильма версии без обратной совместимости не дают полноценно вырасти стабильной экосистеме.

                                                  Не поймите меня превратно. Вордпресс безнадежно устарел, и да, я никогда не считал его фреймворком в отличии от многих ВПфилов. Но его устаревание и его популярность это две стороны одного явления — преемственности. При всем желании ВП не может перейти на ООП, MVC и т.п. Он потеряет совместимость и перестанет быть ВП. Не ратую за то, чтобы застревать в девяностых как ВП, но понимать чего стоит гонка за модой тоже нужно.


                                  1. Mendel
                                    05.02.2017 09:59

                                    В зависимостях должны указываться зависимости. Это понятно?
                                    Юии зависим от 5.4, значит надо указать его зависимость — 5.4.
                                    Библиотеки тянутся с гитхаба одинаково хорошо, что старые, что новые, так что мешать не стоит. Плюс опять таки — минорную версию лучше указывать ту которая реальная зависимость, ведь компостер сам подтянет тебе посвежее из совместимого и стабильного.
                                    Нет, хотите строгости и паранойи? Я вас понимаю. Глядя как в первом Юии (со вторым плотно не работал, только в уже готовое что-то дописывал, так что не слежу) половина вечно забывала включить проверку XSRF у себя я делаю такие вещи по умолчанию, а если хочешь без них, то отдельно отключай. Хотите паранойю — сделайте отдельную библиотеку, назовите ее например секьюритиТест или секьюритиПак, туда пристройте все зависимости, все строгости, все проверки и замечания. Так будет ок, так будет СОЛИДно. :)


                    1. Mendel
                      03.02.2017 16:25
                      +2

                      Полностью поддерживаю. Сам в свое время перешел на 5.4 только потому что задолбался с array(). По факту конечно скорее всего есть и другие зависимости от 5.4., но когда требование на 5.4 уже есть, то дальше уже не смотришь. А всё остальное (почти всё) некритично, и стараешься писать слишком не злоупотребляя свежатиной, а когда основной костяк уже написан, то и поддерживать обратную совместимость не приходится особо. Старый код УЖЕ есть. Чисто под проект можно вводить более свежие зависимости, но ядро то зачем?


  1. coder_ept
    02.02.2017 13:14
    +1

    Очень классная новость!


  1. serieznyi
    02.02.2017 13:14

    Я долго ждал конфигурации DI через config и вот, наконец-то, дождался. Спасибо! ))


    1. vtvz_ru
      03.02.2017 13:38
      +1

      Как я с Вами солидарен, сударь. Это, пожалуй, самая приятная новость)


  1. Djeux
    02.02.2017 13:14
    +1

    Только queue модуля не хватает для полного счастья.


    1. SamDark
      02.02.2017 13:14

      Когда-нибудь и его допилим.


      1. Djeux
        02.02.2017 13:18
        +1

        Я уже себе допилил github.
        Могу помочь или просто перенести в официальный пакет если есть интерес.


        1. SamDark
          02.02.2017 13:52

          Да так много кто сделал. В issue https://github.com/yiisoft/yii2-queue есть ссылки.


          1. SamDark
            02.02.2017 13:53
            +1

            https://github.com/zhuravljov/yii2-queue пока лучшая попытка.


        1. SamDark
          03.02.2017 11:44
          +1

          Неплохая реализация, кстати. Эх, скоординироваться бы вам всем...


          1. Psih
            03.02.2017 14:39

            Объяви официальную инициативу :)
            Придётся конечно помучаться, но по другому как правило это не происходит :)


  1. vlasenkofedor
    03.02.2017 14:40

    Пожалуйста прокомментируйте этот код

    $data = $cache->getOrSet($key, function () {
        return $this->calculateSomething();
    });
    

    Почему вы считаете передачу методу параметром анонимной функции обратного вызова
    Появился удобный синтаксис


    1. padlyuck
      03.02.2017 14:55
      +2

      Меньше буковок печатать.

      Код выше делает то же, что и:
      $data = $cache->get($key);
      if ($data === false) {
          $data = $this->calculateSomething();
          $cache->set($key, $data);
      }
      

      А чем вас смущает новый синтаксис? Никто не запрещает по-старинке расписать все явно.


  1. vlasenkofedor
    03.02.2017 15:01
    -2

    Меня не смущает и абсолютно не интересует, что делает код.
    Я спрашиваю где здесь удобство синтаксиса
    Как по мне удобство синтаксиса

    $data = $cache->getOrSet($key);
    


    1. SamDark
      03.02.2017 15:13
      +1

      А данные откуда брать, если в кеше их не оказалось?


      1. vlasenkofedor
        03.02.2017 15:23
        -2

        если в кеше их не оказалось

        null, false
        и это к реализации
        вы же привели пример в качестве удобного синтаксиса
        вот про синтаксис и говорим


        1. SamDark
          03.02.2017 15:41
          +2

          Вы привели совсем не эквивалент. То, что у вас — это обычный $cache->get, который в таком виде уже давно существует. То, что в релизе — это getOrSet. То есть попробовать получить из кеша и, в случае отсутствия, вычислить и сунуть в кеш.


  1. vlasenkofedor
    03.02.2017 15:53

    Вы можете написать реализацию без callback
    Код будет читабельный, редактор будет воспринимать
    Вы же привели частный случай и описали как некое удобство.
    Нет здесь удобства, функция анонимная вместо именной. Обратный вызов без которого легко обойтись.


    1. BoShurik
      03.02.2017 16:31
      +2

      Как обойтись без обратного вызова?
      Если


      $data = $cache->getOrSet($key, $this->calculateSomething());

      То эквивалентом будет


      $default = $this->calculateSomething();
      $data = $cache->get($key);
      if ($data === false) {
          $data = $default;
          $cache->set($key, $data);
      }

      Только в таком случае кеш бесполезен


      1. vlasenkofedor
        03.02.2017 18:06

        Как обойтись без обратного вызова?

        Просто
        class Cache
        {
            private $storage = [];
        
            public function get($key)
            {
                return $this->storage[$key] ?? null;
            }
        
            public function set($key, $value)
            {
                $this->storage[$key] = $value;
                return $value;
            }
        }
        $cache = new Cache();
        $result = $cache->get('Igor') ??  $cache->set('Igor', 20);
        var_dump($result);
        

        Вы опять про реализацию, а я про синтаксис спрашивал


        1. padlyuck
          03.02.2017 18:24
          +1

          <irony> хоспади, люди просто добавили сахара, чего ж вы к синтаксису приклепались?)) </irony>


        1. Zhuravljov
          03.02.2017 18:28
          +1

          А что не так с синтаксисом? Самый удобный вариант. Вы приводите пример с готовым значением 20. А где и как вы его будете получать? Вот именно этим и будет заниматься колбэк, если в кеше еще нет готового значения.


          Наиболее распространенный кейс использования кэша:


          if (($value = $cache->get($key)) === false) {
              // Тут код ресурсоемкой операции, результат которой нужно закэшировать
              $value = 123; 
              $cache->set($key, $value);
          }

          Теперь можно так:


          $value = $cache->getOrSet($key, function () {
              // Код операции, результат которой нужно закешировать
              return 123;
          });


          1. vlasenkofedor
            03.02.2017 18:39

            А что не так с синтаксисом?

            Хорошая манера вопросом на вопрос отвечать
            Вы приводите пример с готовым значением 20
            $value = $cache->get($key)?? $cache->set($key, $this->calculateSomething());
            Считаю, что код в одну строку, лучше читаем и понятен


            1. x000000
              03.02.2017 18:44

              В кеше вполне может быть значение null и в этом случае ваш код будет всегда перекешировывать этот null. В «удобном» же варианте такого не должно происходить. Да и set метод скорее всего возвращает void.


              1. vlasenkofedor
                03.02.2017 18:53

                В кеше вполне может быть значение null

                И что? Внимательно читайте посты пожалуйста.
                Вы уже второй человек который у меня спрашивает про реализацию.
                Вопрос был
                Я спрашиваю где здесь удобство синтаксиса

                За минусы спасибо. Прикольно когда за спрос бъют


                1. Zhuravljov
                  03.02.2017 22:29
                  +1

                  Вам объясняют что, тот вариант, в одну строку, который вы предлагаете, не рабочий. И, чтобы его рабочим сделать, одной строки не хватит. get() может вернуть null, а set() возвращает результат записи в кэш, а не значение, которое вы туда пишите.


                  Удобство в том, что \yii\caching\Cache::getOrSet универсальный метод, который корректно покрывает наиболее распространенный кейс.


                  Единственное, если бы параметр \Closure $closure не стали бы делать типизированным, было бы проще. Тогда вариант в одну строку с вашей функцией мог бы выглядеть так:


                  $value = $cache->getOrSet($key, [$this, 'calculateSomething']);

                  Но и с анонимной функцией вполне удобно:


                  $value = $cache->getOrSet($key, function () {
                      return this->calculateSomething();
                  });

                  С читабельностью все в порядке. Не пойму что именно вас смущает? Анонимные функции?


                  Минусы не мои.


                  1. vlasenkofedor
                    03.02.2017 23:40

                    в вашем варианте тогда get при false считается невалидным, что если результат надо закешировать false. Почему я выбрал null

                    ей еще не было присвоено никакого значения

                    Почему set вернул значение, да потому, что это удобно в синтаксисе. Не только возвращать this для вызовов цепочкой, но и value иногда в set пример от fatfree
                    Чтоб не говорили, что мой код не рабочий. (php7)

                    Песочница 1
                    $result = $cache->get('Igor') ??  $cache->set('Igor', query());
                    

                    Песочница 2
                    $result = $cache->get('Igor',  $cache->set('Igor', query()));
                    

                    set() возвращает результат записи в кэш

                    В примере приведенном в статье автором set ничего не возвращает

                    И теперь о главном, мой вопрос звучал о синтаксисе, а не о реализации.


                    1. BoShurik
                      03.02.2017 23:48

                      Второй вариант не работает


                      1. vlasenkofedor
                        04.02.2017 00:43

                        Переписал немного

                        $result = $cache->getOrSet('Petr', $query);
                        

                        Закругляюсь всем спасибо за диалог


                        1. BoShurik
                          04.02.2017 01:53
                          +1

                          Собственно, вы пришли к варианту, описанному в посте


                    1. Zhuravljov
                      04.02.2017 00:06
                      +1

                      Вы сейчас про альтернативную реализацию кэша. А причем тут Yii2?


                    1. padlyuck
                      04.02.2017 00:44
                      +1

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


  1. x000000
    03.02.2017 17:47

    За дефолтные параметры при генерации урлов отдельное спасибо. Еще бы DI в вызов экшенов (в крайнем случае в конструктор контроллеров).


    1. SamDark
      03.02.2017 17:48
      +1

      В конструкторе есть.


  1. dfuse
    09.02.2017 21:29

    Уберите наконец bower assets :) 2017 год на дворе…