Свежая подборка со ссылками на новости и материалы. В выпуске: релизы Laravel 7 и CodeIgniter 4, атрибуты v2 и другие RFC-предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое другое.
Приятного чтения!
Новости и релизы
- CodeIgniter 4.0 — Спустя 5 лет разработки вышла новая версия фреймворка. Переписан с нуля, но всё так же в виде единого пакета. Работает на PHP 7.2+, реализованы PSR-1,3,4.
- Ближайшие мероприятия:
• Ярославль, 12 марта: BeerPHP
• Санкт-Петербург, 13 марта: BeerPHP SPB Meetup #2
• Воронеж, 16 марта: 2-й PHP-митап городского чата
• Екатеринбург, 26 марта: 3-й PHP-митап
• Казань, 28 марта: 2-й PHP-митап
• skyeng/php-communities — Открытый список PHP-событий, спикеров и организаторов.
PHP Internals
- [RFC] Attributes v2 — Вторая попытка добавить полноценные аннотации в PHP с синтаксисом двойных угловых скобок
<<...>>
. Готов черновик реализации. Ранее уже были предложения о простых аннотациях и атрибутах, последнее предложение как раз не прошло голосование.Скрытый текстuse Doctrine\ORM\Mapping as ORM; <<ORM\Entity(["repositoryClass" => UserRepository::class])>> <<ORM\Table("users")>> class User { <<ORM\Id, ORM\Column, ORM\GeneratedValue>> public int $id; <<ORM\Column(["unique" => true])>> public string $email; <<ORM\ManyToOne()>> public ?Address $address; }
- [RFC] Increment/Decrement Fixes — Операторы инкремента и декремента в некоторых случаях ведут себя не так же, как явное прибавление/вычитание единицы с присвоением. Например: Скрытый текстВ PHP 8 предлагается исправить эти и другие несоответствия и бросать
<?php $a = []; $a = ++$a; // [] and no errors $a = $a + 1; // Fatal error
TypeError
где необходимо. - [RFC] Stringable — Предложение от Nicolas Grekas принято. В PHP 8 можно будет использовать union-тип
string|Stringable
там, где ожидается строка, и передавать классы с__toString()
. При этом интерфейс явно добавлять не нужно. - [PR] Make sorting stable — Стандартные функции сортировки в PHP не являются стабильными. Это значит, что оригинальный порядок элементов с одинаковыми значениями не гарантируется (пример). Предлагается это исправить и сделать сортировки стабильными. Правда, при большом количестве одинаковых элементов такой фикс отразится на производительности.
Инструменты
- shivammathur/setup-php — GitHub action для добавления в свой воркфлоу, который подготовит среду PHP для дальнейших шагов.
- minicli/minicli — Пакет для создания консольных утилит. Серия постов в поддержку.
- cebe/php-openapi — Инструмент читает OpenAPI файлы с описанием сервисов в удобные для работы объекты PHP.
Symfony
- На SymfonyCasts выкладывают серию туториалов по разработке на Symfony 5.
- Автоматическая настройка Doctrine-репозиториев как сервисов.
- Неделя Symfony #688 (2-8 марта 2020)
Laravel
- Laravel 7 — В релизе:
• laravel/airlock — новый компонент для аутентификации в SPA.
• Кастомные касты для Eloquent — Туториал по использованию.
• Компоненты Blade теперь можно описывать в виде классов и кастомных HTML-тегов вместо тега@component
.
• HTTP-клиент — Добавлена обёртка над Guzzle с более простым интерфейсом для типичных задач. За основу взят kitetail/zttp.
• И другие изменения .
Подробные видеообзоры изменений в Laravel 7 есть на Laracasts и на канале Coder's Tape.
- livewire v1.0 — Фронтенд фреймворк для Laravel, который позволяет делать биндинги из Blade к PHP-классам и не писать дополнительного JS-кода. Видеотуториал по созданию контактной формы.
- nunomaduro/laravel-mojito — Простенький пакет для тестирования вьюшек. Демо использования.
- Оптимизация циклических отношений в Laravel.
- Подкаст Тейлора Laravel Snippet #23: Laravel 7.x, Forge, Vapor, Speaking vs. Silence.
- Видео с Laracon Australia 2019
- Принцип Единой Ответственности (SRP) на примере Laravel.
- Laravel+Docker+Gitlab. С чего начать.
Yii
- yiisoft/friendly-exception — Релиз первого пакета из Yii 3. Интерфейс для описания человекопонятных исключений сразу с возможным решением.
Laminas
- Состоялось первая встреча Технического руководящего комитета проекта Laminas — Из протокола можно узнать о планах развития и финансирования Laminas.
Async PHP
- driftphp/reactphp-dbal — DBAL для ReactPHP на основе Doctrine.
Материалы для обучения
- Как устроен JIT в PHP 8.
- Подборка хороших практик программирования на PHP от Benjamin Eberlei.
- Как я нашёл и исправил баг в стандартной библиотеке PHP.
- Использование RabbitMQ вместе с MonsterMQ, 2, 3, 4, 5.
- Маппинг данных из реляционной БД.
- Избавляемся от рутины со своим плагином для PhpStorm.
- Как написать хороший README — Также в тему отличный доклад от Андрея Ситника о том, как продвигать open-source проекты.
Аудио/Видео
- Видео с RND PHP #2 (Ростов-на-Дону)
- Видео с PHP-митапа в Йошкар-Оле
- Подкаст The Undercover ElePHPant #9 — О фоновых процессах и воркерах с Samuel Rose (Symfony core). Также основные моменты в посте Пять проблем надёжного запуска фоновых процессов на PHP.
- Подкаст Voices of the ElePHPant — Интервью с Sara Golemon и Derick Rethans об изменениях в PHP 8.
- PHP Internals News podcast #43 — C Никитой Поповым о фиксах трейтов и лексера.
- PHP Internals News podcast #42 — C Jan Bohmer о перегрузке операторов.
Спасибо за внимание!
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку.
Вопросы и предложения пишите на почту или в твиттер.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 174
EvgeniiR
Какой-то «привет из 2008», и больше похоже на пет-проект начинающего разработчика, чем что-то, что можно использовать в своих проектах.
Всё на статических хелперах, наследовании, protected-полях, массивах, DI даже не пахнет.
Из интересного сейчас есть Laminas, в частности, Mezzio(бывш. Expressive), с миддлварами из коробки и без http-kernel с его противными «ивентами».
Но контейнер хочется от Symfony, потому, кажется, проще из неё выпилить http-kernel и впилить миддлвари, чем в laminas нужный контейнер.
EvgeniiR
Интересно, те кто минусуют считают всякое такое:
voidMan
CodeIgniter по-моему вряд ли себя «отмоет» от репутации «кода на коленке», хотя кому и кобыла невеста…
Lachezis
Вот бы был очень быстрый и компонентный PSR-* фреймворк. С RAD, но без магии. C нормальной ORM и инструментарием для горизонтального масштабирования. Желательно чтобы поддерживался компанией и имел 600 страниц документации. :D
porn
А не проще самому PSR-фреймворк накатать? Или это ирония?
Lachezis
Это не ирония (https://spiral.dev/). Через 2-3 недели анонсируем официально.
Fantyk
Пользуясь случаем:)
А нет ли в недрах телеграмма (или где-то еще) чатика, куда можно задать вопросы по Cycle? Посмотрел на нее и возникло несколько «а почему так?».
Например, почему через Repository я всегда заново обращаюсь к БД и надо получать уже выбранные сущности через Heap? Или почему Repository зависит от Select?
Наверняка это сделано по какой-то причине и решает определенные проблемы. Вот бы были профильные чаты где помогли входящим в проект (тыкнули хотя-бы на страницу доки).
Lachezis
Привет, у нас есть дискорд сервер. Ссылка странице репозитарий. Телеграм ещё не завели, но уже активно думаем в эту сторону.
m0rtis
Что-то я не понял сложности добавления контейнера от Симфони в Ламинас. Подумал даже, что туплю и перепроверил. У Симфони PSR-11 контейнер — вот https://github.com/symfony/dependency-injection/blob/24918d956cec89aebdf9dd69fc569a980469be3c/ContainerInterface.php#L25
Laminas поддерживает любой PSR-11 контейнер. Профит
Maksclub
В статье один из заголовков:
Да-да, сущности в / Entity, репозитории в /Repository, сервисы в /Services
Ну да, ну да, конечно — пошла я нафиг, плоская нормальная логическая структура проекта.
galliard
Вперед, к утиной типизации!
Вообще объекты, реализующие __toString() и так можно принять в функцию по хинту string. По моему так и надо делать, если функция собирается работать с параметром как со строкой, то какая ей разница родной это стринг или или объект?
Конструкции типа string|Stringable будут только засорять код без острой на то необходимости.
Maksclub
в режиме строгой типизации
declare(strict_types=1)
не можно (а я не видел проекты большие и современные без него)Нужно приводить к строке при передаче
galliard
А я наоборот никогда не юзаю ущербный declare(strict_types=1). Абсолютно бесполезный костыль.
Вообще повальное увлечение этой директивой больше похоже на попытку компенсировать свои комплексы. Мол раньше все считали пхпшников говнокодерами из-за слабой типизации. А теперь и у нас есть сильная типизация и можно наконец-то причислить себя к когорте «нормальных» программистов.
Реальные проблемы слабой типизации эта дериктива все равно не решает.
Gemorroj
symfony можно считать "большим и современным" проектом?
declare(strict_types=1) нужен лишь для редких случаев, когда нам кровь из носу нужно не пролюбить какое-то float-string-int приведение (работа с бд, например)
Maksclub
Фреймворк с большим шлейфом обратной совместимости считать за пример так себе. Ну и да — команда из symfony не особо пролюбила strict_types github.com/symfony/symfony/issues/28423
Разрабы доктрины например ЗА строгость явную и настаивают на этом :)
Однако обсуждаемое предложение — от основного разработчика Symfony.
Gemorroj
тем не менее, они пока так и не реализовали этот фичреквест.
не думаю, что у симфони есть проблемы с легаси. в рамках мажорных версий они ее ломают и прекрасно сохраняют чистоту кода.
для доктрины понятно использование strict_types (именно из-за нее и упомянул в предыдущем посте работу с БД). Но так же мне приходилось сталкиваться с проблемами вроде той, что описана здесь https://github.com/symfony/symfony/issues/28423#issuecomment-420972515
в итоге от использования phpstan будет больше пользы, чем от strict_types. по крайней мере, пока php не оптимизирует свои структуры специально для strict_types.
https://github.com/symfony/symfony/issues/28423#issuecomment-419857864
Ferikl
смешанные чувства по поводу аннотаций, вроде уже и не кодить в комментраиях но все еще стремно
Maksclub
«Кодить в комментариях» ничем не отличается от кодить на «листе блокнота», парсится так или иначе все одинаково, просто на разных уровнях абстракции
Hett
Не понятно чем не понравились аннотации как в java (те, что сейчас в phpdoc)… Обязательно что то новое придумывать?
arutyunov
Не попали в подборку мероприятий. В СПб в эту пятницу проводим 2-ой митап BeerPHP SPB, ссылка евента и регистрация: www.meetup.com/ru-RU/beerphp_spb/events/269346462
Обсуждаем в телеграме: @beerphp_spb (https://t.me/beerphp_spb)
sergant210
Ссылка на хороший README нерабочая.
pronskiy Автор
Проверил, работает ?\_(?)_/?