Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.5K subscribers
1.75K photos
30 videos
29 files
4.56K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/M561SQ

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
💡 Laravel tip: filled() для проверки входных данных

В Laravel не всегда нужно отдельно проверять наличие поля и его значение.

🈶 Если нужно понять, что параметр передан и не является пустым, есть filled():


if ($request->filled('email')) {
// ...
}


В отличие от has(), здесь проверяется не только наличие ключа, но и то, что значение не является blank. При этом 0 и false считаются заполненными.

📌 Удобный маленький метод, который убирает лишние проверки из условной логики.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
5🥱4
Итоги недели 🙂

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18💯32👍1🌚1
🤔 PHP tip: когда ?? лучше, чем isset()

Если нужно взять значение и подставить запасное, необязательно сначала проверять isset():


$name = isset($request['name'])
? $request['name']
: 'Guest’;


🔵 В PHP есть оператор null coalescing:


$name = $request['name'] ?? 'Guest’;


Он вернёт 'Guest', если значение отсутствует или равно null.

🔵 При этом false, 0 и '' считаются значениями и не заменяются:


$value = 0 ?? 100; // 0


📌 Простое правило:

?? → «возьми значение, а если его нет — используй это».
isset() → «проверь, существует ли значение и не null ли оно».

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
php roadmap 2026.pdf
328.6 KB
С чего начать изучение PHP и куда двигаться дальше? Собрали путь от базового синтаксиса до уровня, где в дело уже входят Laravel/Symfony, тестирование, PHPStan, профилирование, кеширование и PHP-FPM.

Сохраняйте roadmap, чтобы не потеряться в огромном экосистемном дереве PHP 🔖

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🤩 Вы кешируете запросы в Redis, но забыли про OPcache?

PHP компилирует каждый .php-файл в байткод при каждом запросе — если не настроен OPcache. Это означает лишние CPU-циклы на парсинг даже самого тривиального хелпера.

Минимальный конфиг для прода:


; включаем
opcache.enable=1
opcache.enable_cli=1

; кол-во кешируемых файлов (>= числа файлов в проекте)
opcache.max_accelerated_files=20000

; размер разделяемой памяти (MB)
opcache.memory_consumption=256

; кешируем строки — экономим RAM
opcache.interned_strings_buffer=16

; в продакшне: 0 (не проверять изменения файлов)
opcache.validate_timestamps=0


📍 Почему validate\_timestamps=0 в проде?

При каждом запросе PHP проверяет mtime файла на диске. На высоких RPS — это сотни лишних stat()-syscall'ов в секунду. Инвалидируйте кеш вручную через opcache_reset() или перезапуск PHP-FPM при деплое.

💡 Хотите проверить, что лежит в кеше и сколько памяти занято? Используйте opcache_get_status() — или поставьте opcache-gui для визуального мониторинга.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤩 Ленивая инициализация без proxy-хаков

В PHP 8.4 ленивые объекты появились прямо в движке. Это особенно полезно для ORM, DI-контейнеров и объектов, создание которых может быть дорогим.

Создать lazy ghost можно через Reflection:


$reflector = new ReflectionClass(Order::class);

$order = $reflector->newLazyGhost(
function (Order $order): void {
$order->__construct(loadFromDb());
}
);


На этом этапе конструктор ещё не выполнялся. Когда объекту понадобится состояние, PHP вызовет initializer и объект инициализируется.

Есть и второй вариант — newLazyProxy(): он при инициализации создаёт реальный объект и проксирует дальнейшие обращения к нему.


📌 Тяжёлая работа выполняется только когда объект действительно понадобится. Это может быть полезно для ленивой загрузки данных или зависимостей.

И важный момент: lazy objects не означают автоматическое ускорение всего приложения. Если объект в итоге всегда используется, выигрыш от откладывания инициализации может быть минимальным.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
🐘 PHP 8.6 Beta 2 — завтра. Что делать с бетой?

13 августа вышла Beta 1, а 27 августа запланирована Beta 2. Дальше по календарю: Beta 3 — 10 сентября, RC1 — 24 сентября и GA — 19 ноября.

Новые RFC для 8.6 уже не проходят — сейчас фокус смещается на совместимость, регрессии и баги.

➡️ Если поддерживаете библиотеку, фреймворк, CMS или расширение, самое время прогнать тесты на PHP 8.6.

Обычному приложению необязательно переходить на бету в проде. А вот отдельный CI-job с beta-версией может заранее показать, где релиз что-то сломал.

🤩 Источник

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
🤩 PhpStorm + Laravel: меньше прыжков между окнами

В PhpStorm появился отдельный Laravel Tool Window, который собирает несколько вещей, ради которых раньше приходилось открывать терминал, логи и браузер.

🤩 запуск Artisan-команд прямо из IDE
🤩 просмотр локальных и Sentry-логов
🤩 разбор ошибок с AI
🤩 управление Laravel Cloud deployments и env-переменными

🤩 Особенно интересен сценарий с ошибкой: открыл лог → нашёл exception → разобрал его через AI, не копируя stack trace вручную.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
11😁4🥱1
🤩 webmozart/assert: guard-условия без простыней if/throw

Вместо:


if (!is_string($name) || $name === '') {
throw new InvalidArgumentException(
'Name must be a non-empty string'
);
}


можно написать:


use Webmozart\Assert\Assert;

Assert::stringNotEmpty($name);
Assert::email($email);
Assert::range($age, 18, 99);
Assert::allInstanceOf(User::class, $users);


🤩 Библиотека берёт на себя проверку условия и выбрасывает исключение с понятным сообщением, если оно нарушено. Особенно удобно использовать такие проверки на границах приложения — например, в конструкторах Value Object или сервисов.

Установка:


composer require webmozart/assert


📌 В итоге вместо десятков однотипных if/throw получаем компактные и единообразные guard-условия.

🔗 Документация

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
🤩 5 PHP-приёмов, которые стоит держать в арсенале

Без библиотек — всё уже есть в языке:


// Быстро собрать список/словарь
$emails = array_column($users, 'email');
$map = array_column($users, 'email', 'id');

// Присвоить только если значения ещё нет
$config['timeout'] ??= 30;

// Объединить массивы с переопределением
$query = [...$defaults, 'limit' => 50];

// Проверить, является ли массив списком
array_is_list([1, 2, 3]); // true

// Передать метод напрямую как callable
$ids = array_map(User::getId(...), $users);


Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
🤖 PhpStorm научился управлять skills для coding agents

Вместо того чтобы каждый раз объяснять AI-агенту правила проекта, фреймворка и инструменты, skills можно установить и хранить как переиспользуемые инструкции.

В PhpStorm 2026.2 появился отдельный Skills Manager:

🤩 устанавливать skills из каталога
🤩 подключать внешние registry, включая GitHub
🤩 импортировать skills из Claude Code и Codex
🤩 управлять ими прямо из IDE

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

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101🥱1
🤩 symfony/uid: UUIDv7 вместо автоинкремента

Автоинкремент удобен, но плохо подходит для распределённых систем. UUIDv4 решает проблему уникальности, зато случайные значения могут хуже работать с B-tree индексами.

🔘 UUIDv7 — компромисс: содержит timestamp и случайную часть, поэтому идентификаторы генерируются примерно в хронологическом порядке.


use Symfony\Component\Uid\Uuid;

$id = Uuid::v7();

echo $id->toRfc4122();
// 0192f8a1-...

echo $id->getDateTime();
// время, закодированное в UUID


🔘 А если нужен более компактный идентификатор для URL:


$id->toBase58();


🔘 Symfony UID можно использовать отдельно от Symfony:


composer require symfony/uid


Особенно интересно для распределённых сервисов, где ID нужно генерировать независимо от БД.

📍 Ссылка на документацию

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
10
🤩 Wave — стартер-пак для разработки SaaS-приложений

Библиотека написана на Laravel и включает все необходимое:

— аутентификация,
— профили пользователей,
— биллинг,
— подписка,
— роли и права доступа,
— уведомления и административная панель.


Инструмент упрощает создание SaaS-приложений, предоставляя необходимые базовые компоненты и гибкие возможности для дальнейшей настройки

🔗 GitHub

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102😁1
🧬 Вы кешируете запросы в Redis, но забыли про OPcache?

PHP компилирует каждый .php-файл в байткод при каждом запросе — если не настроен OPcache. Это означает лишние CPU-циклы на парсинг даже самого тривиального хелпера.

🟡 Минимальный конфиг для прода:


; включаем
opcache.enable=1
opcache.enable_cli=1

; кол-во кешируемых файлов (>= числа файлов в проекте)
opcache.max_accelerated_files=20000

; размер разделяемой памяти (MB)
opcache.memory_consumption=256

; кешируем строки — экономим RAM
opcache.interned_strings_buffer=16

; в продакшне: 0 (не проверять изменения файлов)
opcache.validate_timestamps=0


Почему validate\_timestamps=0 в проде

При каждом запросе PHP проверяет mtime файла на диске. На высоких RPS — это сотни лишних stat()-syscall'ов в секунду. Инвалидируйте кеш вручную через opcache_reset() или перезапуск PHP-FPM при деплое.

💡 Хотите проверить, что лежит в кеше и сколько памяти занято? Используйте opcache_get_status() — или поставьте opcache-gui для визуального мониторинга.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
🔎 Как быстро увидеть, что вы изменили в php.ini

В PHP 8.5 появилась малоизвестная CLI-опция:


php --ini=diff


Она показывает только настройки, которые отличаются от стандартной конфигурации PHP.

Полезно, когда нужно:

— разобраться, чем production отличается от дефолта;
— проверить Docker-образ;
— перенести конфигурацию на новый сервер.

Особенно удобно вместо ручного сравнения огромного php.ini.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3
🤩 PHP и атрибуты: #[Override]

В PHP 8.3 появился атрибут #[Override], который помогает ловить ошибки при переопределении методов.

Если метода find() нет в родительском классе или интерфейсе, PHP сообщит об ошибке.


Полезно при рефакторинге: переименовал метод в базовом классе — наследники не останутся с «тихо сломанным» override.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🧠 spatie/laravel-data: типизированные DTO для Laravel

Вместо массивов вроде:


$email = $data['email'];
$quantity = $data['quantity’];


🔘 можно описать структуру данных отдельным классом:


class OrderData extends Data
{
public function __construct(
public string $email,
public int $quantity,
public ?string $promoCode = null,
) {}
}


🔘 И создать объект из входных данных:


$order = OrderData::from($request->all());

echo $order->email;


Дальше работают обычные типы PHP и автодополнение IDE, а laravel-data добавляет маппинг, валидацию, вложенные DTO и преобразование обратно в массив или JSON.

Удобный вариант, когда DTO в Laravel становится больше, чем просто набором полей.

🔗 ⁠Документация

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁3
💥 Именованные аргументы вместо загадочных true/false

Такой вызов приходится расшифровывать:


createUser('Аня', true, false, true);


🔴 Что означает каждый bool?

С PHP 8.0 можно передать аргументы по имени:


createUser(
name: 'Аня',
isAdmin: true,
sendEmail: false,
verified: true,
);


Сигнатуру метода менять не нужно — именованные аргументы работают прямо с существующими параметрами.

🔴 А ещё можно пропускать необязательные параметры и передавать только нужные:


createUser(
name: 'Аня',
verified: true,
);


Никаких зависимостей — просто вызов, который сам объясняет, что именно происходит.

🔗 PHP Docs — Named Arguments

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱12👍9