New We are sorting MAX channels into categories and territories. Read the news
Public channel ID 77494652142977

12 лет програмирования

12 лет программирования — PHP, Laravel, Backend

Канал PHP-разработчика о программировании и backend-разработке. Laravel, PHP, MySQL, Docker, Linux, Git, архитектура, производительность, GitHub, реальные проекты, задачи и ошибки, собеседования и фриланс.

Channels in category
2 093
This channel's rank
№ 1 257
Open category →
Open in MAX

Posts for the period

By reactions

Search and the whole feed — after free registration. Custom dates — with a subscription; the channel owner sees them for free. Sorting by reactions — with a subscription. Sign up

Loading…

Небольшое, но полезное обновление моего HTTP-клиента для PHP.

В версии 0.2.1 добавил обработку ошибок json_encode(): если данные не удаётся преобразовать в JSON, теперь выбрасывается JsonException, а не возвращается false.

Релиз: https://github.com/alf07/http-client-composer/releases/tag/0.2.1
Views: 6
Go to post Open in MAX Report an inaccuracy
Процедурный PHP не умер

Мне пришлось немного поработать с WordPress, и я уже успел забыть все его «прелести». А главное — давно не сталкивался с процедурным подходом в рамках целого проекта.
Одно дело — небольшой мусорный скрипт, который запускается пару раз, решает конкретную задачу и отправляется в мусорку.
И совсем другое — когда так устроен целый проект.
После чистого PHP и фреймворков вроде Symfony или Laravel внутри начинается настоящая война.
Где объекты?
Где зафиксированные контракты?
Где нормальные объекты данных?
Где разделение ответственности?
Всё это где-то там, в далёком будущем. Возможно. А возможно, и нет. 🙂
И как человеку, которому интересна архитектура ПО, мне это доставляет немало неудобств.
А потом я вспомнил Go.
Язык, про который часто говорят, что там «нет нормального ООП» и невозможно построить красивую архитектуру.
Но даже там у меня получается гораздо более выразительный код и понятная структура проекта, чем в WordPress.
И тут возникает интересный вопрос: а почему WordPress вообще до сих пор такой?
Похоже, в какой-то момент ради обратной совместимости с огромным количеством плагинов и тем в жертву было принесено практически всё остальное.
Система расширения, которая когда-то была преимуществом, со временем сама стала архитектурным ограничением.
При этом полностью переписать проект и начать новую жизнь — вполне возможно. Например, OpenCart когда-то прошёл путь от 1.5.x к 2.x, фактически получив новую архитектуру.
А WordPress выбрал другой путь: сохранять совместимость и развиваться поверх существующего фундамента.
И, возможно, именно поэтому процедурный PHP в 2026 году всё ещё живёт. 🙂
Views: 15
Go to post Open in MAX Report an inaccuracy
Сегодня в свободное время решил немного поработать над своим HTTP-клиентом и добавить возможность задавать конфигурацию.

Сначала я пошёл, казалось бы, очевидным путём — хотел вынести настройки в `config.json`.

Но когда начал это реализовывать, столкнулся с противоречиями.

Откуда библиотека должна брать этот файл? Зависеть от директории проекта? А где вообще эта директория в конкретном приложении? Насколько удобно пользователю каждый раз думать, где должен лежать `config.json`? А как всё это нормально поддерживать внутри Composer-пакета?

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

Ценность пакета как раз в том, чтобы получить готовый функционал с минимальным количеством дополнительных действий. А если после установки нужно ещё разбираться с каким-то конфигурационным файлом, который библиотека должна самостоятельно искать, то получается лишняя сложность.

Поэтому от `config.json` отказался.

Следующая идея — обычные getter и setter.

Реализовал их и уже собирался на этом остановиться, как вдруг IDE подсказала одну интересную вещь: раз пакет требует PHP 8.5, зачем вообще писать весь этот boilerplate?

Я вспомнил про `get` / `set` property hooks, которые появились в PHP 8.4.

Честно говоря, я просто забыл про эту возможность. Когда читал описание PHP 8.4, видел про property hooks, но на практике ни разу их не использовал.

В итоге вместо набора `getTimeout()`, `setTimeout()`, `getConnectTimeout()` и так далее получилась гораздо более компактная конструкция:


$config->timeout = 60;
$config->connectTimeout = 10;


При этом в `set` hook можно оставить необходимую валидацию.

Получилось красиво, минимально и, на мой взгляд, гораздо удобнее в поддержке.

Но на этом мозговой штурм не закончился.

Появилась вторая задача: я хотел, чтобы `User-Agent` всегда содержал идентификатор моего клиента. Его можно получить, но я не хочу, чтобы пользователь библиотеки мог его изменить.

И тут на помощь пришло ещё одно «чудо» из PHP 8.4 — асимметричная видимость.

В итоге можно сделать свойство публичным для чтения, но закрыть запись:


public private(set) string $userAgent = 'alf89/http-client/0.2.1';


И вот в результате обычная задача «добавить конфигурацию» привела меня сразу к двум современным возможностям PHP, которыми я раньше практически не пользовался.

В очередной раз убедился, что иногда полезно не сразу писать код, а немного остановиться и подумать: а точно ли старый привычный подход здесь лучший?

Так что `property hooks` и асимметричную видимость я точно беру себе на вооружение. Думаю, и дальше буду искать им применение там, где они действительно упрощают код.
Views: 29
Go to post Open in MAX Report an inaccuracy
Иногда тестовое задание не заканчивается после того, как его отправил.

В итоге продолжение этого тестового превратилось в статью на Хабре.

Разбираю, зачем вообще добавлять промежуточный сервис, почему не стал сразу тащить RabbitMQ, как подошёл к идемпотентности, очереди, retry и хранению истории.

https://habr.com/ru/sandbox/305258/
Views: 34
Go to post Open in MAX Report an inaccuracy
Продолжаю работу над своим HTTP-клиентом для PHP.

В новой версии 0.2.0 добавил конфигурацию HTTP-клиента: настройки `timeout`, `connectTimeout`, `User-Agent` и проверки SSL-сертификата теперь вынесены в отдельный `Config`.

Сам `CurlTransport` теперь получает конфигурацию отдельно от своей логики.

Это пока промежуточный вариант. Следующим шагом хочу вынести настройки из класса `Config` в JSON-файл, чтобы их можно было менять без редактирования исходников библиотеки.

Версия 0.2.0
https://github.com/alf07/http-client-composer/releases/tag/0.2.0
Views: 29
Go to post Open in MAX Report an inaccuracy
На этот раз уже не столько про код, сколько про архитектуру.

Нужно было спроектировать интеграцию 1С → Go → Yandex 360 для отправки email и сбора событий почты.

Самое интересное для меня здесь — не сама отправка письма, а то, что происходит вокруг неё: очередь, повторные попытки, падение сервиса, защита от дублей и корреляция событий между 1С, нашим сервисом и Yandex.

Например, если SMTP-запрос завершился таймаутом, нельзя просто отправить письмо ещё раз — сначала нужно понять, не было ли оно уже принято. Для этого предусмотрена дополнительная проверка Yandex.

В результате получилась архитектура, в которой состояние хранится в БД, обработка идёт асинхронно, события собираются отдельно, а падение Go-сервиса не приводит к потере очереди.

Кода не требовалось — основной упор был именно на проектирование решения.

Пожалуй, такие задания мне сейчас даже интереснее обычных CRUD.
Views: 29
Go to post Open in MAX Report an inaccuracy
Закончил тестовое задание на Laravel + Vue 3 и тоже добавил его на GitHub.

В проекте — авторизация, работа с организациями, парсинг данных Яндекс Карт, отзывы и рейтинг. Для тяжёлого парсинга использовал очереди, чтобы не блокировать основной запрос.

Для меня это был хороший практический проект: пришлось поработать не только с Laravel, но и с Vue, Sanctum, очередями, HTTP-запросами и разбором данных без официального API.

Возможно, позже ещё вернусь к нему и что-нибудь улучшу.

🔗 https://github.com/alf07/test-intera
Views: 47
Go to post Open in MAX Report an inaccuracy
The full feed — after free sign-up
VKontakte Telegram Odnoklassniki
Favorites at datool.ru

Follow the channel in your account

Sign up at datool.ru to add the channel “12 лет програмирования” to favorites and track its metrics.

Sign up
For channel owners

Verify your channel

Sign in or sign up at datool.ru, then add our bot to the channel following the instructions in your account. Once ownership is verified, the lock disappears and channel management becomes available.

Sign in or sign up

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go