Обновить
45.89

PHP *

Скриптовый язык общего назначения

Сначала показывать
Порог рейтинга
Уровень сложности

Symfony Init — быстрый старт проекта без лишней рутины

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели4K

Каждый раз, когда хотелось быстро попробовать что‑то на Symfony, начиналась одна и та же история: поднять контейнер с PHP‑FPM или FrankenPHP, провалиться в контейнер, поставить symfony/skeleton, настроить Nginx или Caddyfile, прописать переменные окружения... И всё это до того, как написана хоть одна строчка кода.

DI‑контейнер, консольные команды, компонентная архитектура... Ни для кого не секрет, Symfony заметно ориентируется на Java‑экосистему. Почему бы не попробовать сделать что‑то подобии start.spring.io подумал я.

Так появился пет-проект symfony-init.dev

Читать далее

Новости

Scedel: DSL для описания схем данных

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели6.1K

Scedel - это language- и protocol-agnostic язык для описания схем данных и контрактов. В статье я опишу сам язык, а также расскажу, зачем я его создал

Читать далее

RAG на PHP + Qdrant: быстрый MVP для внутренней базы знаний

Время на прочтение22 мин
Охват и читатели11K

RAG на PHP - звучит непривычно. Делюсь опытом построения чат-бота для поиска по внутренней базе документов: Symfony, Qdrant с гибридным поиском, YandexGPT для embedding и генерации ответов. Внутри — готовый код, подводные камни чанкинга и советы, которые сэкономят вам время.

Читать далее

ADR, архитектурные тесты и кейсы из прода: ресурсы, которые реально меняют код

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.8K

У меня была привычка. Вижу классную статью про архитектуру —-сохраняю. Репозиторий с примерами DDD - в закладки. Видео про CQRS - в плейлист «Посмотреть потом».

Вы знаете, чем кончаются плейлисты «Посмотреть потом».

В какой-то момент закладок стало 300+. Половина ссылок битые, треть дублируют друг друга, остальное - статьи, которые казались гениальными в два часа ночи. Я сел и вычистил всё до 106 ресурсов. Собрал их в awesome-list на GitHub.

Но статья не про список. Статья про три вещи, которые я для себя открыл в процессе и которые почему-то мало обсуждают.

Читать далее

Как устроен роутинг в Waypoint: три уровня матчинга, zero-Reflection dispatch и кеш через OPcache shared memory

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели4.6K

В комментариях к моей предыдущей статье про Waypoint прозвучало: «это стандартный алгоритм, ничего уникального». Trie — стандартный. Хеш-таблица — стандартная. Всё так. Но покажите мне PHP-роутер, который каскадирует O(1) хеш-таблицу, посегментный prefix-trie и prefix-grouped fallback в три уровня матчинга, генерирует именованный PHP-класс с immutable const для OPcache shared memory, а при диспатче не делает ни одного вызова Reflection. В этой статье — не маркетинг, а код и алгоритмы: разбираю каждое архитектурное решение и сравниваю с FastRoute и Symfony Routing.

Читать далее

События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper

Время на прочтение16 мин
Охват и читатели4.7K

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых хранится весь "нестандарт".

В этой статье описаны все триггеры (события), которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

Кастомизировать поля ядра Joomla

DDD и CQRS на PHP без Symfony: собираем легковесный стек с помощью ИИ

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели8.5K

Собрал три легковесных PHP-пакета — DI-контейнер с autowiring, DataMapper поверх PDO и PSR-15 роутер — и с помощью ИИ построил на них DDD-приложение с CQRS. Чистый домен без внешних зависимостей, 92 теста и vendor в 10 раз легче Symfony.

Читать далее

Как я написал production-ready PHP-роутер за один вечер с помощью ИИ

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели7.4K

Production-ready PHP-роутер за один вечер: 2 100 строк кода, PHPStan level 9, полное покрытие тестами — и всё при помощи ИИ

Я решил проверить, можно ли за один вечер с помощью ИИ-ассистента создать не прототип и не «потом допилим», а полноценную библиотеку, готовую к публикации на Packagist. Результат — PSR-15 роутер с prefix-trie матчингом, атрибутной маршрутизацией, middleware-пайплайном и кешированием. 8 коммитов, 5 часов 40 минут, ~4 800 строк PHP-кода. Под катом — честный разбор: хронология по git log, где ИИ ускоряет в разы, а где без головы разработчика никуда.

Читать далее

Федеративная архитектура дилерских сайтов: Bitrix, Manticore Search и OpenAI Batch API для каталога на 50k SKU

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.6K

Когда производитель с дилерской сетью из 85+ партнёров решает стандартизировать их сайты — первый инстинкт понятен: сделать JSON-фид с основного домена, настроить синхронизацию, и пусть у всех будет одинаковый актуальный каталог.

Проблема в том, что «одинаковый» и «хорошо индексируемый» — противоречащие друг другу требования, если реализовано наивно. Яндекс видит 85 сайтов с идентичным контентом и поступает предсказуемо.

Под катом — как мы решали эту задачу для крупнейшего производителя сельхозтехники в России (150+ моделей комбайнов и тракторов, 50 000 SKU запчастей): архитектура Lock/Edit на уровне инфоблоков Битрикс, Manticore Search для артикулов со спецсимволами, OpenAI Batch API для обогащения каталога и Python-автоматизация развёртывания 85 поддоменов.

Читать далее

Один для многих — универсальный грид для портала на Битриксе

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели5.7K

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

Наша команда специализируется на развитии корп. портала Группы НЛМК на платформе Битрикс, и еще нескольких корпоративных сайтов.

Значимая часть портала — это широкий набор сервисов для решения задач бизнеса. Например, регистрация и обработка заявок на перевод документов, работа с приёмом делегаций, волонтёрской активностью, проведение оценки рабочих, работа с пользователями (поздравления, благодарности, знаки отличия сотрудников) и многое другое. Несмотря на всё разнообразие сервисов, для их разработки зачастую используются одни и те же функциональные блоки — универсальные "кирпичики" для решения типовых задач.

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

Читать далее

Интеграция 40+ дилеров через REST API: как мы построили портал запчастей крупнейшего сельхозпроизводителя в России

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели7.3K

Про эталонный справочник, JWT-авторизацию, требования КИИ и почему 1С-Битрикс вместо Laravel

В 2022 году мы получили задачу: автоматизировать заказы запчастей для 40+ дилеров. Вызов был не в объёме данных (50,000 SKU), а в разнородности систем дилеров и требованиях безопасности КИИ.

Через 18 месяцев 65% заказов пошли через портал без участия операторов. REST API интегрирован с 28 дилерами (70% сети). Время оформления заказа сократилось с 45 минут до 7.

Под катом — архитектурные решения, почему эталонный справочник важнее REST API, и как обойти ограничения КИИ.

Читать далее

WordPress с OpenLiteSpeed vs классический LEMP: реальные бенчмарки

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.7K

Мы сравнили OpenLiteSpeed и классический LEMP для WordPress на реальных серверах. RPS, latency, TTFB, потребление CPU и RAM, поведение под нагрузкой до 500 пользователей. И вот какие итоги у нас получились.

Читать далее

Как в PHP узнать определенна ли переменная (для версии PHP 7.4 и выше)

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели12K

Шлифуя код своего пакета PHP MultiRunner с помощью статических анализаторов кода psalm и phpstan, столкнулся с интересной загадкой — а как в PHP узнать определена ли переменная или нет.

Казалось бы, есть хорошая функция (языковая конструкция) isset(mixed $var, ...$vars): bool. Но в ней есть подвох: если переменная определена значением null, то isset() вернёт для неё false.

Читать далее

Ближайшие события

Инвертирование равенства. Как реже стрелять себе в ногу в C-подобных языках

Время на прочтение7 мин
Охват и читатели7.3K

Встав утром и посмотрев в профиль, отметил: на Хабре много лет, писал статьи, писал код. И ни разу не писал о коде на Хабре. А вообще‑то разработчик. Поззорище! Пора исправляться.

Поговорим о классической (и болезненной) проблеме кодирования «присваивание вместо равенства» которая в любой момент может создать очень много проблем. О логическом источнике этой ошибке, и о способах решения.

Ну и ещё слегка вспомним «Звездные войны»:-)

Силу инверсии равенства познай на себе :)

AI для PHP-разработчиков. Часть 4: Практическое использование TransformersPHP

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели11K

AI в PHP: не теория, а место, с которого можно начать

В своей прошлой статье я описал на довольно общем уровне почему тема AI вроде бы везде, но при этом почти не пересекается с повседневной PHP-разработкой. Не потому что PHP "не подходит", а потому что сам разговор обычно идёт мимо наших задач и привычного способа мышления. Ну и, конечно, о том, что почти нет материала, который объясняет AI именно для PHP-разработчиков, их задач и их мышления.

После публикации мне несколько раз задали один и тот же вопрос, в разных формулировках:

Окей, допустим. А с чего конкретно начать?

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

Читать далее

Мультиагентная разработка: от хотелок до продакшена

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели13K

Мультиагентная разработка — это возможность превратить работу с AI из «вайб‑кодинга» в управляемый конвейер: от хотелок до тестов и документации.

В статье я покажу свой «велосипед»: набор специализированных агентов (PO/BA/SA/архитектор/разработчик/тестировщик/техпис) и оркестратор, который гоняет их по пайплайну с изоляцией контекста.

Читать далее

Статанализ — must-have для проектов с Codex/ClaudeCode

Уровень сложностиСредний
Время на прочтение2 мин
Охват и читатели8.6K

На днях у Кирилла Мокевнина вышел пост про то, как он разлюбил динамическую типизацию. Мысль понятная: на больших кодовых базах отсутствие типов начинает дорого стоить.

Хочу дополнить аргументом, который в 2026 году уже стал прям must-have: статанализ и типы — это лучший self-check для AI-агента.

Современные агенты для разработки (Claude Code на Opus 4.5 и ChatGPT Codex 5.2 High) хорошо пишут код. Ошибок уровня «переменная не объявлена», «импорт забыл», «опечатка в имени метода» по сути уже почти нет. 

Основные промахи чаще про другое:

Читать далее

Адрес без координат — деньги на ветер: внутренняя кухня Address в Bitrix24

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели6.3K

При работе с Bitrix24 понадобилось сохранить адрес из Google Maps в стандартное поле Address у лида. Не просто строку, а полноценный адрес: с координатами, разбивкой на части и корректной работой всей CRM-логики.

REST API рассматривался первым, но быстро стало ясно, что в этом сценарии неудобен. Нужно было переносить адрес между сущностями Bitrix24, сохраняя связи с модулем location. REST такого контроля не даёт.

При этом в Bitrix24 уже есть стандартное поле address, связанное с Google Maps и модулем location. Оно умеет хранить координаты и структуру адреса, но в документации нет описания, как правильно заполнять его через код.

В статье разберу практический кейс: как сохранить адрес из Google Geocode во внутренние сущности Bitrix24 без REST API и без пользовательского интерфейса.

Читать далее

[Laravel-Telegram] Пример сервиса на Laravel для авторизации пользователя через Telegram в mini-app

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели6.4K

Авторизация пользователя в Telegram mini-app сейчас как никогда важна. Но что если вам необходимо сделать это в вашей сервисной/микросервисной архитектуре с отправкой смс-кода?

Читать далее

PHP HTML Cleaner: история разработки и обзор Composer-пакета для очистки HTML

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.9K

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

И так, у клиента из 1С, в реквизитах товара, прилетает превью описание такого вида...

Читать далее
1
23 ...