PHP Fart Time
1.79K subscribers
90 photos
4 videos
2 files
184 links
Привет, фартаны!

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

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

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

https://www.youtube.com/live/3WdSCnzsFKE?si=aB3TeAGj_19ixsxK
🔥13💩2
#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, то я рекомендую вообще закрывать конструкторы сущностей (делать пустой приватный конструктор) и вместо этого писать фабрики.
🔥9🤔6
#ВредныеСоветы #Типизация #php

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

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

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

Что там ещё нам мешает писать код по своим правилам?
🤯11😁6💩2
Привет, фартаны!

Наконец-то в телегу подвезли подсветку синтаксиса для блоков кода. Естественно, я пройду и обновлю все предыдущие посты.

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

Кстати, а как вы относитесь к сторисам в телеге?
🔥2🤬2💊2🤔1🤯1
Тоже накину про инициативу Валентина Удальцова по поводу new MyClass()->method() без скобок.

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

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

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

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

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

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

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

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

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

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

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

https://t.me/tg_5minphp/1299
🔥22😁1
Пинг.

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

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

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

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

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

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

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

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

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

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

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

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

Лучший мем: 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
21🔥10
В блоге Виктора (который из Yii 3 Core) вышла позитивная заметка про Buggregator.
Получать обратную связь — хорошо. А получать хорошую обратную связь — ещё лучше.

Вы используете Buggregator? Поделитесь в комментариях обратной связью 💖
Напишите, как используете, чего не хватает, на что сделать упор.
Хотели бы, чтобы мы писали здесь о багри больше (не маркетинговый буллшит, а про фичи, кейсы, размышления и прочее)? — если да — ставьте 🖼️
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥5
Мы выяснили, что вам, уважаемые фартаны, интересно почитать про #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
🔥1612💊2
Продолжаем знакомство с миром #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
10🔥5