TGViewer
Channel Public Channel
Заметки разработчика

Заметки разработчика

@dev_notes_ru

Заметки о Frontend, Backend и немного DevOps. В основном о #PHP, #Laravel, #JavaScript, #HTML, #CSS, тестировании и настройке серверов.

https://www.dev-notes.ru

@snakenf
Subscribers
458
Photos
740
Videos
4
Links
1.2K

Showing posts older than #1668 · Back to latest

Older Posts 20 shown
Post #1667 268
🕐 PSR-20 Clock: Тестируемое время в PHP

Знакомо, когда unit-тест нестабилен из-за «плавающего» времени? В основе таких багов — прямая зависимость от системных часов. Пора перестать быть заложником времени и начать им управлять.

В новой статье детально разобрали, как PSR-20 Clock решает эту проблему:
✅ Показываем, как превратить время в явную и контролируемую зависимость.
✅ Объясняем разницу между SystemClock, MockClock и MonotonicClock.
✅ Даём пошаговый алгоритм внедрения в Symfony, Laravel и чистый PHP.

Это не просто новый интерфейс, а смена парадигмы для написания надёжного кода.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PSR
  • 🔥 1
Post #1666 219
🚀 Laravel v12.47.0 вышел!

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

🌟 Новые возможности

✅ @includeIsolated для Blade: Новая директива для безопасного рендеринга Blade-включений в изолированном контексте. Идеально для шаблонов, которые не должны наследовать или изменять переменные родительской области видимости.

✅ Cache::withoutOverlapping(): Удобный метод для предотвращения одновременного выполнения задач. Внутри он использует Cache::lock()->block(), упрощая работу с блокировками.

✅ Enum-ключи в Session Store: Теперь в методах get, has и put хранилища сессий можно использовать Enum-ключи, что улучшает типизацию и читаемость кода.

✅ Macroable Notifications: Класс Illuminate\Support\Facades\Notification стал макро-определяемым (Macroable), позволяя гибко расширять его функциональность.

⚡️ Улучшения и исправления

✅ Кэш и очередь: События CacheFailedOver и QueueFailedOver теперь срабатывают только при первом сбое (#58330), предотвращая дублирование логов.

✅ Обработка исключений: Исправлена ошибка, из-за которой QueryException показывала неверные детали подключения для PDO в режиме чтения (#58331).

✅ Валидация в прекогнитивных запросах: Теперь они поддерживают использование подстановочных знаков (wildcards) вместе с валидацией массивов (#57486).

✅ JSON API Resources: Устранено дублирование при обработке циклических ссылок (#58348).

✅ Пакетная обработка задач: Метод Bus::batch теперь корректно фильтрует пустые (falsy) элементы из переданного массива (#58360).

✅ Типы данных: Улучшены аннотации типов для вспомогательных методов Number::with*() (#58358) и Str (#58356), а также для TableGuesser::guess() (#58354).

🛠 Прочие изменения

✅ Улучшено сообщение об ошибке команды php artisan key:generate, когда APP_KEY уже установлен (#58345).

✅ В stub для миграции таблицы failed_jobs добавлены индексы (#58355).

✅ Разрешено использование Enum в методе PendingBatch::onConnection (#58350).

Это обновление — шаг к более безопасному, типизированному и предсказуемому фреймворку. Полный список коммитов смотрите в истории на GitHub. Обновляйтесь и пользуйтесь новыми возможностями!

📱 @dev_notes_ru

#Laravel #Laravel12 #PHP
GitHub Release v12.47.0 · laravel/framework [12.x] Add @includeIsolated directive for isolated Blade includes by @KennedyTedesco in #58311 [12.x] Fix typo in JsonApiResource trait method by @dxnter in #58326 [12.x] Add Cache::withoutOverlapp...
Post #1665 248
🚀 Частичное применение функций появится в PHP 8.6

Знакомо чувство, когда половина кода — это однотипные стрелочные функции, которые лишь фиксируют аргументы? В PHP 8.6 эту проблему решает частичное применение функций (PFA). Теперь можно создавать специализированные callback’ы в одну строку, используя заполнители ? и ….

🔹 Как заменить fn($s) => str_replace(‘hello’, ‘hi’, $s) на str_replace(‘hello’, ‘hi’, ?)
🔹 Работа с именованными и вариативными аргументами
🔹 Практические примеры для фильтрации, конвейеров и HTTP-обработчиков

Это не просто синтаксический сахар — это способ писать лаконичнее и выразительнее.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP86
  • 👍 1
Post #1664 338
👩‍💻 👩‍💻 Генерируемые столбцы и SQL-представления: использование в Laravel

Знакомо чувство, когда сложный отчёт в админке загружается по 10 секунд, а пагинация с вычисляемыми полями ломается?

Часто проблема не в коде, а в подходе: мы пытаемся в PHP делать то, что СУБД выполнит в сотни раз быстрее. В новой статье разбираем, как заставить базу данных работать на полную:

✅ Генерируемые столбцы: когда они заменяют аксессоры и как с их помощью индексировать вычисляемые поля.
✅ SQL-представления: как создавать виртуальные таблицы для сложных отчётов и избегать дублирования кода.
✅ Практические кейсы: ускорение сортировки по марже прибыли и создание ежедневных отчётов без таймаутов.

Всё — с кодом, миграциями и замером производительности. Переносим логику из PHP в SQL и получаем прирост скорости в 5–10 раз. 🚀

🖥 Читать статью

📱 @dev_notes_ru

#Laravel #MySQL #PHP #Database
  • 👍 2
Post #1663 284
🚀 Laravel 12.46.0: Разбор ранних январских новинок

Laravel начинает 2026 год не сбавляя темпа! Вышли версии 12.45.1, 12.45.2 и главная звезда — 12.46.0. Это не просто исправления багов, а новые мощные инструменты для работы с массивами, коллекциями и авторизацией.

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

✨ Новые методы фильтрации массивов по значению

Одна из частых задач — отфильтровать массив, оставив или удалив конкретные значения. Раньше приходилось писать циклы или использовать array_filter. Теперь в хелперах Illuminate\Support\Arr есть два новых метода, делающих это в одну строку.

➡️ Arr::onlyValues()
Оставляет в массиве только элементы с указанными значениями.
use Illuminate\Support\Arr;

$roles = ['admin', 'editor', 'viewer', 'guest'];
$allowedRoles = Arr::onlyValues($roles, ['admin', 'editor']);
// Результат: [0 => 'admin', 1 => 'editor']


➡️ Arr::exceptValues()
Делает обратное — удаляет элементы с указанными значениями.
$statuses = ['pending', 'completed', 'failed', 'shipped'];
$activeStatuses = Arr::exceptValues($statuses, ['failed', 'completed']);
// Результат: [0 => 'pending', 3 => 'shipped']


🔥 Важный нюанс: Оба метода поддерживают строгое сравнение типов через третий параметр strict: true. Это спасет от коварных багов.

$mixedValues = [1, '1', 2, '2', 3];
$integers = Arr::onlyValues($mixedValues, [1, 2, 3], strict: true);
// Результат: [0 => 1, 2 => 2, 4 => 3] (строка '1' не попала!)

Идеально для: фильтрации конфигов, очистки статусов, санации данных из форм.

📦 Умная проверка коллекций: containsManyItems()

Работа с коллекциями стала выразительнее. Новый метод containsManyItems() дополняет существующий containsOneItem() и проверяет, содержит ли коллекция более одного элемента.

Простая проверка:
collect([1, 2])->containsManyItems(); // true
collect([1])->containsManyItems(); // false


Мощь в callback-функции: Метод может проверить, удовлетворяют ли условию более одного элемента.
$users = collect([
['name' => 'John', 'role' => 'admin'],
['name' => 'Jane', 'role' => 'editor'],
['name' => 'Bob', 'role' => 'admin'],
]);

$hasMultipleAdmins = $users->containsManyItems(fn($user) => $user['role'] === 'admin');
// Результат: true (админов больше одного)

Сценарий использования: Валидация, где нужно убедиться, что пользователь выбрал хотя бы два варианта. Метод эффективен и прекращает работу, как находит второй подходящий элемент.

🛡 Типобезопасная авторизация с Enum в Gate

Метод has() фасада Gate теперь может принимать любые Enum (UnitEnum), а не только строки или BackedEnum.

Раньше проверка существования правила была только по строке:
if (Gate::has('view-dashboard')) {
// Правило существует
}


Теперь можно использовать чистые Enum для типобезопасности:
enum Abilities {
case VIEW_DASHBOARD;
case EDIT_POST;
}

Gate::define(Abilities::VIEW_DASHBOARD, fn($user) => $user->isAdmin());

if (Gate::has(Abilities::VIEW_DASHBOARD)) { // Работает с UnitEnum!
// Проверка прошла
}


Практическая польза: Это открывает возможности для динамической регистрации прав и элегантной организации кода авторизации.

🛠 Исправления и улучшения под капотом

Каждый минорный релиз несет важные стабилизирующие правки:

- 12.45.1: Исправлена работа ResourceCollection при передаче простого массива вместо коллекции моделей.
-12.45.2: Починены методы Validator::appendRules() и toArray() для AnonymousResourceCollection.
- 12.46.0: Исправлено клонирование подключений к БД с префиксом таблиц и добавлены опции блокировок DDL для MySQL.

💎 Итог: Что это значит

1. Меньше шаблонов: Фильтрация массивов и проверка коллекций теперь в одну строку.
2. Более надежный код: Строгая типизация в хелперах и использование Enum в Gate предотвращают целый класс ошибок.
3. Современный стек: Фреймворк продолжает интегрировать лучшие практики и возможности PHP.

Обновление простое и безопасное: composer update laravel/framework.

Changelog:  v12.46.0,  v12.45.2, v12.45.1.

📱 @dev_notes_ru

#Laravel #Laravel12 #PHP
  • 👍 1
Post #1662 244
👩‍💻 Arr::onlyValues() & exceptValues() — фильтрация по значениям в Laravel 12.46

Хелперы Arr::only() и Arr::except() отлично фильтруют массивы по ключам. А что, если нужно отфильтровать именно по значениям?

Раньше приходилось комбинировать array_filter() с in_array() и писать callback-функции. В Laravel 12.46.0 появились два новых метода, которые делают это декларативно.

Arr::onlyValues() — оставляет только совпадающие значения:

$roles = ['admin', 'editor', 'viewer', 'guest'];
Arr::onlyValues($roles, ['admin', 'editor']);
// Результат: [0 => 'admin', 1 => 'editor']


Arr::exceptValues() — удаляет указанные значения:

$statuses = ['pending', 'completed', 'failed', 'shipped'];
Arr::exceptValues($statuses, ['failed', 'completed']);
// Результат: [0 => 'pending', 3 => 'shipped'] (ключи сохраняются!)


Строгий режим для смешанных типов:
Необязательный третий параметр strict: true включает проверку типа (===).

$mixed = [1, '1', 2, '2', 3];
Arr::onlyValues($mixed, [1, 2, 3], strict: true);
// Результат: [0 => 1, 2 => 2, 4 => 3] (только integer)


Где это удобно?
→ Фильтрация списков: статусы, роли, категории.
→ Очистка ввода: разрешённые/запрещённые значения.
→ Работа с конфигурациями и перечислениями (enum-like arrays).

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

📱 @dev_notes_ru

#PHP #Laravel12
Post #1661 317
👩‍💻 Хуки свойств в Laravel 12: Прощай, `getFullNameAttribute()`

10 лет мы использовали геттеры и сеттеры в виде методов, мирясь с ограничениями автодополнения в IDE. С выходом PHP 8.4 и Laravel 12 появился более элегантный и строгий способ — хуки свойств (Property Hooks).

Теперь логику можно описывать прямо в теле свойства:

public string $fullName {
get => "{$this->first_name} {$this->last_name}";
set(string $value) => [
$this->first_name,
$this->last_name
] = explode(' ', $value, 2);
}


Ключевые преимущества


✅ Встроенная типизация. Явное указание типа `string` гарантирует безопасность на уровне языка. Больше не нужны `@property`-аннотации для подсказок IDE.
✅ Идеальное автодополнение. Свойства «видны» с первого обращения, IDE понимает их структуру без дополнительных плагинов.
✅ Чистота моделей. Код становится декларативным и компактным, логика сосредоточена в одном месте.
✅ Прозрачность. Меньше «магии» фреймворка — проще читать и отлаживать.

Идеальные сценарии для использования


✅ Виртуальные (вычисляемые) атрибуты: `full_name`, `formatted_price`, `is_published`.
✅ Мгновенная нормализация данных: приведение к нижнему регистру, триммирование пробелов при записи.
✅ Простые вычисления без кэширования: когда нет необходимости хранить результат в БД.

⚠️ Важно: Класс `Attribute` и метод `Attribute::make()` остаются для сложных сценариев с кэшированием, зависимостями и т.п. Но для большинства простых преобразований хуки свойств — более прямой и производительный выбор.

Итог


2026 год на дворе. Пора писать модели на современном PHP, используя его синтаксис, а не обходные пути ранних версий Laravel.

📱 @dev_notes_ru

#PHP #Laravel #PropertyHooks
  • 👍 4
Post #1660 259
🚀 PHP 8.5: CLI/CGI: Удалён параметр -z / --zend-extension

PHP 8.5 оба параметра -z и --zend-extension окончательно удалены. Это изменение — финальный шаг в устранении давно сломанной функциональности: опция -z не работала корректно для загрузки Zend-расширений как минимум на протяжении последних нескольких основных релизов PHP (например, в ветках 8.x и 7.x), а её реализация в CLI/CGI SAPI всегда была неполноценной.

• Опция -z была сломана годами и окончательно удалена в PHP 8.5.
• Если она использовалась формально — просто удалите её.
• Если нужно загрузить расширение — используйте -d zend_extension=....

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85
  • ❤ 1
  • 👍 1
Post #1659 298
🚀 PHP 8.5: Все константы MHASH_* объявлены устаревшими

Знакомы с функциями mhash() и константами вроде MHASH_SHA1? В PHP 8.5 они окончательно помечены как устаревшие. Что это значит для ваших проектов? 👇

• Все константы MHASH_* теперь выводят предупреждение об устаревании.
• Прямая таблица замен на строковые алгоритмы для hash().
• Инструменты для автоматической миграции: PHPStan, Rector.

Пора обновлять код, пока изменения не стали критичными.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Hash #MHash #Deprecated
  • 👍 2
Post #1658 321
🚀 PHP 8.5: Вывод из обработчиков буфера вывода объявлен устаревшим

Начиная с PHP 8.5 вывод из обработчиков буфера вывода объявлен устаревшим. При обнаружении вывода из обработчика PHP сгенерирует предупреждение E_DEPRECATED, хотя сам вывод по-прежнему будет подавлен. В PHP 9.0 это приведёт к фатальной ошибке (Fatal Error), что прервёт выполнение скрипта.

Что делать?

✅ Проверить все обработчики на наличие echo, print или `include`содержащих вывод
✅ Весь вывод формировать через возвращаемую строку
✅ При необходимости использовать внутреннюю буферизацию (ob_start внутри обработчика)

Подробное руководство по аудиту и рефакторингу с живыми примерами — в статье.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Deprecated
  • ❤ 1
  • 👍 1
Post #1657 276
🚀 PHP 8.5: Функция socket_set_timeout объявлена устаревшей

В PHP 8.5 функция socket_set_timeout официально объявлена устаревшей (deprecated).

Не волнуйтесь, замена простая и прямая — используйте stream_set_timeout. Параметры и поведение идентичны, обратная совместимость полная.

Что нужно сделать?
✅ Найти в коде все socket_set_timeout (через grep или IDE)
✅ Заменить на stream_set_timeout
✅ Избавиться от будущих предупреждений

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Deprecated
Post #1656 291
🚀 PHP 8.5: Функция xml_parser_free объявлена устаревшей

С выходом PHP 8.5 ещё один устаревший элемент покидает язык — функция xml_parser_free() теперь помечена как deprecated. Это логичное продолжение перехода от ресурсов к объектам, начатого в PHP 8.0, где XML-парсер стал объектом и не требует ручного освобождения.

В статье разбирается:

✅ Почему функция перестала быть нужной
✅ Как правильно удалить её вызовы без нарушения обратной совместимости
✅ Какие альтернативные подходы использовать в legacy-проектах

Если вы работаете с XML-парсингом в PHP, рекомендуем ознакомиться с материалом для обновления вашего кодовой базы.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #XMLParser
Post #1655 302
🚀 PHP 8.5: `curl_close()` и `curl_share_close()` объявлены устаревшими

Если ваши логи в PHP 8.5 заполонили предупреждения об устаревании curl_close() — не игнорируйте их. Это не просто формальность. Эти функции стали полностью бесполезными ещё с PHP 8.0, и их вызов теперь — лишь шум в логах.

Всё потому, что в PHP 8.0 cURL-дескрипторы превратились в полноценные объекты, которыми теперь управляет сборщик мусора. А в PHP 8.5 от этих пустых функций-«пустышек» окончательно решили избавиться.

📌 Что нужно знать:
✅ Замените curl_close() на unset($ch)
✅ Для совместимости с PHP < 8.0 используйте условные проверки
✅curl_multi_close() остаётся рабочей

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #cURL
Post #1654 297
🔄 Обновлена статья по работе с NULL в SQL!

Актуализирован материал, посвящённый работе с NULL в SQL — от основ до продвинутых функций и лучших практик.

✅ Что нового:

✅ Подробнее про COALESCE, IFNULL и NULLIF с примерами
✅ Особенности NULL в JOIN и агрегирующих функциях
✅ Рекомендации по проектированию и оптимизации запросов

🖥 Читать статью

📱 @dev_notes_ru

#SQL #NULL #COALESCE
  • 👍 6
Post #1653 423
‼️ PHP 8.5: Функция mysqli_execute объявлена устаревшей

В PHP 8.5 функция mysqli_execute объявлена устаревшей. Узнайте, как правильно заменить её на mysqli_stmt_execute и обеспечить совместимость кода с будущими версиями PHP.

Что делать?

✅ Заменить на mysqli_stmt_execute — обратно совместимо
✅ Или использовать mysqli_execute_query для PHP 8.2+

В статье:

✅ Причины объявления mysqli_execute устаревшей
✅ Конкретные примеры замены кода
✅ Пошаговый план миграции
✅ Ответы на частые вопросы

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Deprecated #Deprecation
Post #1652 350
‼️ PHP 8.5: Отказ от устаревших приведений типов (boolean, double, integer, binary)

В PHP 8.5 типы (boolean), (double), (integer) и (binary) объявлены устаревшими: при использовании этих типов теперь выводятся предупреждения E_DEPRECATED. Эти альтернативные имена использовались параллельно с каноническими (bool), (float), (int) и (string), но в PHP 9.0 они будут удалены. Рассмотрим, почему принято такое решение, как это затронет ваш код и как подготовиться к переходу.

Пример проблемного кода:
<?php

function test(integer $value): double {}
// Warning: "double" will be interpreted as a class name...


🛠 С PHP 8.5 нужно обновить код:
(integer) → (int)
(double) → (float)
(boolean) → (bool)
(binary) → (string)

Иначе будут предупреждения E_DEPRECATED, а в PHP 9.0 — ошибки!

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Deprecated #Deprecation
  • 🔥 1
Post #1651 314
⚙️ PHP 8.5: Новая константа PHP_BUILD_DATE

В PHP 8.5 появилась константа PHP_BUILD_DATE, которая хранит дату и время сборки PHP-бинарного файла. Ранее эту информацию можно было получить только через phpinfo(), что было неудобно из-за необходимости парсить вывод функции. Теперь данные доступны напрямую в удобном формате.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85
Post #1650 323
⚙️ PHP 8.5: Новая константа PHP_BUILD_PROVIDER

Раньше, чтобы узнать, кто собрал ваш PHP (например, Debian или Ubuntu), нужно было вызывать phpinfo(). В PHP 8.5 это можно сделать прямо из кода.

Новая глобальная константа PHP_BUILD_PROVIDER получает значение, заданное при сборке PHP. Это открывает возможности для:
✅ Контроля версий и окружений
✅ Точечной отладки проблем
✅ Логирования информации о среде

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85
  • 🔥 2
Post #1649 328
PHP 8.5: Новые функции get_exception_handler и get_error_handler

PHP 8.5 добавил две полезные функции, которых не хватало годами: get_error_handler() и get_exception_handler(). Раньше приходилось временно ставить новый обработчик, чтобы узнать текущий. Теперь легко получить текущий обработчик ошибок или исключений — без хаков и костылей.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Error
  • ❤ 2
Post #1648 333
🚀 PHP 8.5: Поддержка трассировки стека для фатальных ошибок PHP

Раньше при фатальных ошибках мы видели только строку сбоя, без понимания полного пути выполнения кода. Теперь PHP показывает полный stack trace, что значительно ускоряет отладку.

📌 Что нового:

✅ Включено по умолчанию (можно отключить через fatal_error_backtraces = Off)
✅ Работает с существующими директивами (display_errors, #[\SensitiveParameter])
✅ Без проблем обратной совместимости

Пример новой трассировки:

Stack trace:
#0 file.php(...): str_repeat('A', 5242880)
#1 file.php(...): my_heavy_function()
#2 {main}


Это особенно удобно при работе с legacy-кодом и сложными цепочками вызовов в современных фреймворках.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #PHP85 #Error
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →