Пых
8.27K subscribers
261 photos
14 videos
6 files
568 links
Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://t.me/isPHPdying

Статистика: https://t.me/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
Наводим порядок в composer.json

Если вы, как и я, испытываете наслаждение от автоматизированного порядка, могу порекомендовать пакет ergebnis/composer-normalize. Он упорядочивает ключи composer.json в соответсвии со схемой, после чего структура файла становится логичной и узнаваемой. Под капотом, кстати, используется ergebnis/json-normalizer — он решает задачу нормализации JSON в общем случае и может быть полезен сам по себе.

Интеграция в проект предельно проста:

composer req --dev ergebnis/composer-normalize
composer normalize
git commit -am 'Навёл порядок в composer.json!'

Ну и закрепляем наши усилия, добавив в CI-пайплайн composer normalize --dry-run.

https://github.com/ergebnis/composer-normalize
👍46🔥125
Нужно ли отбивать пробелами оператор конкатенации?

Несколько лет подряд у меня был ответ "нет", потому что в PHP-CS-Fixer concat_space по умолчанию выставлен в none и я привык так писать ещё со времён контрибьютинга в Symfony.

Но на новой работе коллеги ставят пробелы. Почитал новый PER Coding Style: "All binary arithmetic, comparison, assignment, bitwise, logical, string, and type operators MUST be preceded and followed by at least one space". Документация подтверждает, что конкатенация относится к строковым операторам. Получается, что если следовать рекомендации, то пробелы надо ставить...
👍54🔥3😱1
Пыхарь, ты отбиваешь пробелами оператор конкатенации?
Anonymous Poll
92%
'Д' . 'а'
8%
'Не'.'т'
2
<?php

fclose(STDIN);
var_dump(is_resource(STDIN));
🤡51👍12💩10💅7🦄5👾5🎃4🗿4🔥2🌭2💊2
Маппинг входящих данных на аргументы action-ов

Наконец-то в Symfony это сделали! Теперь всякие RequestMappingBundle будут не нужны.

Предлагаю отлинчевать на следующей неделе. 😉

use Symfony\Component\HttpKernel\Attribute\MapQueryString;
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;

final class Action
{
public function __invoke(
#[MapQueryString] MyQueryDataClass $query,
#[MapRequestPayload] MyPayloadDataClass $payload,
): Response {
// ...
}
}


https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61👍163
👨‍🔬 Новая лекция от Пыха. LRU мемоизация. Часть 2. Из O(n) в O(1)

Наконец-то записал вторую лекцию про LRU мемоизацию! Из неё вы узнаете, какая структура данных позволит нам получить решение с алгоритмической сложностью O(1) и как её построить самому. По дороге, как обычно, касаюсь ещё нескольких интересных мелочей.

https://boosty.to/phpyh/posts/64ce92fa-836d-4b5b-9035-c28074c13e3c
👍15🔥8💩3
🎮 DatsArt Space

Мои хорошие друзья DatsTeam организовали очередной хакатон, в котором командам предстоит написать «геймпад» к некой «игровой консоли» и сыграть при помощи него в игру. Условия хакатона не ограничивают участников в выборе технологий, поэтому среди участников есть и пыхари! Пожелаем им удачи!

Прямая трансляция стартует с минуты на минуту: https://youtu.be/OSDZVHsUSmE
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍53🍾1
Forwarded from samdark blog ☕️ (Alexander Makarov) (Alexander Makarov)
🔗 Awesome load balancing visualization

An interactive post by Sam Rose about load balancing basics. I ❤️ how it is visualized.

https://samwho.dev/load-balancing/
🔥31👍10👏2😁1
Пых
🔴 PHP-линч #15 Продолжаем обсуждать Symfony #[MapRequestPayload], заходи! https://youtu.be/lHXrYr134tw
🔥 Уххх, сегодня забористо получилось! Советую посмотреть.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥1144🦄2👎1🤔1🏆1
🔴 PHP-линч #18

Сегодня на линче новый компонент Yii 3: Hydrator! Мне его на днях скинул Сергей Предводителев, член экипажа Yii. Кстати, подписывайтесь на его канал @sergei_predvoditelev.

По просьбам трудящихся пробуем стартовать позже, в 19. 😉

https://youtu.be/4_TVEgU3rpM
🔥21👍61
Как в рантайме получить путь до текущего автолоадера?

Сейчас работаю над PHP Extended Type System, и появилась задача использовать автолоадер Composer для получения файлов незагруженных классов по их имени. При этом хочется, чтобы по умолчанию пользователю библиотеки не надо было явно указывать путь до autoload.php. Библиотека должна по возможности угадать его сама.

Первое, что приходит в голову, — просчитать и захардкодить путь. Например, если у нас пакет называется extended-type-system/type-reflection, а класс локатора расположен в src/ClassLocator/ComposerAutoloadClassLocator.php, то после установки библиотеки путь от класса до автолоадера будет __DIR__ . '/../../../../autoload.php'.

Теперь попробуем покрыть это тестом. Первый вариант — засимлинкать текущий автолоадер в нужную локацию и инстанциировать локатор. Получим максимально дурацкий и хрупкий тест, да ещё и выйдем за пределы рабочей директории. Второй вариант — честно установить либу в отдельной папке с использованием репозитория type: path, symlink: false и инстанциировать локатор там. Вот только запускать это всё придётся в отдельном процессе, иначе копия класса будет конфликтовать с исходником в пространстве имён. Короче, сложно и тоже хрупко.

Поэтому я ещё почесал репу и придумал, как вообще отвязаться от расположения класса локатора:

use Composer\Autoload\ClassLoader;

$classLoaderFile = (new \ReflectionClass(ClassLoader::class))->getFileName();
$autoloadFile = dirname($classLoaderFile, 2) . '/autoload.php';
$autoloader = require $autoloadFile;


То есть мы через рефлексию получаем путь к генерируемому композером классу ClassLoader (это, кстати, публичный контракт, на него можно смело положиться), а уровнем выше забираем наш autoload.php.

При втором подходе локатор устойчив к перемещению и легко тестируется с текущим автолоадером.
👍39🔥153