Не попадитесь на накрученные каналы! Узнайте, не накручивает ли канал просмотры или подписчиков Проверить канал на накрутку
Прикрепить Телеграм-аккаунт Прикрепить Телеграм-аккаунт

Телеграм канал «WebCraft - ремесло веб разработки»

WebCraft - ремесло веб разработки
3.9K
0
511
1
11.1K
Интересуешься php , js , css , html , Laravel , Vue ? Этот канал для тебя

Админ, сотрудничество, реклама: @seniorFrontPromo, @maria_seniorfront

Купить рекламу: https://telega.in/c/web_craft
Подписчики
Всего
4 987
Сегодня
0
Просмотров на пост
Всего
291
ER
Общий
5.83%
Суточный
5.05%
Динамика публикаций
Telemetr - сервис глубокой аналитики
телеграм-каналов
Получите подробную информацию о каждом канале
Отберите самые эффективные каналы для
рекламных размещений, по приросту подписчиков,
ER, количеству просмотров на пост и другим метрикам
Анализируйте рекламные посты
и креативы
Узнайте какие посты лучше сработали,
а какие хуже, даже если их давно удалили
Оценивайте эффективность тематики и контента
Узнайте, какую тематику лучше не рекламировать
на канале, а какая зайдет на ура
Попробовать бесплатно
Показано 7 из 3 854 постов
Смотреть все посты
Пост от 23.10.2026 20:47
60
0
0
Пятница, 17:30. Макет почти готов

Но один сценарий всё ещё вызывает вопросы. Обсудить сейчас или вернуться в понедельник?

Решайте вместе с командой hh.ru в «Охэхэнных новостях».

Подписаться

#реклама
О рекламодателе
Пост от 23.10.2026 13:24
87
0
1
🚀 Страница 4000: 127 мс против 3 мс

Обычная пагинация через смещение (LIMIT 10000,20) медленнеет с каждой страницей. База всё равно читает первые 10 000 строк, перебирает их и выбрасывает. Чем дальше страница, тем больше пустой работы.

Курсорная пагинация обходится без смещения. Приложение запоминает значение колонки сортировки на границе страницы, например last_message_at. Следующую страницу оно берёт через WHERE last_message_at <= ? и LIMIT 0,20. Если колонка в индексе, скорость почти не зависит от глубины.

В одном тесте на MySQL 8.4 и 300 000 строк страница 4000 открывалась за 127 мс через смещение и за 3 мс через курсор. В Doctrine ORM 3.7 для этого появляется класс CursorPaginator.

Подвох в том, что прыгнуть сразу на страницу 57 нельзя. Доступны только первая, следующая и последняя.

Если по вашим длинным спискам ходят краулеры или API-клиенты, самое время посмотреть, как выглядит переход в коде.

👍 - если было полезно

👉 @web_craft
👍 1
Пост от 22.10.2026 13:04
87
0
2
🔒 readonly в PHP защищает свойство, но не объект внутри

readonly запрещает присвоить свойству новое значение. Но изменяемый объект в таком свойстве по-прежнему можно менять:

final readonly class DeliveryWindow
{
public function __construct(
public DateTime $startsAt,
) {}
}

$window = new DeliveryWindow(new DateTime('2026-08-01 09:00:00'));

$window->startsAt->modify('+1 day');

echo $window->startsAt->format('Y-m-d');
// 2026-08-02

Свойство никто не переприсваивал, и PHP не возражает. Но дата доставки уже другая: readonly не действует вглубь.

Поэтому внутри стоит хранить только неизменяемые значения. Например, DateTimeImmutable вместо DateTime: его modify() возвращает новый объект.

С массивами та же ловушка: вызывающий код получит копию массива, но объекты в ней общие с оригиналом.

В статье ещё разобрано, почему clone тут не помогает.

👍 - если было полезно

👉 @web_craft
Пост от 21.10.2026 18:00
32
0
0
🤖Podlodka Backend Crew: AI в бэкенд-задачах

Демо с AI чаще всего выглядят одинаково: агент за десять минут пишет сервис с нуля.

Вот только в работе бэкендера всё сложнее: легаси, рискованные миграции, неработающие тесты и ревью, которое становится бутылочным горлышком.

🗓 С 26 по 30 октября в сезоне Podlodka Backend Crew «AI в бэкенд-задачах» участники:

• Научатся передавать агенту инженерные стандарты и правила, чтобы он писал так, как нужно, а не как получится

• Соберут ревью, где несколько моделей независимо проверяют изменения, а финальное решение остаётся за человеком

• Посмотрят, куда переезжает сложность миграции легаси, когда код пишет агент

• Выяснят, где ломается мечта отдать миграцию агенту целиком

• Разберут, какие антипаттерны тестов агенты уже успели перенять от разработчиков.

Формат — пять дней живых Zoom-сессий утром и вечером, закрытое сообщество в Telegram и общение со спикерами.

Будет много интерактива и практики. Базовый ликбез оставят за бортом — этот сезон для тех, кто уже пробует AI в реальных проектах. Присоединяйтесь с 26 октября!

🔗 Билеты и программа: https://podlodka.io/becrew
Пост от 21.10.2026 13:09
78
0
3
✨ Symfony 8.2: контроллер, который не запустится дважды одновременно

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

В Symfony 8.2 хватит атрибута #[Lock]. Пока запрос выполняется, второй с тем же ключом получит 409 Conflict, а с blocking: true подождёт. Ключ можно собрать из параметра маршрута, тогда у каждой конференции своя блокировка:

#[Route('/conference/{conference}/tickets', methods: 'POST')]
#[Lock('ticket-sale-{conference}', blocking: true, ttl: 10)]
public function buyTicket(Conference $conference): Response { /* ... */ }

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

Продлить её или отпустить раньше можно, если принять LockInterface аргументом контроллера.

👍 - если было полезно

👉 @web_craft
Пост от 20.10.2026 13:13
152
0
0
🧩 Исключение, которое само объясняет, что сломалось

Обычно ошибку бизнес-логики бросают как InvalidArgumentException с текстом. Это работает, пока не понадобится поймать именно её. Тот же класс летит ещё из десятка мест.

В Spatie, где пишут хелпдеск There There на Laravel, заводят свой класс на каждую доменную ошибку. На каждую причину в нём есть статический метод. Код читается как фраза:

throw CouldNotDeleteMessage::onlyNotesCanBeDeleted($message)

Метод принимает типизированный $message. Поэтому текст ошибки без id и типа сообщения просто не собрать.

Одна тонкость: такие классы помечают интерфейсом ShouldntReport, и они не попадают в трекер ошибок. Это ожидаемые ситуации от действий пользователя, а не баги, так что трекер не засоряется.

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

👍 - если было полезно

👉 @web_craft
Пост от 20.10.2026 10:09
113
0
0
⚡️ В сети начали массово сливать IT-курсы и книги известных онлайн школ

Вот отсортированная база с тонной материала (постепенно пополняется):

(363 видео, 87 книги) — Python
(117 видео, 53 книги) — ВАЙБКОД
(174 видео, 91 книги) — DevOps
(415 видео, 68 книги) — Frontend
(137 видео, 93 книги) — DS/ML
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++/C
(343 видео, 87 книги) — Java/QA
(176 видео, 32 книги) — Git/Linux
(167 видео, 53 книги) — PHP/1С
(227 видео, 83 книги) — SQL/БД
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go/Rust
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(136 видео, 33 книги) — PM/HR

Скачивать ничего не нужно — все выложили в Telegram
Смотреть все посты