Предлагаем вашему вниманию очередную подборку со ссылками на новости и материалы.
Приятного чтения!
Новости и релизы
- Zend Expressive 2.0
- Composer 1.4.0 — Оптимизировано использование памяти + несколько других улучшений.
- Prophecy 1.7.0 — Обновление популярного инструмента для создания тестовых двойников.
- PhpStorm 2017.1 Public Preview — Поддержка Codeception, PHPUnit 6, улучшена поддержка PHP 7, и другие улучшения.
- HHVM теперь поддерживает архитектуру ARM
- WordPress запускается на .NET — После года разработки проект Peachpie, в рамках которого развивается открытый компилятор из PHP в .NET, достиг возможности компиляции WordPress.
- Сразу несколько известных контрибьюторов PHP-сообщества запустили краудфандинговые кампании для развития своих проектов. Поддержим ребят и пожелаем им успехов и сил!
- Владимир Резниченко — Php Inspections
- Sebastian Bergmann — PHPUnit
- Александр Макаров — Yii — Подробнее в посте Александра SamDark.
PHP
- RFC — Deprecation of fallback to root scope — На данный момент в случае, если функция или константа не найдены в пространстве имен, будет попытка найти сущность с таким именем в глобальном пространстве. Предлагается объявить функциональность устаревшей и бросать ошибку уровня Notice:
Undefined function \My\NS\strlen(), assumed \strlen() Undefined constant \My\NS\PHP_VERSION, assumed \PHP_VERSION
Инструменты
- fzaninotto/Faker — Библиотека для генерации тестовых данных. Свежий туториал по использованию. Прислал im_special_one.
- tarantool-php/mapper — Прозрачная работа с базой данных Tarantool. Прислал nekufa.
- makasim/yadm — Быстрая реализация schema less ODM для MongoDB.
- magium/configuration-manager — Библиотека для управления конфигами. Видеотуториал.
- Maxlab/stacker — Дев-окружение на основе Docker для разработки на популярных фреймворках. Хабрапост в поддержку.
- justinrainbow/json-schema — Инструмент для валидации согласно json-schema.org. Fesor подсказал альтернативное решение thephpleague/json-guard.
- BrainMaestro/composer-git-hooks — Управление Git-хуками из конфига Composer.
- ScriptFUSION/PHPUnit-Immediate-Exception-Printer — Печатает информацию о возникших ошибках во время выполенения тестов не дожидаясь их конца.
- tuupola/server-timing-middleware — PSR-7 и PSR-15 компонент, который позволяет легко добавить заголовок Server-Timing со значениями таймеров, которые отобразятся на вкладке Network инструментов разработчика в браузере.
- cilex/cilex — Фреймворк для создания инструментов командной строки.
- woohoolabs/yang — Клиент для JSON:API.
- spatie/server-monitor-app — Монитор состояния сервера, умеет отправлять уведомления по email и в Slack.
- antanas-arvasevicius/enumerable-type — Строго типизированная реализация Enum.
- violet-php/streaming-json-encoder — Потоковое кодирование JSON на лету, по сравнению с
json_encode
нет необходимости загружать все данные в память перед кодированием и весь результат после кодирования.
Материалы для обучения
Symfony
- Об интеграции комментариев Disqus в Symfony-приложение
- О производительности маршрутов в Symfony
- Опрос сообщества Symfony 2017
- Видеоуроки по Symfony для начинающих
- Новое в Symfony 3.3: Предзагрузка ресурсов с помощью HTTP/2 Push
- Неделя Symfony #531 (27 февраля — 5 марта 2017)
- Неделя Symfony #532 (6-12 марта 2017)
Yii
- codemix/yii2-configloader — Конфиги для Yii 2 из переменных окружения или .env файлов.
- Разработка на Yii2: ActiveRecord
- Плагины PhpStorm для Yii
- Yii2, быстрый старт. Самый простой сайт на Yii2 со статическими страницами без использования БД
- Логирование в Yii 2.0 и PSR-3
- Архитектура Enterprise на Yii2. Абстракция, инверсия зависимости, инкапсуляция бизнес-логики и управление изменчивостью
Laravel
- laravelio/pastebin — Клон Pastebin на Laravel. Демо.
- mattstauffer/Torch — Пример использования каждого компонента Laravel вне фреймворка.
- cybercog/laravel-ban — Позволяет добавить возможность блокирования (бана) к любой Eloquent-модели.
- lubusIN/laravel-decomposer — Модуль для Laravel, который выводит информацию об установленных пакетах, зависимостях, окружении.
- Laravel Homestead V5.0.0 — Обновление дев-окружения на основе Vagrant, может быть использован не только для Laravel. Видеотуториал по использованию.
- Awesome Laravel — Подборка материалов и инструментов по Laravel. Также имеется небольшая подборка русскоязычных материалов.
- Laravel Forge API — API сервиса теперь задокументировано. Имеется неофициальный клиент mpociot/blacksmith.
- Туториал по Laravel и ElasticSearch — Прислал im_special_one.
- Двухфакторная аутентификация в Laravel с помощью SMS (Twilio)
- Laravel vs Symfony. Что выбрать? — Прислал im_special_one.
- Состояние PHP MVC фреймворков в 2017
- Базовые техники рефакторинга: извлечение метода
- Туториал по работе с Google Spreadsheets на PHP
- Работа с PUT-запросами на загрузку файлов в PSR-7 middleware приложениях
- Замыкания, анонимные классы и альтернативные подход к мокам в тестировании
- Разделенные токены — О способе защиты от атак по времени при аутентификации токеном.
- Отладка PHP-приложения с помощью strace
- Об уязвимости в OPCache, исправленной в PHP 5.6.29, 7.0.14
- Оптимизация автозагрузчика Composer — Немного обновлена официальная документация.
- Вебинар от JetBrains по использованию PhpSpec и PhpStorm — Прислал im_special_one.
- Непрерывная интеграция для PHP-проектов с помощью PHP Censor
- Magento BarCamp — новый сезон докладов. Март 2017
- Оживляем FirePhp в Firefox
- Magento U опубликовало бесплатный курс Fundamentals of Magento 2 Development
Занимательное
- От 0 до 1000 звезд на GitHub за три месяца на сайд-проекте — Об успехе статического анализатора PHPStan.
- Taylor Otwell: Как я работаю
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Прислать ссылку
Быстрый поиск по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 103
Комментарии (27)
VolCh
13.03.2017 10:51antanas-arvasevicius/enumerable-type — Строго типизированная реализация Enum.
Сколько себя помню :) всегда люди пытались реализовать Enum в PHP. Даже я пару раз пытался. Эта реализация выглядит лучше многих, но опять ограничения, прежде всего с десериализацией :( Что не так с PHP, что нельзя впилить такой тип в ядро?
ghost404
15.03.2017 11:08Посмотрел код проекта. Оказалось все еще хуже чем я думал. Список доступных значений для ENUM получается с помощью рефлексии наследующего класса. Метод valueToString вообще мастерский говнокод.
Я ENUM в PHP рассматриваю как ValueObject и отношусь к нему соответствующе. В сущностях храню сам объект, а не его значение, список доступных значений описываю в явном виде и добавляю методы необходимыми для бизнеслогики.
VolCh
15.03.2017 11:12enum — ValueObject или значения типа enum — ValueObject?
ghost404
15.03.2017 11:22не очень понял вопрос.
Значение, для свойства объекта доменной области, может быть перечисление (enum). Для контроля за этим перечислением его удобно описать в виде объекта значения (ValueObject). Получается что-то вроде:
$my_type = TicketType::priority(); if ($ticket->type()->equals($my_type)) { }
или так
if ($ticket->type()->isPriority()) { }
ellrion
15.03.2017 12:06все реализации ENUM в PHP через рефлексию. Так как у вас обычно классы ENUM условно маленькие а результат операции разумно кешируется во внутреннем поле, то накладные расходы весьма малы
ghost404
15.03.2017 15:05Можно реализовать все тоже самое кеширование и прочие радости без рефлексии, явным образом реализовав метод или свойство которые возвращают список доступных значений.
Также можно добавить методы необходимые для бизнес логики и человеческое описание для вариантов значения для вывода на frontend. В случае использования подхода с рефлексией этого сделать нельзя.
ellrion
15.03.2017 15:31Можно реализовать все тоже самое кеширование и прочие радости без рефлексии
это я не понял вообще
Также можно добавить методы необходимые для бизнес логики и человеческое описание для вариантов значения для вывода на frontend. В случае использования подхода с рефлексией этого сделать нельзя.
Это почему нельзя? что мне помешает?
Вообще всё что там дает рефлексия это убирает необходимость дублировать сами значения и как независимые единицы (в данном случае методы конструкторы) и в списке всех значений, что избавляет от дублирования и возможной человеческой ошибки. При этом как я и говорил ранее не особо нанося урон производительности.
Я вот пользуюсь реализацией myclabs/php-enum и там указываются константы.
ghost404
15.03.2017 16:09Это почему нельзя? что мне помешает?
Пример на основе того же myclabs/php-enum. Я добавляю человеческое описание для вывода на frontend
class Action extends Enum { const VIEW = 'view'; const EDIT = 'edit'; // константы воспринимаются как варианты значения // формат предназначен для перевода const TITLE_VIEW = 'acme.demo.action.view'; const TITLE_EDIT = 'acme.demo.action.edit'; // можно использовать для radio/checkbox/select public static function choices() { return [ self::VIEW => self::TITLE_VIEW, self::EDIT => self::TITLE_EDIT, ]; } public function title() { return static::choices()[$this->getValue()]; // можно былоб писать проще и не создавать метод choices, // но тогда такую конструкцию тяжелее использовать для radio/checkbox/select //return 'acme.demo.action.'.$this->getValue(); } }
Можно не добавлять префикс для значения, но тогда теряется контекст. Одно и то же значение в разном контексте может по разному переводится.
Пример на основе antanas-arvasevicius/enumerable-type. Я добавляю свои методы для бизнеслогики
class Action extends EnumerableType { final public static View() { return static::get('view'); } final public static Edit() { return static::get('edit'); } // воспринимается как вариант значения final public static equals(Action $action) { return $this->id() === $action->id(); } }
ellrion
15.03.2017 16:50Чёт я запутался… вы пишете:
… случае использования подхода с рефлексией этого сделать нельзя.
я с этим не согласился и потом вы мне приводите именно пример что можно! Что то пошло не так?
в случая же 2 вы как то сразу схитрили. Зачем метод делать
final public static
? Да именно такие, и только такие, методы воспринимаются как значения. Ну ограничение той реализации. Точно так же как в myclabs/php-enum константы. Что особо не влияет на саму возможность делать
методы необходимые для бизнес логики и человеческое описание для вариантов значения для вывода на frontend.
ghost404
15.03.2017 17:22я с этим не согласился и потом вы мне приводите именно пример что можно! Что то пошло не так?
Как раз я привожу пример что нельзя. myclabs/php-enum воспринимает константы с описанием как варианты значения. Тоесть метод
Action::toArray()
вернетTITLE_VIEW
, что не корректно. Можно объявить TITLE_VIEW как не константу, но это все ухищрения чтоб угодить инструменту, а не бизнесу.
Хорошее решение этой проблемы предлагает библиотека marc-mabe/php-enum, которая воспринимает только публичные константы, но нужен PHP 7.1.
в случая же 2 вы как то сразу схитрили. Зачем метод делать
final public static
?Да, схитрил. Естественно. Потому что с точки зрения бизнеса не должно быть
final
и неfinal
методов. Весь объект должен бытьfinal
. А если инструмент требует помечать методы какfinal
, то я вынужден и остальные методы тоже помечать какfinal
, чтоб защитить класс.
Я хочу сказать, что используя подход с рефлексией, мы получаем автоматизацию генерации списка доступных значений (
Action::choices()
), и в тоже время некоторые ограничения на использование методов или констант.
Создав один методAction::choices()
вручную, мы сохраним все те же самые функции, но не будем иметь ограничений накладываемых рефлексией.ellrion
15.03.2017 18:32А… да по поводу непонимания мой косяк. Извиняюсь был невнимателен. День тяжелый.
Но всё же.
используя подход с рефлексией, мы получаем автоматизацию генерации списка доступных значений
Да, собственно я с этого начал. И да, вы правы ограничения есть, однако это не это не равно утверждению "с рефлексией этого сделать нельзя".
ghost404
15.03.2017 19:29И да, вы правы ограничения есть, однако это не это не равно утверждению "с рефлексией этого сделать нельзя".
Если ограничения не позволяют нам что-то сделать, значит это сделать нельзя. Разве нет?
Если ограничения накладываются в результате использования рефлексии, то значит "с рефлексией этого сделать нельзя".
Вроде все логично.
Предлагаю подвести итоги.
Можно использовать как явное описание списка доступных значений, так и динамически генерируемое с помощью рефлексии. Оба вариант имеют свои плюсы и минусы. Я услышал ваше мнение и признаю, что вариант через рефлексию тоже имеет право на жизнь.
SamDark
13.03.2017 11:57+2Отличная подборка в этот раз. Нашёл для себя новые штуки. Одно только огорчило:
Двухфакторная аутентификация в Laravel с помощью SMS (Twilio)
Не стоит рекламировать SMS в качестве фактора аутентификации. Дырявый канал.
ellrion
13.03.2017 15:42+1А можно попросить накинуть инфы об этом? В гугле не забанили, но мб у вас под рукой есть инфа.
ollisso
13.03.2017 11:59+2https://wiki.php.net/rfc/fallback-to-root-scope-deprecation
Самый странный RFC который я видел, это кому то реально нужно?VolCh
13.03.2017 12:25+1Как я понимаю, сильно упростит создание автозагрузчиков функций.
ghost404
15.03.2017 10:03А нам придется перед каждой функцией и константой писать слеш. Этож сколько проектов начнет заваливать логи нотисами, а потом и вовсе упадет. Тогда уж и для функций языка нужно вводить неймспайсы.
tzurbaev
14.03.2017 10:01+3Laravel Forge API — API сервиса теперь задокументировано. Имеется неофициальный клиент mpociot/blacksmith.
Пользуясь случаем попиарю свою реализацию API SDK — https://github.com/tzurbaev/laravel-forge-api :)
MaxZN
Огромное спасибо за дайджесты и отдельное спасибо за наш stacker — не забыли, приятно.