PHP Fart Time
1.72K subscribers
75 photos
3 videos
2 files
162 links
Привет, фартаны!

Дурачимся, пилим OpenSource и рассказываем про пердовые технологии в php.

Авторы контента: @roxblnfk и @butschster
Download Telegram
Через полтора часа стрим!
На этот раз прямо в ютубчик и под пиво.

Присоединяйтесь. Поговорим про RoadRunner.

https://www.youtube.com/live/3WdSCnzsFKE?si=aB3TeAGj_19ixsxK
#Article #Типизация #php

Всем нравятся Constructor Property Promotion, не так ли?

final class Foo {
public function __construct(
public bool $bar = false,
public array $baz = [],
) { }
}

☝️ эти фрагменты кода эквивалентны 👇

final class Foo {
public bool $bar;
public array $baz;

public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}

Но не эквивалентны этому:

final class Foo {
public bool $bar = false;
public array $baz = [];

public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}

Разница в наличии значений по умолчанию у свойств.

Теперь попробуем создать объекты из обоих вариантов через рефлексию без использования конструктора.
https://3v4l.org/0tLcM

object(Foo)#3 (0) { ["bar"]=> uninitialized(bool) ["baz"]=> uninitialized(array) }
object(Foo)#3 (2) { ["bar"]=> bool(false) ["baz"]=> array(0) { } }

Если у свойства нет значения по умолчанию, то оно будет неинициализированным.

Такой способ создания объектов в обход конструктора широко используется под капотом многих библиотек, не только тех, которые используют doctrine/instantiator.
И иногда это стоит учитывать при работе с классами, которые будут проходить через гидрацию или демаршализацию. У меня такое уже выстреливало 😳.

А если ты счастливый пользователь Cycle ORM, то я рекомендую вообще закрывать конструкторы сущностей (делать пустой приватный конструктор) и вместо этого писать фабрики.
#ВредныеСоветы #Типизация #php

Как сломать типизацию:
https://3v4l.org/nTogS

Как сломать readonly (и типизацию):
https://3v4l.org/gSWFF

Также не забываем про пакет unfinalize.

Что там ещё нам мешает писать код по своим правилам?
Please open Telegram to view this post
VIEW IN TELEGRAM
Тоже накину про инициативу Валентина Удальцова по поводу new MyClass()->method() без скобок.

Я считаю, что это изменение было бы к лучшему.

Да, это не привычно, да можно сделать статический метод MyClass::new(), который потом приятно выглядит в fluent вызовах MyClass::new()->method().
Но:
- Скорее всего вы сами по-началу плевались на эти скобочки. А кто-то плюётся и сейчас, прыгая между стеками.
- Статические конструкторы - прекрасно, когда есть несколько путей создания объекта (fromFile(File $file), fromString(string $data)). Но когда мы описываем класс DTO, то на кой нам эти статические конструкторы? DTOшек много. А ещё на каждый статический конструктор придётся дублировать параметры с конструктора вместе с их описанием!
- Насколько я понимаю, тут нет никакого слома обратной совместимости и всё, что работало, продолжит работать.

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

Если Валентин инициативу дожмёт - будет мега-круто. Я свою не дожал 🫤

Дискуссии:
PR на GitHub
Пост в канале Пых
Пост в канале Предводителев
Обсуждение в X
Записали стрим по атрибутам.
Мы их используем давно и везде - во фреймворке, в пет-проектах и на продуктах. А вы?

Из того, что забыли сказать:

1. Есть пакет spiral/attributes, который раньше использовался для чтения атрибутов и аннотаций через единый интерфейс. Раньше он был очень актуален, а в версии пакета 2.х парсинг атрибутов работал даже на PHP 7.4 (хотя атрибуты появились только в PHP 8). spiral/attributes был хорошим помощником в переходный период с аннотаций на атрибуты, но сейчас, с отказом от аннотаций, он становится немного неактуальным и требует пересмотра концепции. Поэтому, отвечая на запрос втора канала Хэндлим тему, говорю, что производить сравнения spiral/attributes с либами типа этой было бы некорректно — слишком уж разные.

2. С наступающим Новым Годом!
Привет, фартаны!
Закончился 2023 год, начался 2024.
Пришла пора оглянуться назад и посмотреть на проделанную работу, а заодно расставить таймкоды.

📽 Все про PHP attributes
📽 Distributed Cron scheduling
📽 Создаем простой чат с использованием Spiral Framework, RoadRunner и Centrifugo WS сервер и VueJs
📽 Что такое RoadRunner app server и для чего он нужен PHP
📽 Как работать с gRPC в PHP
📽 Пишем простой Temporal workflow

С Новым Годом! Говорят, он будет хуже, чем предыдущие, но последним (правда не говорят, в каком смысле).
Пишите в комментариях, что бы вы хотели увидеть в следующем стриме.
Привет, фартаны!

Вот и подведён итог 2023 года в PHP RU сообществе.
Что тут сказать? Такой сокрушительной победы мы и не ожидали! Спасибо за поддержку и внимание 🥳

https://t.me/tg_5minphp/1299
Пинг.

Скоро выйдет Temporal PHP SDK с новой крутой фичей - Workflow Update. К релизу стоит задача не только завершить код в SDK и доку, но и подготовить примеры.

А ещё я купил себе новую клаву, чтобы не добивать родную у ноутбука. Keychron K2 в очень классной комплектации. Это механика с блютузом и подсветкой, достаточно тихая, приятная в работе и тяжёлая (а значит надёжная).

При этом, я думаю, многим из вас нравятся настолки в той или иной мере. Кости в ведьмаке тоже считаются.

В общем, пора кодить. Задача - сделать игру Zonk на Temporal с использованием новой фичи Workflow Update.

👇👇👇
Go live!
Привет, Это FartTimer!

📺 У нас опубликован новое видео.
Это запись спонтанного стрима на твиче. Этакий концентрат информации про Temporal, RoadRunner, интерцепторы и что-то там ещё на 4 часа.
https://youtu.be/AIwZAXXcYEY?si=h-U1qfP0SJSTPWPw
🪼 А чтобы не приходилось скучать в ожидании нового видео, напоминаю, что скоро будет проходить проплывать Podlodka PHP. Погружение на тему "Работа с базой данных".
Подробнее о конференции тут https://podlodka.io/phpcrew

Скоро разыграем одну подарочную проходку, когда придумаем конкурс. Может у вас есть идеи?

Увидимся на подлодке 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
🎟Розыгрыш билета на подлодку

Закидывайте в этот тред мемы про Buggregator, Temporal, RoadRunner, Spiral, Bitrix, Wordpress, релиз Yii3, Валентина и трейты, PHP, пыхо-тренды и всё остальное на тему PHP.

Автор, субъективно набравший меньше 💩 или больше позитивных реакций, получит приглашение на подлодку.

⚠️ *Важно: авторские мемы участвуют в розыгрыше, а честно перепощенные просто приветствуются.*

Автор лучшего перепощенного мема получит лицензию на Buggregator.
Подводим итоги конкурса из поста выше

Лучший мем: https://t.me/php_fart/61?comment=325

Автор мема заслуженно получает промокод на подлодку: 01000110010000010101001001010100 (вводить после нажатия кнопки КУПИТЬ)
Поздравляем победителя! 🎉🎉🎉

🍾🍾 Второе место вычислить нереально, поэтому лицензию на багри получают все 🍾🍾
Забрать можно в этом репозитории https://github.com/buggregator/server или через докер (Документация)
docker run --rm --pull always -p 127.0.0.1:8000:8000 -p 127.0.0.1:1025:1025 -p 127.0.0.1:9912:9912 -p 127.0.0.1:9913:9913 ghcr.io/buggregator/server:latest


Или через композер composer req --dev buggregator/trap
В блоге Виктора (который из Yii 3 Core) вышла позитивная заметка про Buggregator.
Получать обратную связь — хорошо. А получать хорошую обратную связь — ещё лучше.

Вы используете Buggregator? Поделитесь в комментариях обратной связью 💖
Напишите, как используете, чего не хватает, на что сделать упор.
Хотели бы, чтобы мы писали здесь о багри больше (не маркетинговый буллшит, а про фичи, кейсы, размышления и прочее)? — если да — ставьте 🖼️
Please open Telegram to view this post
VIEW IN TELEGRAM
Мы выяснили, что вам, уважаемые фартаны, интересно почитать про #Buggregator. Ну что-ж, начнём со знакомства.

🪲 Buggregator — вспомогательный инструмент для отладки. Он не призван заменить xDebug, а наоборот - усилить. Из названия понятно, что он агрегирует баги, а точнее дампы. Что пошлёте — то и сагрегирует.

Сейчас поддерживаются:
- Логи из Monolog
- События и отчёты Sentry
- Профили XHProf (рисует граф и флейм-граф)
- Дампы из Symfony var-dumper и Spatie Ray
- Mail (есть встроенный SMTP сервер)
- Виджеты Inspector dev

🎁 В линейке Buggregator несколько продуктов.
Основной продукт, который мы подразумеваем под названием Buggregator — серверное решение, готовое интегрироваться в вашу инфраструктуру наравне с другими сервисами. Запускается и работает под докером.

Это Production-Ready решение, которое можно спрятать за авторизацией (доступна интеграция с SSO с настраиваемыми скоупами) и подключить к своей базе данных (сейчас доступны MongoDB и Postgres. Хотите MySQL? Добавим!)

😸 Начните локальное использование под докером, запустив команду:
docker run --rm --pull always -p 127.0.0.1:8000:8000 -p 127.0.0.1:1025:1025 -p 127.0.0.1:9912:9912 -p 127.0.0.1:9913:9913 ghcr.io/buggregator/server:latest


Каждый порт соответствует своему протоколу. Просто настройте ваш сервис на использование этих портов:
- 8000HTTP DumpsSentry, RayInspectorXHProf.
- 1025: SMTP.
- 9912Symfony Var-Dumper.
- 9913Monolog.
Полная документация: docs.buggregator.dev

🔨 Разработка Buggregator ведётся в нескольких репозиториях:
- buggregator/server — бэкенд на Spiral и RoadRunner.
- buggregator/frontend — фронтенд на Vuejs 3 и TailwindCSS с использованием StoryBook.
- buggregator/docs — документация

⭐️ Мы будем очень рады, если вы поддержите нас звёздочкой на гитхабе и поучаствуете в развитии проекта своими идеями, багрепортами, контрибьютингом или просто расскажете о Buggregator своему коту.
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем знакомство с миром #Buggregator

💾 Trap

Рабочее название в первые дни — "Buggregator Client". Задумывался как прокси вар-дампов на Buggregator Cloud, но быстро оброс фичами и новым смыслом.

Теперь Trap — это:
- Миниатюрный сервер Buggregator, не требующий Docker для работы. Написан на файберах PHP 8.1. Раньше выводил дампы, логи, HTTP и прочие события только в консоль. Сейчас поддерживается такой же WEB интерфейс, как у старшего брата.
- Набор патчей для Symfony VarDumper. Наличие установленного Trap в вашем проекте улучшит то, как VarDumper отрисовывает Protobuf объекты.
- Набор хелперов. В Trap есть функция trap(). Это тот же Symfony dump(), но с некоторыми изменениями.

Установка:
composer require --dev buggregator/trap -W


🪲 Trap сервер

Запускается из вендора:
./vendor/bin/trap --ui

Флаг --ui необходим для включения веб-морды на 8000 порту. Сейчас эта функция в бета-режиме.

По умолчанию Trap слушает только один порт 9912, но туда можно слать всё: и дампы, и логи, и http, переходящий в WebSocket. Мы написали инспектор траффика, который сам определяет протокол и направляет данные в нужный обработчик.
Trap можно запустить на тех же портах, что и основной Buggregator:
vendor/bin/trap -p1025 -p9912 -p9913 -p8000

(стоит ли сделать этот список портов по умолчанию?)

Trap годится только для локального использования: тут нет SSO, а из "внешних БД", возможно, будет только SQLite, просто чтобы не хранить события в массивах 🙂
Но есть и эксклюзивные фичи:
- благодаря "локальности", Trap может находить файлы профилировщиков, если таковые были сконфигурированы в php.ini.
- низкоуровневая работа с трафиком позволяет реализовать абсолютно любой протокол. Даже просто вывести сырые бинарные данные, как отдельное событие, чего-то да стоит!

🚀 Хэлперы trap()

Функция trap() немного отличается от dump():
- При вызове сразу настраиваются умолчания для отправки симфоневых дампов на локальный сервер (127.0.0.1:9912), так что не надо лезть в .env.
- trap() имеет текучий интерфейс (fluent interface), а значит можно делать так:
trap(FOO: $foo, BAR: $bar) // Дампаем переменные с указанием имен
->stackTrace() // Добавить красивый Stack Trace
->once() // Сработает один раз. Удобно использовать в циклах.
->if($foo instanceof FooInterface) // Условие отправки; можно функцией
->return(); // $foo вернётся как результат

- trap()::profile()->... в планах добавить удобства для профилирования
- а ещё (субъективно) trap набирать и произносить удобнее, чем dump. Так что хватит дампать, го трапать!

🪄 Подводя итог

Trap как сервер — хорошая альтернатива, когда не хочется запускать докер а PHP установлен локально.
Trap как PHP helper — необходим, если работаете с Protobuf и gRPC. Может быть удобнее dump(). Перспективен.

⭐️ Также будем очень рады звёздочкам на гитхабе и контрибьюторской поддержке.
Please open Telegram to view this post
VIEW IN TELEGRAM