Предлагаем вашему вниманию очередную подборку со ссылками на новости и материалы.
Приятного чтения!
Новости и релизы
- PhpStorm 2016.1
- Phalcon 2.1.0 RC1 — Ожидается LTS-релиз с поддержкой PHP 7. Прислал igusev.
- Codeception 2.2 Beta
PHP
- RFC: Typed Properties — Предлагается реализовать типизированные свойства:
class Foo { public int $int = 1; public float $flt = 2.2; public array $arr = []; public bool $bool = false; public string $string; public callable $callable; public stdClass $std; public OtherThing $other; public $mixed; }
- Трекер PHP RFC — Ресурс агрегирует информацию по всем RFC, а также доступна статистика контрибьюторов.
- php.internals: Add spaceship assignment operator — Ироничное сообщение от Никиты Попова по поводу предложений добавить операторы ??= и ?:=. Для консистентности Никита предлагает добавить еще следующие сокращенные операторы:
$a <=>= $b; // эквивалентно $a = ($a <=> $b); $a ==== $b; // эквивалентно $a = ($a === $b);
Инструменты
- Ocramius/PSR7Csrf — Генератор/валидатор CSRF-токенов на PSR-7 без хранилища данных.
- ratchetphp/Pawl — Асинхронный WebSocket клиент.
- spatie/menu — Генератор HTML меню. Пост в поддержку.
- producerphp/producer.producer — CLI-инструмент для автоматизации процесса релиза PHP-пакетов. Пост от автора в поддержку.
- Swader/nofw — Скелет приложения без фреймворков.
- kelunik/acme-client — Сервис Let's Encrypt позволяет бесплатно генерировать подтвержденные SSL-сертификаты. По ссылке PHP-клиент для Let's Encrypt для тех кому не подходит оригинальный на Python. Пост об использовании.
- sitepoint/Rauth — ACL для классов и методов на основе аннотаций. Туториал по использованию.
- lcobucci/jwt — Простая библиотека для работы с JSON Web Token.
- ptlis/conneg — Content Negotiation для PHP.
- niklongstone/regex-reverse — Генерирует строку на основе регулярного выражения.
- Fakerino/Fakerino — Генератор тестовых данных, альтернатива Faker.
- jobbyphp/jobby — Продвинутый менеджер cron-задач.
- Codeception/AspectMock 1.0 — Библиотека для создания тестовых двойников, позволяющая делать моки буквально для всего.
- php-composter/php-composter — Управление Git-хуками с помощью Composer.
Материалы для обучения
Symfony
- Руководство по Symfony — Пример API
- Руководство по Symfony — Skeleton
- Новое в Symfony 3.0
- Бенчмарки Symfony: PHP-FPM vs. PHP-PM (на PHP 7 и HHVM)
- Асинхронные контроллеры в Symfony
Yii
- Interactive Yii 2.0 shell
- Новые рецепты из Yii 2.0 Cookbook: Canonical URLs, CSRF, XSS
- Q&A про Yii #1
- Мартовские релизы официальных расширений Yii 2.0
- Используем миграции Yii2 для работы с несколькими базами данных
- Работа со связанными моделями в Yii2 на примере каталога
- Сервис на Yii2: Публикация Composer-расширений на GitHub и Packagist
- Cервис на Yii2: Добавление RBAC
Laravel
- Про Laravel
- Недостатки Laravel
- Laravel TestTools — запись тестов для Laravel прямо из браузера Chrome
- Работа с событиями в Laravel. Рассылка push уведомлений при публикации статьи
- Число прописью в Laravel 5
- Дерево разделов неограниченной вложенности и URL
- Создание беспарольной аутентификации в Laravel, используя только email
- Декодирование типа данных JSON MySQL
- Вопрос-ответ с Taylor Otwell
- dingo/api — RESTful API для Laravel и Lumen.
- tylercd100/lern — Пакет для Laravel 5, который сохраняет информацию о возникших исключениях в базу и уведомляет по Email, Pushover или Slack.
- Горизонтальное масштабирование Laravel при помощи Docker
- Почему PHP-разработчики думают, что MVC — это архитектура приложения?
- Туториал по созданию плагина для Composer
- Макросы в PHP для развлечения и пользы — Об использовании препроцессора marcioAlmada/yay.
- PHP для начинающих. Подключение файлов
- PHP для начинающих. Обработка ошибок
- Введение в PHP 7: Что добавлено, что убрано
- Прекрати злоупотреблять массивами в PHP
- Настройка редактора Visual Studio Code для разработки на PHP
- SoftMocks: наша замена runkit для PHP 7
- Деплой на shared-хостинг: боль и страдания или простая рутина?
- О чем говорят тренды PHP в 2016-м году?
- DI плагины в Magento 2
- Мультиисключение или Хочу поделиться одним интересным архитектурным приемом
- Как использовать именованные конструкторы в PHP
- Когда использовать статические методы
Аудио и видеоматериалы
- Что может RabbitMQ сделать для вас
- Hacking on PHP 7, 2 — PHP core-разработчик Joe Watkins рассказывает об устройстве PHP на примере добавления новой функции в интерпретатор. Также доступен пост.
- PHP Roundtable: 042: Staying Relevant For Web Development
- 5 способов ускорить PhpStorm
- PHP UK Conference 2016 — Видеозаписи докладов.
- Building Extraordinary Packages — О пакетах League.
Занимательное
- Подсчет слов на различных языках программирования — Реализация на PHP 7 по скорости заняла 4-е место.
- tagua-vm/tagua-vm — Виртуальная машина PHP реализованная на Rust.
- Сервер PHP на Android
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Присылайте ссылки на интересные статьи или полезные инструменты, которых не было в PHP-Дайджестах, и ваше имя будет рядом с присланной ссылкой в выпуске.
Прислать ссылку
Быстрый поиск по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 81
Комментарии (29)
AleksDesker
28.03.2016 06:33PhpStorm научился держать живым коннект, чтоб без пауз изменения на сервак заливать. Лет 5 сидел в Zend Studio 5.5 дожидаясь этой фичи.
quantum
28.03.2016 10:52+2А он же и раньше умел, нужно было открыть соединение в окошке "remote host", после этого file transfer использовал это соединение
AleksDesker
28.03.2016 20:39Нет, раньше он этого не умел, ссылку ниже правильную дали: http://blog.jetbrains.com/phpstorm/2016/03/changes-to-remote-connection-keep-alive-in-phpstorm-2016-1/ Там правда были варианты со всякими костылями, типа создания туннеля с локали, но это уже не про PhpStorm.
Yeah
28.03.2016 14:13Честно говоря, так и не понял use case для использования генераторов случайных тестовых данных. А все примеры в Сети: просто констатация факта — вы можете использовать тестовые данные. Кто использовал Faker и иже с ними в реальных проектах? Поделитесь примером, когда это реально работает.
ykushnir
28.03.2016 18:27Клиенту гораздо приятнее и понятнее смотреть демо проекта, где будут более-менее осмысленные слова и выражения вместо lorem ipsum-ов и фраз вида «fwhufgw gregheur».
alexkunin
28.03.2016 18:54Допустим, вы делаете некую систему с клиентами, заказами, счетами. Пока у вас 3 тестовых клиента по одному заказу и счету — все хорошо. Как проверить нагрузку при 10К клиентов, у каждого по 30-40 счетов (примерно 3 года ежемесячных платежей), и т.д.? Или ваш проект принимает на вход JSON или CSV с дампом всех счетов и клиентов из такой системы — как сгенерировать тестовые данные?
Ничего особо сложного нет таких задачах, но когда вы возьметесь за них, проведете сначала 10 минут, потом еще часок, потом еще парочку, и в следующем проекте — опять с нуля все. А тут готовый инструмент, раз изучил, везде используешь. Ничего критического, просто удобство.Yeah
28.03.2016 23:44Ваш пример имеет право на жизнь, но честно говоря я ожидал немного иного примера. Обычно Faker приводится в контексте юнит-тестирования. Вот как это прикрутить к юнит-тестам, я понять не могу. Во всех примерах (тот же Laravel) обычно пишут, вот смотрите: вы можете создать модель User и заполнить ее реальными данными. Ну ок, и чё??? Получается, что никакие assertEquals не подходят, ибо данные сгенерированы случайно. То есть максимум, что я могу проверить — какую-нибудь логику валидации, что например я передал в setEmail корректный email или нет, что имя пользователя длиннее 5 символов или нет. Но только для такого применять здоровенную библиотеку… Не знаю, мутно как-то...
alexkunin
29.03.2016 00:09Эээ, может Mocker приводится в контексте юнит-тестов? Я тоже не могу придумать, где Faker и рандомные данные могут пригодится в тестировании, которое должно быть процессом детерминированным, т.е. вам нужно самому придумать такие входные данные, которые поведут проверяемый код по тому или другому пути, и таким образом образуется 100% code coverage. Ну, рандомом тоже можно покрыть 100% кода, просто это слишком затратно и никаких гарантий, что на слеюущий ран тестов опять 100% покроет, и ваше изменение не будет полностью проверено.
Yeah
29.03.2016 02:04Вот например Там есть код теста. Реально они тупо проверяют assertInstanceOf
alexkunin
29.03.2016 02:29+1Википедия (https://en.wikipedia.org/wiki/Mock_object#Mocks.2C_fakes_and_stubs) пишет, что в литературе эти три понятия — моки, фейки и стабы — постоянно перемешиваются, но смысл в том, что это три уровня «примерной реализации» реального объекта, который нужен как параметр в целях тестирования другого объекта. Кто-то из этих троих просто набор фиксированных свойств со значениями, кто-то даже какую-то логику может предоставлять, ну и кто-то посередине.
Т.е. в приведенном вами примере просто смешаны Fake как элемент тестирования ("$fm->define('Message')->setDefinitions(...)" и «static::$fm = new FactoryMuffin();») и Faker как генератор случайных данных по шаблону («Faker::firstNameMale()» и т.д.). И именно Faker тут никак не нужен, на сколько я понимаю, т.к. данные не должны быть случайными.
Т.е. я полностью разделяю ваше смущение. Но похоже, просто смешаны термины Fake (в смысле Mock/Stub) и Faker (в смысле генератор случайных данных по образцу).
Big_Shark
29.03.2016 07:00Там при вызове функции create и seed есть параметр $attr, который позволяет переопределить нужные нам данные, таким образом у нас объект валидный за счет того что все поля заполнены, и заполнены верно, а нужные нам поля мы можем без проблем изменить взяв их значение допустим из dataProvider.
CyberSoft
29.03.2016 22:21Нам, к примеру, потребовалось в Elasticsearch посмотреть сколько места будут занимать данные и как будут выполняться запросы. Конечно, реальных данных нам никто не даст, NDA, всё такое. Первый велосипед был быстро набросан в скрипте на php, примерно генерируя то, что нам нужно. После уже обнаружили esBench, который собирает инфу на реальных данных, а потом мы можем по готовым шаблонам залить данные и сделать оценку. Но какой-то он заброшенный… У php ещё есть шанс :) можно будет посмотреть предложенные в этой статье инструменты.
Fesor
29.03.2016 12:44Представьте что вы пишите тест (внезапно да), и у вам надо проверить как система обрабатывает какие-то данные. Данных много, а вам важны только 2-3 значения, все остальное — можно просто сгенерировать.
У меня такие ситуации появляются чуть ли не каждый день.Yeah
29.03.2016 15:54Извините, представить получается с трудом. Если система не работает с какими-то данными, то это мертвые данные — зачем они нужны? Если ваш тест не покрывает какую-то функциональность, а работа с такими данными ведется, то это неполный тест — толку от такого нет.
Fesor
29.03.2016 16:44толку от такого нет.
Другую часть этих данных покрывает другой тест кейс, третью — третий. В рамках тест кейса обычно тестируются важные вещи, а такие вещи как "имя пользователя" или его день рождения можно сгенерить для правдоподобности.
Если вам интересно реальное применение — вот:
https://github.com/nelmio/aliceYeah
29.03.2016 16:53Про эту либу слышал, сама по себе ссылка не приоткрывает завесу тайны, но пошел там по ссылкам и нашел-таки реальный пример!!! Так что спасибо за наводку
alexkunin
28.03.2016 18:27«Подсчет слов на различных языках программирования» (http://juditacs.github.io/2016/03/19/wordcount2.html?hello) — реализация на nodejs в 10 раз медленнее, чем на php 7 (и примерно в 5 раз медленнее, php 5.6). Неужели там все так плохо?? В код не вчитывался, просто пробежался — ничего особо страшного… Мне казалось, нода позиционируется как супер быстрая штука.
adombrovsky
29.03.2016 09:17+1Хоть убейте, но я не понимаю зачем нужны все эти spaceship операторы. Выглядят они не очевидно, код не читабелен.
alexkunin
29.03.2016 17:00Упомянутые в статье assignment shapceship — это дичь какая-то, мы стремительно приближаемся к брейнфаку. Я решительно не могу придумать юз кейз для этих вот штук (привожу вариант «было», а не «хотелось бы».):
$a = ($a <=> $b);
$a = ($a ==== $b);
Зачем так повторно использовать переменные? С большой вероятностью $a в результате меняет свой тип, поэтому и считаю дичью.
А вот сам оператор <=> очень хорош, потому что заменяет целый кусок опостылевшего кода (а если на входе пара вызовов функций, то еще и промежуточные переменные вводить нужно):
if ($a < $b) $c = -1;
elseif ($b > $a) $c = 1;
else $c = 0;Fesor
29.03.2016 17:08+1Упомянутые в статье assignment shapceship — это дичь какая-то
Собственно в этом и суть, и именно по этой причине Никита иронично отписался в php-internals.
Зачем так повторно использовать переменные?
Картинка про сарказм.
Alcogolic
06.04.2016 00:19Ещё одна хорошая новость — 10 апреля выйдет драйвер PDO MSSQL для PHP7 https://github.com/Azure/msphpsql/issues/58
Borro
Забыли пару тем, в которых кипят страсти в комментариях:
pronskiy
Сознательно не включил :-) RestAPI — явно из категории "вредные советы", а в посте про Битрикс типичный флейм.