💬В Laravel есть хелпер Number для простого и удобного форматирования цифровых значений.
Библиотека пхпшника #буст
Библиотека пхпшника #буст
🔥10👍4
Паттерн Спецификация: реальный опыт применения
Когда репозиторий начинает разрастаться от десятков методов вроде
Но помогает ли он на практике?
🧱 Что такое «Спецификация»?
Идея проста: вынести логику критериев выборки в отдельные классы, чтобы не засорять бизнес-логику и модель.
Пример из оригинала (Фаулер): решаем, в какой контейнер положить груз — не через ифы, а через метод
📦 Варианты спецификаций:
Hardcoded — простые классы с жёсткими условиями.
Параметрируемые — с конфигурацией через свойства.
Композитные — объединяют другие спецификации и поддерживают AND/OR/NOT.
💡 Как это выглядит в реальной системе?
Пример из продакшена: программа лояльности, раздача карт клиентам по гибким правилам.
Каждая стратегия начислений генерирует свою спецификацию, которая используется при выборке клиентов для выдачи карт.
Пример кода:
При этом, за фасадом — сложная и кастомная реализация, где каждая спецификация превращается в SQL-запрос, в том числе с поддержкой bulk insert и пагинации.
⚠️ Где ловушка?
Когда спецификации усложняются, репозитории превращаются в мешанину
🧩 Выводы:
✔️ Использовать, если нужно чётко отделить бизнес-логику от инфраструктуры.
❌ Не использовать как «универсальный антидот» от методов
🧼 Иногда проще честно написать
🔁 Ключевая идея — спецификация — это не про репозиторий, а про знание. Описание того, что значит «подходит». И оно может жить в домене, даже если не содержит SQL.
А вы используете этот паттерн у себя? Или предпочитаете оставаться на стороне простых методов?
🔗 Хабр
Библиотека пхпшника
Когда репозиторий начинает разрастаться от десятков методов вроде
getByThisAndThat()
, код становится тяжёлым и неудобным. В таких случаях часто вспоминают паттерн Specification — особенно после хвалебных отзывов на собеседованиях.Но помогает ли он на практике?
🧱 Что такое «Спецификация»?
Идея проста: вынести логику критериев выборки в отдельные классы, чтобы не засорять бизнес-логику и модель.
Пример из оригинала (Фаулер): решаем, в какой контейнер положить груз — не через ифы, а через метод
isSatisfiedBy()
.📦 Варианты спецификаций:
Hardcoded — простые классы с жёсткими условиями.
Параметрируемые — с конфигурацией через свойства.
Композитные — объединяют другие спецификации и поддерживают AND/OR/NOT.
💡 Как это выглядит в реальной системе?
Пример из продакшена: программа лояльности, раздача карт клиентам по гибким правилам.
Каждая стратегия начислений генерирует свою спецификацию, которая используется при выборке клиентов для выдачи карт.
Пример кода:
$specification = $loyaltyProgram->createInitialCardIssuingSpecification();
$cards = $cardRepository->findAllBySpecification($specification);
При этом, за фасадом — сложная и кастомная реализация, где каждая спецификация превращается в SQL-запрос, в том числе с поддержкой bulk insert и пагинации.
⚠️ Где ловушка?
Когда спецификации усложняются, репозитории превращаются в мешанину
match
, if
, IS NULL
, кастомных условий и бэкфлипов.🧩 Выводы:
✔️ Использовать, если нужно чётко отделить бизнес-логику от инфраструктуры.
❌ Не использовать как «универсальный антидот» от методов
getByXAndY()
в репозиториях.🧼 Иногда проще честно написать
findByDateAndStatus()
.🔁 Ключевая идея — спецификация — это не про репозиторий, а про знание. Описание того, что значит «подходит». И оно может жить в домене, даже если не содержит SQL.
А вы используете этот паттерн у себя? Или предпочитаете оставаться на стороне простых методов?
🔗 Хабр
Библиотека пхпшника
❤5🔥3🤔1
Развертывание приложений Laravel на Laravel Cloud с помощью MongoDB Atlas
Разворачивать приложение раньше было больно. Потом появился Forge. А теперь — Laravel Cloud: полноценная платформа как сервис, где развертывание Laravel-приложения занимает меньше минуты и не требует возни с серверами, настройками и uptime-танцами.
🧰 В свежем туториале показали, как:
— задеплоить Laravel на Laravel Cloud
— подключить MongoDB Atlas, даже несмотря на отсутствие нативной поддержки (расширение
🔥 Фишка: можно подключить MongoDB Atlas в пару шагов — просто скопируйте строку подключения, добавьте переменную окружения, и всё взлетит после redeploy.
⏱️ Пример из статьи: первое успешное развёртывание — за 49 секунд.
🔗 Полный гайд: от подключения репозитория до настройки секрета
📍 Идеально подойдёт тем, кто:
— хочет быстрый прод для pet-проекта
— устал руками разворачивать сервера
Разворачивать приложение раньше было больно. Потом появился Forge. А теперь — Laravel Cloud: полноценная платформа как сервис, где развертывание Laravel-приложения занимает меньше минуты и не требует возни с серверами, настройками и uptime-танцами.
🧰 В свежем туториале показали, как:
— задеплоить Laravel на Laravel Cloud
— подключить MongoDB Atlas, даже несмотря на отсутствие нативной поддержки (расширение
mongodb
уже встроено)🔥 Фишка: можно подключить MongoDB Atlas в пару шагов — просто скопируйте строку подключения, добавьте переменную окружения, и всё взлетит после redeploy.
⏱️ Пример из статьи: первое успешное развёртывание — за 49 секунд.
🔗 Полный гайд: от подключения репозитория до настройки секрета
MONGODB_URL
. Скриншоты, логи, возможные ошибки и как их обойти — всё на месте.📍 Идеально подойдёт тем, кто:
— хочет быстрый прод для pet-проекта
— устал руками разворачивать сервера
🔄 Перекладывать JSON теперь проще
Составили промпт, который поможет в ежедневной рутине перемещения жсонов. Достаточно вставить структуру объекта и необходимый формат.
Промпт:
👇 JSONо-укладчики «+» в чат
🐸 Библиотека пхпшника #буст
Составили промпт, который поможет в ежедневной рутине перемещения жсонов. Достаточно вставить структуру объекта и необходимый формат.
Промпт:
Напиши функцию на PHP, которая преобразует JSON-объект с полями [Ваш JSON] в [Ваш формат]. Функция должна корректно обрабатывать ошибки парсинга JSON, возвращая либо строку, где произошла ошибка, либо ошибку.
👇 JSONо-укладчики «+» в чат
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱8😢2😁1
Git Notes
В статье рассказано о том, как можно использовать малозаметную, но полезную функцию Git — Git Notes — для добавления дополнительной информации к коммитам после их создания. В отличие от стандартных коммитов, которые создают новые объекты при изменении данных (например, при изменении сообщения коммита), Git Notes позволяют прикрепить к существующему коммиту дополнительную информацию, не меняя его.
Git Notes позволяют добавить различные заметки к коммиту с помощью команды
Функционал Git Notes особенно полезен в таких случаях, как хранение обсуждений и комментариев к pull request'ам (PR). В проекте Symfony используют специальный инструмент для объединения веток, который автоматически сохраняет комментарии из GitHub в виде заметок Git Notes. Эти комментарии прикрепляются к коммитам, что позволяет отслеживать обсуждения даже после смены платформы или удаления исходного PR. Таким образом, при необходимости можно получить доступ к обсуждению, сохранив его вместе с кодом.
Для того чтобы просмотреть или извлечь эти заметки, можно использовать команду
👉 Читать статью
Библиотека пхпшника
В статье рассказано о том, как можно использовать малозаметную, но полезную функцию Git — Git Notes — для добавления дополнительной информации к коммитам после их создания. В отличие от стандартных коммитов, которые создают новые объекты при изменении данных (например, при изменении сообщения коммита), Git Notes позволяют прикрепить к существующему коммиту дополнительную информацию, не меняя его.
Git Notes позволяют добавить различные заметки к коммиту с помощью команды
git notes add
. Эти заметки хранятся в отдельной ветке notes/commits и могут быть сгруппированы по категориям через флаг --ref
. Например, можно создать разные типы заметок для одного и того же коммита — заметки, связанные с проверкой качества или тестированием кода.Функционал Git Notes особенно полезен в таких случаях, как хранение обсуждений и комментариев к pull request'ам (PR). В проекте Symfony используют специальный инструмент для объединения веток, который автоматически сохраняет комментарии из GitHub в виде заметок Git Notes. Эти комментарии прикрепляются к коммитам, что позволяет отслеживать обсуждения даже после смены платформы или удаления исходного PR. Таким образом, при необходимости можно получить доступ к обсуждению, сохранив его вместе с кодом.
Для того чтобы просмотреть или извлечь эти заметки, можно использовать команду
git log --notes
или настраивать git fetch, чтобы автоматически загружать заметки с сервера.👉 Читать статью
Библиотека пхпшника
👍5
Какое ревью в вашем PHP-коде было самым спорным?
🤬 Кто-то не принимает
А может, у вас спор был из-за
Поделитесь:
• Из-за чего начался спор?
• Кто в итоге «победил»?
• Как теперь пишете код?
💬 Интересно собрать реальные кейсы — и заодно понять, где граница между чистым кодом и субъективщиной.
Библиотека пхпшника #междусобойчик
🤬 Кто-то не принимает
match
в проде, кто-то на дух не переносит Service
-суффиксы в названиях.А может, у вас спор был из-за
static
методов, facade
-ов или неправильного DI?Поделитесь:
• Из-за чего начался спор?
• Кто в итоге «победил»?
• Как теперь пишете код?
💬 Интересно собрать реальные кейсы — и заодно понять, где граница между чистым кодом и субъективщиной.
Библиотека пхпшника #междусобойчик
Proglib Academy — это место, где вы превращаете теорию в практику. Здесь ваши знания становятся проектами для портфолио, а вы — более уверенным специалистом.
Выберите курс, который поможет сделать следующий шаг ⬇️
🚀 Для тех, кто начинает путь в IT:
— Основы IT для непрограммистов
— Программирование на Python (обновлённый)
— Frontend-разработчик с нуля: HTML, CSS, JavaScript
🧠 Для будущих и настоящих Data Scientist'ов:
— ML для старта в Data Science (начинается в сентябре)
— Базовые модели ML и приложения
— Математика для Data Science
— AI-агенты для DS-специалистов (скоро второй поток)
🛠️ Для опытных разработчиков, готовых к росту:
— Алгоритмы и структуры данных
— Архитектуры и шаблоны проектирования
Независимо от вашей цели, у нас есть курс, который поможет её достичь. Переходите в Proglib Academy, выбирайте свой путь и инвестируйте в навыки, которые всегда будут в цене!
Выберите курс, который поможет сделать следующий шаг ⬇️
🚀 Для тех, кто начинает путь в IT:
— Основы IT для непрограммистов
— Программирование на Python (обновлённый)
— Frontend-разработчик с нуля: HTML, CSS, JavaScript
🧠 Для будущих и настоящих Data Scientist'ов:
— ML для старта в Data Science (начинается в сентябре)
— Базовые модели ML и приложения
— Математика для Data Science
— AI-агенты для DS-специалистов (скоро второй поток)
🛠️ Для опытных разработчиков, готовых к росту:
— Алгоритмы и структуры данных
— Архитектуры и шаблоны проектирования
Независимо от вашей цели, у нас есть курс, который поможет её достичь. Переходите в Proglib Academy, выбирайте свой путь и инвестируйте в навыки, которые всегда будут в цене!
Когда в проекте много зависимостей (
vendor/
, node_modules/
и т.п.), PhpStorm может тормозить из-за длительной индексации.✅ Простое решение: кликните папку → Mark Directory as → Excluded.
🚀 После этого IDE быстрее работает, особенно при автокомплите и поиске по проекту.
Попробуйте — в крупных проектах сразу почувствуете разницу!
Библиотека пхпшника #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱11👍3😁1😢1🌚1
🔧 Нужен ли
На первый взгляд, совет заменить обычную анонимную функцию на
📌 Что происходит:
–
– Это позволяет PHP быстрее освобождать память
– И в ряде случаев — существенно ускоряет выполнение кода
💡 Один из PR'ов в
📉 Минус 30x по памяти, минус 4x по времени.
Чтобы внедрить это на постоянной основе, удобно использовать Rector с правилами
✅ Быстрее
✅ Меньше памяти
✅ Автоматическая проверка в CI
👉 Читать статью
static
в замыкании? Да — и вот почемуНа первый взгляд, совет заменить обычную анонимную функцию на
static
в array_map
может показаться чисто стилевым. Но за этой рекомендацией скрывается реальный прирост производительности. ⚡📌 Что происходит:
–
static
-замыкания не привязаны к $this
, а значит, не тащат за собой контекст объекта– Это позволяет PHP быстрее освобождать память
– И в ряде случаев — существенно ускоряет выполнение кода
💡 Один из PR'ов в
Ocramius/GeneratedHydrator
показал: просто добавив static
, удалось добиться ~15% ускорения. А бенчмарки дали ещё более радикальную разницу:benchUsingStaticKeyword → 2.10MB / 3.70ms
benchNotUsingStaticKeyword → 71.30MB / 17.17ms
📉 Минус 30x по памяти, минус 4x по времени.
Чтобы внедрить это на постоянной основе, удобно использовать Rector с правилами
StaticClosureRector
и StaticArrowFunctionRector
. Так все замыкания, где не используется $this
, становятся static
автоматически. 🛠️✅ Быстрее
✅ Меньше памяти
✅ Автоматическая проверка в CI
👉 Читать статью
👍16
Slack, Telegram, Discord — рабочие чаты стали центром всего: задачи, баги, апдейты, мемы. Удобно… пока не превращается в постоянный шум и расфокус.
— Быстро решить вопрос без созвонов
— Видно, кто чем занят
— Меньше митингов, больше живого контекста
— Держит команду в тонусе
— Поток отвлечений не прекращается
— Важное тонет в болтовне
— Нарушает фокус и deep work
— Появляется тревожка «а вдруг я что-то пропустил»
Чаты работают, когда в них есть правила: меньше @all, больше тредов, без лишнего шума — и никто не сходит с ума.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💻 Подборка новостей по PHP за неделю:
🔹 Laravel Idea бесплатно — с 30 июля 2025 плагин Laravel Idea стал бесплатным для пользователей PhpStorm, полный доступ ко всем функциям без доплат.
🔹 PHP 8.5.0 Alpha 4 — новая тестовая версия в рамках цикла PHP 8.5.
🔹 PHP 8.4.11 и 8.3.24 — релизы с исправлениями ошибок, рекомендуется обновление.
🔹 Symfony 7.3.2 — техническое обновление, доступны гайды и отчёты SymfonyInsight для безопасного апгрейда.
🔹 Symfony 28 июля — 3 августа 2025 — вышли версии 6.4.24, 7.2.9 и 7.3.2; начата депрекация XML-конфигурации в некоторых компонентах, улучшен YAML с автодополнением, переработан процесс дампа контейнера в XML.
Библиотека пхпшника #свежак
🔹 Laravel Idea бесплатно — с 30 июля 2025 плагин Laravel Idea стал бесплатным для пользователей PhpStorm, полный доступ ко всем функциям без доплат.
🔹 PHP 8.5.0 Alpha 4 — новая тестовая версия в рамках цикла PHP 8.5.
🔹 PHP 8.4.11 и 8.3.24 — релизы с исправлениями ошибок, рекомендуется обновление.
🔹 Symfony 7.3.2 — техническое обновление, доступны гайды и отчёты SymfonyInsight для безопасного апгрейда.
🔹 Symfony 28 июля — 3 августа 2025 — вышли версии 6.4.24, 7.2.9 и 7.3.2; начата депрекация XML-конфигурации в некоторых компонентах, улучшен YAML с автодополнением, переработан процесс дампа контейнера в XML.
Библиотека пхпшника #свежак
🔥2
Forwarded from Библиотека задач по PHP | тесты, код, задания
Что произойдет, если вы добавите строку к целому числу с помощью оператора + в PHP 8+ (строка начинается не с числа))
Anonymous Quiz
39%
Интерпретатор выдает ошибку
23%
Строка преобразуется в число и добавляется к целому числу.
6%
Строка отбрасывается, а целое число сохраняется.
32%
Целое число и строка объединяются в новую строку.
⌨️ Топ-вакансий по PHP за неделю
PHP-разработчик (Symfony) — от 160 000 ₽, удалёнка (Москва)
TeamLead backend (PHP) — от 350 000 ₽, офис (Москва)
Senior PHP-разработчик — от 300 000 ₽, Гибрид (Москва, Батуми)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
PHP-разработчик (Symfony) — от 160 000 ₽, удалёнка (Москва)
TeamLead backend (PHP) — от 350 000 ₽, офис (Москва)
Senior PHP-разработчик — от 300 000 ₽, Гибрид (Москва, Батуми)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
⏳Оптимизированное шифрование строк с помощью Fluent в Laravel
Статья рассказывает о нововведении в Laravel, которое делает работу со шифрованием строк проще и читаемее.
Раньше, чтобы зашифровать строку внутри fluent-цепочки (
Теперь Laravel поддерживает методы
🔹 Не выходить из fluent-интерфейса;
🔹 Поддерживать читаемость;
🔹 Использовать уже настроенные параметры шифрования (
Также показан реальный кейс: генерация и расшифровка идентификаторов документов, где важно:
🔸 зашифровать строку с нужным форматированием (дата, департамент и ID);
🔸 сохранить длину и читаемость;
🔸 безопасно расшифровывать обратно.
⚡ Ключевая идея: теперь можно удобно и безопасно обрабатывать чувствительные данные (настройки, токены, ID и пр.) прямо внутри
🔗 Читать статью
Библиотека пхпшника #буст
Статья рассказывает о нововведении в Laravel, которое делает работу со шифрованием строк проще и читаемее.
Раньше, чтобы зашифровать строку внутри fluent-цепочки (
str()
), приходилось использовать pipe()
с анонимной функцией — это разрывало читаемость кода.Теперь Laravel поддерживает методы
encrypt()
и decrypt()
прямо в цепочках, что позволяет:🔹 Не выходить из fluent-интерфейса;
🔹 Поддерживать читаемость;
🔹 Использовать уже настроенные параметры шифрования (
cipher
, key
) приложения.Также показан реальный кейс: генерация и расшифровка идентификаторов документов, где важно:
🔸 зашифровать строку с нужным форматированием (дата, департамент и ID);
🔸 сохранить длину и читаемость;
🔸 безопасно расшифровывать обратно.
⚡ Ключевая идея: теперь можно удобно и безопасно обрабатывать чувствительные данные (настройки, токены, ID и пр.) прямо внутри
str()
-цепочек без лишнего кода.🔗 Читать статью
Библиотека пхпшника #буст
Хватит спрашивать у синьоров джуниорские вопросы на собеседованиях
Это крик души разработчика с 11-летним опытом, который устал от формальных, оторванных от реальности собеседований. Он не жалуется — он говорит правду, которую многие думают, но не озвучивают: вместо оценки реального опыта, мышления и навыков — проверяют память и подготовку к викторине.
Он не против технологий, не против сложности. Он против абсурдных требований помнить то, что в работе не используется, и того, что настоящий профессионал «гуглит» не потому что некомпетентен, а потому что не тратит мозг на запоминание справочников.
🔗 Хабр
Это крик души разработчика с 11-летним опытом, который устал от формальных, оторванных от реальности собеседований. Он не жалуется — он говорит правду, которую многие думают, но не озвучивают: вместо оценки реального опыта, мышления и навыков — проверяют память и подготовку к викторине.
Он не против технологий, не против сложности. Он против абсурдных требований помнить то, что в работе не используется, и того, что настоящий профессионал «гуглит» не потому что некомпетентен, а потому что не тратит мозг на запоминание справочников.
🔗 Хабр
1👍16❤8😁2
🧅 Onion: Механизм многоуровневой обработки для PHP-приложений
Onion — это легкий пакет, предназначенный для облегчения многоуровневой обработки данных в приложениях. Он обеспечивает чистый и эффективный способ укладки слоев функциональности, позволяя разработчикам создавать гибкие и многократно используемые компоненты, которые легко компоновать и управлять ими. Каждый слой может выполнять определенную операцию над передаваемыми данными, что упрощает построение сложных рабочих процессов, сохраняя при этом четкое разделение задач.
👉 Github
Библиотека пхпшника #инструменты
Onion — это легкий пакет, предназначенный для облегчения многоуровневой обработки данных в приложениях. Он обеспечивает чистый и эффективный способ укладки слоев функциональности, позволяя разработчикам создавать гибкие и многократно используемые компоненты, которые легко компоновать и управлять ими. Каждый слой может выполнять определенную операцию над передаваемыми данными, что упрощает построение сложных рабочих процессов, сохраняя при этом четкое разделение задач.
👉 Github
Библиотека пхпшника #инструменты
❤4
Правильный перезапуск Opcache после развертывания
Важно правильно перезагружать Opcache при деплое кода на сервер без использования контейнеров.
Opcache сохраняет старые версии файлов в кэше и не выбрасывает их автоматически. Поэтому, если новая версия кода деплоится в новую директорию, старые файлы остаются в кэше, занимая место и предотвращая сохранение новых файлов. Это приводит к необходимости постоянной перекомпиляции новых файлов, что снижает производительность.
Статья предлагает два решения проблемы:
1. Перезагрузка процесса «php-fpm» после деплоя новой версии кода. Однако, это решение приводит к прерыванию текущих запросов на короткое время.
2. Использование утилиты gordalina/cachetool или аналогичной, например, chop, для сброса кэша. Cachetool позволяет сбросить кэш без перезагрузки php-fpm, обнаруживая PHP-FPM через сокеты или IP-адрес и порт. Утилиту можно установить и использовать следующими командами:
Скачивание и установка:
Сброс кэша:
В случае использования других сокетов или IP-адресов и портов, команда выглядит так:
Важно правильно перезагружать Opcache при деплое кода на сервер без использования контейнеров.
Opcache сохраняет старые версии файлов в кэше и не выбрасывает их автоматически. Поэтому, если новая версия кода деплоится в новую директорию, старые файлы остаются в кэше, занимая место и предотвращая сохранение новых файлов. Это приводит к необходимости постоянной перекомпиляции новых файлов, что снижает производительность.
Статья предлагает два решения проблемы:
1. Перезагрузка процесса «php-fpm» после деплоя новой версии кода. Однако, это решение приводит к прерыванию текущих запросов на короткое время.
2. Использование утилиты gordalina/cachetool или аналогичной, например, chop, для сброса кэша. Cachetool позволяет сбросить кэш без перезагрузки php-fpm, обнаруживая PHP-FPM через сокеты или IP-адрес и порт. Утилиту можно установить и использовать следующими командами:
Скачивание и установка:
curl -sLO https://github.com/gordalina/cachetool/releases/latest/download/cachetool.phar
chmod +x cachetool.phar
Сброс кэша:
php cachetool.phar opcache:reset
В случае использования других сокетов или IP-адресов и портов, команда выглядит так:
php cachetool.phar opcache:reset --fcgi=/var/run/php/php8.2-fpm-profiler.sock
👍5