Открытый канал ID 77494652142977

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

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

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

Каналов в рубрике
1 736
Место этого канала
№ 1 089
Открыть рубрику →

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

Сегодня в свободное время решил немного поработать над своим 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` и асимметричную видимость я точно беру себе на вооружение. Думаю, и дальше буду искать им применение там, где они действительно упрощают код.
Просмотры: 23
Перейти в пост Открыть в MAX Сообщить о неточности
Иногда тестовое задание не заканчивается после того, как его отправил.

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

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

https://habr.com/ru/sandbox/305258/
Просмотры: 29
Перейти в пост Открыть в MAX Сообщить о неточности
Продолжаю работу над своим 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
Просмотры: 25
Перейти в пост Открыть в MAX Сообщить о неточности
На этот раз уже не столько про код, сколько про архитектуру.

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

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

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

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

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

Пожалуй, такие задания мне сейчас даже интереснее обычных CRUD.
Просмотры: 26
Перейти в пост Открыть в MAX Сообщить о неточности
Закончил тестовое задание на Laravel + Vue 3 и тоже добавил его на GitHub.

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

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

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

🔗 https://github.com/alf07/test-intera
Просмотры: 45
Перейти в пост Открыть в MAX Сообщить о неточности
Чтобы не растерять навыки в период безработицы, решил завести небольшой проект, который буду постепенно развивать.

Заодно сделать что-то полезное для себя.

Начал с HTTP-клиента для PHP — без привязки к фреймворкам, устанавливается как обычный Composer-пакет.

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

Да и самому такой инструмент может пригодиться. 🙂

🔗 https://github.com/alf07/http-client-composer
Просмотры: 63
Перейти в пост Открыть в MAX Сообщить о неточности
В репозиторий (https://github.com/alf07/devops-templates) добавил небольшой скрипт для мониторинга использования `sudo`.

`sudo` — мощная и потенциально опасная команда, поэтому полезно знать, кто, когда и где её использовал.

Небольшой инструмент, который может пригодиться для контроля серверов и поиска подозрительных действий.
Просмотры: 68
Перейти в пост Открыть в MAX Сообщить о неточности
Вся лента — после бесплатной регистрации
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «12 лет програмирования» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти