PHP Fart Time
1.86K subscribers
106 photos
5 videos
2 files
198 links
Привет, фартаны!

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

Авторы контента: @roxblnfk и @butschster
Download Telegram
Сегодня бороздил просторы LinkedIn и наткнулся на вопрос:

Can you spot the issue in this snippet?

$users = User::where('status', 'active')->get();

if ($users->count() > 0) {
$users = $users->where('role', 'admin');
}

return view('users.index', compact('users'));


The code runs without errors, and the output even looks fine.
But there’s a hidden conceptual problem here that could cause serious trouble in real-world projects.

Question:
Where exactly is the problem, why is this approach risky, and what would be the correct way to fix it?


Автор радуется, что код работает без ошибок и даже «выглядит нормально», но на там есть ловушка. (Кстати найдете ли вы ее?. Можете в коментах рассказать)

> ❗️ Проблема в том, что после ->get() мы уже получаем Collection и фильтруем данные в памяти (Collection::where()), а не в базе (Builder::where()).
На маленьком датасете всё выглядит красиво, а на проде с тысячами пользователей — вываливается лишняя нагрузка, лишнее потребление памяти и потеря ожидаемого поведения.


И вот что интересно.
С одной стороны, охуенный «тест на внимательность». Готов ли ты за джунами такую хуйню искать?
С другой — не демонстрация ли это проблем в Eloquent и Collection?

Фреймворк гордится тем, что «очень простой и интуитивный», но именно эта простота рождает ситуации, где:

- джун легко спутает QueryBuilder и Collection
- визуально одинаковые методы (where) на самом деле делают принципиально разное

ошибка не выдаст exception, а тихо превратится в баг производительности.

Вопрос к вам: А для вас #Laravel все еще говно?
223😁195🤔4💩4
Media is too big
VIEW IN TELEGRAM
🔥74🤮2
#ТоксикСреда, фартаны.

Всех нас уже изрядно заебдостали отовсюду вылезающие конструкторы MCP-серверов на PHP.
Предлагаю быстро пройтись по каждому MCP SDK, который приходит на ум.

1. symfony/mcp-bundle — бридж на symfony/mcp-sdk (бывший php-llm/mcp-sdk).
Здесь тулзы описываются дедовскими методами: типа JSON-schema через PHP-массивы. Кто-то скажет "низкоуровнево", я скажу "всрато". Не ведитесь на бренд, там всё из говна и палок.
Кстати, если вы всё ещё верите в Symfony и хотите как-то исправить этот AI Platform, то записывайтесь на хакатон, а то они уже совсем отчаялись.

2. logiscape/mcp-sdk-php — использовался на практике в CTX. HTTP Transport нормальный (портирован с Python SDK), но роутер — говно: RegisterHandler руками, угадываешь параметры, никаких мидлварей. Пришлось много переписывать. Архитектура не хорошая и не плохая (никакая). Такое бывает, когда бездумно переписываешь с Python.

3. pronskiy/mcp — от Романа Пронского.
По доке выглядит удобно и минималистично, но не для сложных задач.
Рома хайпнул, разработка заморожена. Сделано поверх logiscape/mcp-sdk-php 👆

4. laravel/mcp — кажется, Laravel подсмотрели решение у Ромы, но что-то пошло не так и у них получилась хуйня неюзабельная.
Схемы создаются через громоздкий билдер, где необходимо руками описывать каждое поле. LLM возвращает массив, и дальше сам разбирайся: никаких DTO, никакой валидации.
Подходит только для Hello World проектов. Можно сразу скипать.

5. php-mcp/server — MCP из Нигерии.
Выглядит прилично: схемы генерируются из аргументов методов с атрибутами, есть invocable классы. Но дьявол в деталях: DTO превращает в "type object", собственный JSON-schema валидатор строже стандарта, handler фильтрует аргументы и теряет данные.
Чтобы это заработало нормально, пришлось экстендить половину internal классов. Интеграция на пороховой бочке 👇

6. spiral/mcp-server — обвязка над php-mcp/server от инженера Spiral Scout 😎, сделанная с умом .
Решены ключевые проблемы базовой и других библиотек из подборки: вместо громоздких функций с десятками аргументов или всратых массивов используются DTO с атрибутами. По ним обнаруживаются тулзы и из них же генерируется JSON-схема через spiral/json-schema-generator. Входящие данные маппятся через Valinor с валидацией.
Подключается одним bootloader'ом, легко настраивается и интегрируется с любым сервисом.


Общая проблема многих библиотек в том, что ими сами же авторы и не пользуются: делают на волне хайпа простейший MVP, а потом рассказывают, что можно решить любые задачи.

Берёшь такую херню для интеграции с Task manager, где надо создавать задачи с подзадачами (~10 полей с вложенными DTO и валидацией), понимаешь что нужно что-то другое. Это не тот кейс из доки типа "тут пара аргументов $a и $b, оба строки, а JSON-схему ебани массивом". И вот уже сам сидишь и переписываешь пол пакета.

В общем, спасибо всем пацанам, которые тащат нормальные пакеты, и тем, кто им помогает ❤️
🔥3513😁6
13😁8
Жетончик н-н-надо? Как в баталфилд 3!

В прошлый раз я организовывал сбор на именованные жетоны на PHPRussia 2024.
Жетонами я остался доволен, поэтому давайте повторим, но уже для ПЫХ.КОНФ'25.

Условия простые:
- Вот копилка: https://www.tbank.ru/cf/1UjzHHet5aH (знаю, описание всратое, спасибо ТБанку)
- Закидывайте туда сумму от 500р с указанием никнейма в комментарии.
- Этот никнейм будет нанесён на обратную сторону жетона. Если укажете с собачкой, то и нанесено будет с собачкой @nickname, если без собачки — то без собачки nickname.
- Если что-то не так (забыли комментарий или накосячили в написании), то всё решим в чате.
- Сбор продлится минимум неделю.
- Жетоны будут уникальными и получить их можно будет только на Пыхконфе (включая пре/афтепати).
- Цена на жетоны немного выше себестоимости. Разница пойдёт на покрытие стоковых неименованных жетонов (необработанных односторонних).

Спасибо всем, кто в прошлый раз скинулся сверх стоимости жетонов — это помогло покрыть часть затрат на общий мерч. В тот раз сбор продлился всего сутки-двое и многие говорили, что увидели, когда уже поздно, в этот раз времени хватит.

На фотке жетоны с PHPRussia: сверху две стороны именованных с ошкуренной поверхностью, снизу два варианта стоковых. Пыхконфовые будут отличаться.
3🔥14💊2
Дизайн жетонов готов.

1. Слева пример именованного жетона.
Напоминаю, что ещё есть пара дней, чтобы вкинуться в именованные жетоны на Пых.конф'25.

2. В середине: стоковый жетон.
Такой жетон можно будет заполучить на конференции в оффлайне случайным образом или при выполнении определённых действий :)
В общем, пока не придумал, как, но количество таких жетонов ограничено.

3. Справа: золотой жетон Beer PHP.
Как вы знаете, в PHP сообществе есть пивные движухи:
- Beer PHP, когда пехапешники выбираются в бар, пьют пиво и угнетают ларавельщиков. Иногда даже с докладами.
Подробнее можно почитать тут.
- #RandomBeer — почти тоже самое, но в онлайне.

🍺 Если вы, братья по пиву, собираетесь на пыхконф, вы можете оформить себе и такой жетончик. Я его не планировал именным, но если очень хочется, то можно.
Пишите в переводе "на пиво" или "на пиво, nickname", если надо подписать. Цвет никнейма будет белым, как пивная пенка.
🔥87🤮22
PHP Fart Time
Дизайн жетонов готов. 1. Слева пример именованного жетона. Напоминаю, что ещё есть пара дней, чтобы вкинуться в именованные жетоны на Пых.конф'25. 2. В середине: стоковый жетон. Такой жетон можно будет заполучить на конференции в оффлайне случайным образом…
Формирую заказ и через пару часов завершу сбор.

Забавно, что среди стандартных вариантов от фартанов поступили заказы и на кастомные штуки: кошечки, птички для детей, Сова и даже Винни Пух с Пятачком :D

Раз уж такая пьянка, решил и сам вкинуться на майнкрафтовый жетон сыну :D
🔥19😁3💊3
#PackageNews и горячие релизы 🔥

1 сентября. Разработчикам Yii пора в школу.
Но не расстраивайтесь, что релиз придётся отложить ещё на год или до ближайших каникул, ведь шаблон yiisoft/app вышел в версии 1.0.0.
Он сильно изменился с тех пор, как я его трогал последний раз, поэтому тоже не терпится посмотреть. Может даже удастся Павла вытащить на первый взгляд оналйн.

Ну а где Yii — там и Active Record! Поэтому встречайте ещё один горячий пирожок: cycle/active-record и тоже в стабильной версии 1.0.0. Сделано на базе Cycle ORM и, соответственно, полностью с ним совместимо.
Как теперь это назвать? Data Record? Active Mapper?
Please open Telegram to view this post
VIEW IN TELEGRAM
😁23🔥4🤔43
PHP Fart Time
Формирую заказ и через пару часов завершу сбор. Забавно, что среди стандартных вариантов от фартанов поступили заказы и на кастомные штуки: кошечки, птички для детей, Сова и даже Винни Пух с Пятачком :D Раз уж такая пьянка, решил и сам вкинуться на майнкрафтовый…
Ох и накидали же в последний момент.
Как всегда за секунду до дедлайна. А потом ещё и после дедлайна.
В общем, жетонов майнкрафта поприбавилось и сбор уже точно окончательно закрыт.



Пришло время поговорить о следующей конфе 😅

Через пару недель после Пых.Конфа, 2 и 3 октября, пройдёт ещё одна конфа — «Стачка».
Тем дофига: Telegram-боты, AI-ревью, применение ML, отладка в разных окружениях, DDD, CQRS, производительность, WordPress, RabbitMQ и PHP 8.5.

Нет, жетоны я туда организовывать не буду, т.к. сам не смогу там побывать, но если вы сможете, то обязательно побывайте!
🔥116
PHP Fart Time
Без лишних слов, анонс: сегодня вечером опробуем Yii3 App 1.0.0. https://www.youtube.com/watch?v=ksjGwhvVcN8
Было время переспать с мыслями по Yii3 App.
Хвалебных слов не будет, ибо #токсикСреда. Но ребята и так знают, что они молодцы 🫡
Мой технический разбор из двух частей в дополнение к стриму:

🖼️ Массивы уже не айс. Всё-таки времена PHP 7.4 позади.

Обратите внимание на то, что параметры (params) очень хорошо ложатся на DTOшки. DTOшки тоже хорошо сериализуются и десериализуются, кладутся куда угодно, версионируются по semver.
Бонусы очевидны: типизация, автокомплит, не надо знать "путь" до нужного конфига во всеобщем $params. В DTO также можно добавлять атрибуты для настройки мерж-планов или даже авторезолвинга альясов.

# Было
/**
* @var array $params
*/
Foo::class => static function() use ($params): Foo {
return new Foo($params['foo/bar']['option']);
}

# Стало
Foo::class => static function(FooConfig $config): Foo {
return new Foo($config->option);
}


🖼️ Про кашу параметров и структуру: мы вынесли тезис, что в куче параметров чёрт ногу сломит. Хрен найдёшь то, что ищешь.
Однако, я знаю как этого избежать. Всё дело в структуре проекта!

Предлагаемая структура "как в Laravel" проклята. Группировка по типу классов, мол "тут контроллеры, тут хендлеры, тут ещё что-то", — тупиковый путь.
Вот если бы сразу сгруппировать по фичам или модулям, то что получится? Можно раскидать и перегруппировать не только контроллеры/сервисы/etc , но и параметры с конфигами DI.
Ребята, поработайте над структурой!

🖼️ Нельзя получить Request из контейнера: надо сначала получить RequestProvider, затем дёрнуть на нём метод get.

Оно понятно, почему так:
- Мало кто знает, но PSR контейнер по спеке должен быть идемпотентным: на один и тот же id возвращать всегда один и тот же результат. Там не предусмотрены non-singleton биндинги.
- А раз в контейнере всё синглтон, то реквест туда не положишь из-за его динамической натуры: в long running реквест будет каждый раз другой, также он может измениться в PSR мидлварях.

Но не понятно, почему платить за это должны разработчики. Как по мне, плата высокая.
Решить, кстати, эту проблему можно кучей разных доступных способов. Решайте! :)

🖼️ Чтобы уметь работать в неумираемом режиме, Yii опирается на два столпа: дедовские ресеттеры и иммутабельность. Ресеттеры полагаются на события PSR EventDispatcher.
Я доку не читал (а кто её вообще читает?), но надеюсь, что диспетчер событий не навязывается для использования в юзер-ленде.
И если ресеттеры — удел фреймворков, которые не смогли в архитектуру, и для исключительных случаев, то иммутабельность — очень хорошо. Я бы рекомендовал использовать больше иммутабельности и одноразовых объектов, чтобы стейты юзеров не текли, и им не приходилось писать ресеттеры, которые они всё равно писать не будут.
То, что мы видели на стриме мне не понравилось: стейт контроллера протекает. Да, я бы сам не писал такой код, но мы же говорим про фреймворк общего назначения уровня "домохозяйка+". Ну и напомню: если висит ружьё, то оно обязательно выстрелит.
Please open Telegram to view this post
VIEW IN TELEGRAM
16💊5🔥3🤔21
🖼️ Доку мы не читаем, но блин. Доки не хватает! Где дока, @samdark? Почему она там, а не здесь?

Саша понял, про что я: в закрытом чате мы уже обсудили, что было бы неплохо иметь больше описания и ссылок в коде. Паша, конечно, молодец, что быстро разобрался с параметрами роута, однако мы уже живём в мире, где надо делать супер быстро, где LLM смотрит на примеры кода, которые под носом (это не только вайбкоддинга касается, но и автокомплита тоже), где смузи-разработчики не будут углубляться (для этих надо ещё и эмоджи 📖 добавлять).

Вывод мой такой:

Сейчас Yii — конструктор с маленькими деталями. Чтобы сделать что-то большое, придётся много сражаться в рукопашную. И я уже "стар для этого дерьма".
Также я не люблю фреймворки, которые мешают или ограничивают. Yii3 не ограничивает, однако если мне для того, чтобы получить $request, надо сначала получить RequestProvider, а чтобы отправить строчку, нужно создать Response и стрим для него, то произойдёт что-то одно:
- либо я пойду велосипедить и делать базовый контроллер, который будет сахарным, но в дальнейшем код моих контроллеров будет без лапши.
- либо с возгласом "доколе можно!" возьму другой фреймворк.

У Yii 3 есть чаты для сообщества (открытые и закрытые по подписке), но почему бы не обсудить что-то прямо здесь?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13😁1
Сегодня наткнулся на очередной пост в LinkedIn о том, что в Laravel добавили кнопку "Скопировать Markdown" специально для AI, и кто-то пошел дальше и запилил пакет с кнопками Ask ChatGPT / Ask Claude прямо на странице ошибки.

И я призадумался 🤔 ибо #токсикСреда.

Если разработчику нужно обязательно спросить у AI, чтобы понять, что за ошибка в его же коде — это выглядит пугающе.

Мы же таким образом выращиваем не программистов, а AI-операторов, которые без LLM даже стек-трейс не смогут прочитать и понять, что же они там наговнокодили/вайбкодили.

Ну а ты собираешься спрашивать у AI про ошибки в твоем же говнокоде? Не боишься получить дозу кибер-унижения? Поделитесь кейсами которые было сложно дебажить и где бы помог AI 👇
😁32126
Подгребайте потихоньку на #RandomBeer

(гуглмит блочится роскомпозором, пробуем пачку)
https://meet.pachca.com/

В течение часа ожидаются тухлые смоллтолки, пока все расчехляют пивко. В 19 МСК ожидается начало прожарки.
Встал сутра, а эти двое на меня так смотрят, будто я им денег должен...

Доброго утра, фартаны!
🔥391110
Forwarded from PHP умирает?! (Валентин Удальцов)
Спасибо @tranxton.
🔥41😁4141
Начался Hacktoberfest 2025

Если выполнить задачи в числе первых 10_000 участников, то можно выиграть футболку. Но в РФ её всё-равно не доставят.

Однако, пофиг на футболку. Давайте просто делать #OpenSource вместе, хотя бы в этот месяц.

Пара советов:

Советую любой вклад в репозиторий начинать с обсуждения:
- Написать в Issue, что собираетесь взять задачу на себя и уточнить, есть ли вещи, на которые стоит обратить внимание.
- Найти ответственного и пнуть в чате.
- Обсудить объём работ, чтобы не делать всё или не попасть в ситуацию, когда часть работы уже сделана где-то ещё.

По Pull Request советую:
- Не делать то, что выходит за рамки Issue, не изменять левые файлы.
- Не делать Force Push, особенно после ревью.
- Не делать большие PR. Это в продуктовых проектах большие изменения проходят с меньшими замечаниями. В опенсорсе большой PR == больше работы для ревьювера.

Вот пара направлений сходу:

1. @terabytesoftw из Yiisoft докладывает: сейчас Yii2 покрыт тестами на 75%. Давайте добьём до 100%.
PR is welcome

2. Подгон от @butschster: ишуи с тегом Good First Issue в репозитории CTX и for-contributors в Buggregator.
3. Ну а я буду просто очень счастлив, если кто-то доделает этот PR (можно прыгнуть на ветку автора, запушить её в свой форк, доделать и затем сделать новый PR)

В PHP сообществе есть ещё пара интересных мест:

- Общий канал по пыховому опенсорсу, в который можно прийти и как мейнтейнер (хранитель кодовой базы), и как контрибьютор (участник, вкладчик).
- Тема опенсорса в нашем чатике, где можно полулзить или обсудить что-то посложнее, чем Good first issue.

———

Кстати, открытое ПО тесно связано со свободными лицензиями.
И тут возникли мысли, а не пора ли нам с Павлом везде внедрять эту лицензию?

PS: Спасибо Владу Шашкову, который следовал этой лицензии и угощал меня пивом на ПыхКонф'2025 🍻
17🔥6
#токсикСреда в пятницу! Почему бы и нет?

Зацените пост от JetBrains: Moving PHP open source forward
JB говорит, что в следующем году будет финансово поддерживать пятерых опенсорсеров. Одобряю такое движение в любом случае.

Уже определены 4 опенсорсера:
- Saif Eddin Gmati, разрабатывающий Mago. Ранее помогал с парсером PHP ныне почившего PXP.
- Markus Staab, который контрибутит в PHPStan и AMPHP
- Kyrian Obikwelu — наш любимый нигериец, который смог.
- Sjon Hortensius, создатель 3v4l.org. Этому товарищу я тоже донатил когда-то.

Ситуация с Кирианом выглядит забавно. Чувак навайбкодил свой MCP, который, в прочем, на фоне остальных выглядит очень даже неплохо. А затем его наработки смержили с Symfony AI и получилось говно официальный MCP сервер.
Почему забавно?
Да чувак просто стал героем у себя в стране! Загремел в PHP Official MCP dev team, да ещё и бабки за это поучает сравнительно неплохие (поресёрчил, средняя ЗП айтишников в Нигерии 100-300$/мес).
Причём на деле разработка официального MCP встала, а JB пишут, что платят за "активное изучение возможности искусственного интеллекта и машинного обучения на PHP" 😆.

Но пост не об этом.

Вы, верно, заметили что пятый разработчик не определён. И JB в посте сказали "накидывайте варианты, кого поддержать".

И вот тут меня подбомбило 😠
Simon Hamp, который уже более двух лет лезет во все щели со своим NativePHP, затвитил "а давайте срубим куш и, может быть, NativePHP когда ни будь станет бесплатным". После этого сотни хомяков побежали срать фразой nativephp в твиттере, в блоге JB и везде.
NativePHP — технологический мусор, а с позиции маркетинга уже наравне спаму. У них есть свой закрытый платный продукт, и это точно не тот опенсорс, которым мы пользуемся и который остро нуждается в поддержке.

Я предлагаю законтрить хомяков и заявить везде про BosonPHP. Люди должны знать, что есть более технологически правильные альтернативы.

Да, JB всё-равно не выберет Кирилла, поэтому надо поддержать что-то ещё:
CSFixer, Psalm, RoadRunner, Infection, Xdebug, Buggregator. То, что действительно полезно и не приносит прибыли разработчикам.

Давайте не поленимся, зайдём в блог JB (кто может и в твиттер) и накидаем им за Boson, Psalm и RR в комментарии
Ток без хейта плз )
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥346
#токсикСреда продолжается.

Вокруг какой-то скам. Попробовал я законтрибьютить в этот ваш официальный MCP SDK. Это был худший опыт.

1. Нет понимания, кто за что отвечает.
2. Лейблы в ишуях как будто стоят денег, их стараются игнорировать и экономить, чтобы лейблы не кончились.
3. Milestone? не, не слышали. Вот как выглядит у меня, например.
4. Проекты в Github? Тоже не слышали. Хотя всегда же круто иметь проект для управления разработкой, как здесь.
5. Я сделал PR и пожалел. Думал буду контрибьютить, но они таак долго все делали, иногда тупо игнор на несколько дней и понять, что происходит прям проблема. У меня также бывает конечно, но я один и не всегда есть время, а их больше 3-х! Желание пропало продолжать, т.к. пока получишь фидбек, уже забудешь что хотел и потом опять искать время.
6. Некоторые PR висят уже месяц!!!! А с такой помпой анонсировали нам этот MCP, мол приходите, контрибьютте, что такая команда собралась. По факту они заняты чем угодно, только не этим пакетом.
7. Они в SDK добавили фичей который к SDK не имеют отношение, типа Discovery. Это хуйня которая сканирует проект на атрибуты и их регистрирует. Это может и полезная фича, но SDK не должен мне диктовать как мне искать тулзы и т.д. Я хочу свой функционал для этого, зачем мне их зависимости? Моя ишуя, где я говорю, что хуйню делают. Но у них свой путь.

С учетом их подхода к управлению проектом и разработкой (ни лейблов, ни проекта, ни milestone) выглядит так, что собралась команда мечты, которая до этого не занималась командной разработкой.

Christopher Hertel, чувак из Symfony, вообще жжот. Я начал код писать, а мне IDE strict_types по умолчанию во все файлы добавляет.

// Здесь должен быть испанец со своим смехом

А оно у них удаляется потому что в cs fixer стоит

'declare_strict_types' => false,


Я создаю issue, мол давайте втащим.

// Здесь должен быть испанец со своим смехом

А там говорят, что в Symfony нет и это блядь прчина почему и здесь нет и продвигают в cs fixer эту хуйню.

Strict types just make the language worse, because it encourages the risky practice of casting, without providing any real or significant benefits.
© Nicolas Grekas


По итогу мы имеем команду мечты:
1. Чувак из симфони, который до сих пор не использует strict_types=1 и говорит "нахуй не нужон". А его коллега в тоже время обсуждает добавление в CS Fixer правила удаления strict_types. К'мон гайз, PHP 8.5 на пороге!
2. Нигериец, который вайб-кодер по жизни, чей код я изучил и не считаю его продукт хорошим и могу разложить по полочкам. Знаю только что он знает паттерн ларавел и в этом стиле пишет код. На свой пакет он успешно забил...
3. И еще хз кто там в команде, но они заняты чем угодно, но не этим пакетом.

Продукт получил кучу звезд, но как по мне, он не работает и будет как что-то, что проектировали те, кто в этом не особо то и разбираются. Но на волне хайпа собрали аж тыщу звезд, ну а толку? Это не SDK...

Каждый раз когда я с ними общался, те ответы, которые я получал кроме как "испанский смех" в голове не вызывали.

Смеющийся испанец - это прямая ассоциация всего происходящего вокруг этого репозитория и командой которая им занимается. Они просто к этому не готовы и делают как умеют, а не как надобно.

P.S. Ну и кто, блядь, додумался в SDK засунуть генерацию JSON схемы на аргументы функции???

use Mcp\Capability\Attribute\McpTool;

class CalculatorElements
{
#[McpTool(name: 'add_numbers')]
public function add(int $a, int $b): int
{
return $a + $b;
}
}
3😁327🔥3🤯3💊2