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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
🧠 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
👍13😁4
💥 Именованные аргументы вместо загадочных 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
🥱16👍13
📍 Laravel Telescope 5.24: отладка прямо из Artisan

В новой версии Telescope искать и разбирать записи можно без открытия dashboard.

➡️ Появились две команды:


php artisan telescope:list request
php artisan telescope:show latest:request


➡️ list показывает последние записи Telescope. Можно фильтровать их по типу, тегу, batch ID и другим параметрам:


php artisan telescope:list exception --limit=5
php artisan telescope:list request --tag=Auth:42
php artisan telescope:list --batch=79a09461


➡️ show раскрывает конкретную запись и связанные с ней события: queries, cache operations, logs, exceptions и т. д.


php artisan telescope:show latest:exception
Для скриптов и coding agents есть --json:
php artisan telescope:show latest:exception --json


А --full отключает сокращение длинных SQL, сообщений и payload’ов.

💡 Особенно удобно для отладки в терминале: нашёл проблемный request → посмотрел его batch → увидел медленный query или exception, не переключаясь между CLI и браузером.

В 5.24 также исправили stale-запросы dashboard: при навигации старый polling-запрос больше не должен перезаписывать уже открытый экран.

🔗 Источник

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2👍1
🌞 Готовим вебинар про AI в разработке и хотим сделать его максимально полезным

Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?


🤩 Пишите вопросы в комментариях — самые залайканные разберём на вебинаре в первую очередь.

Задавайте всё, что давно хотелось спросить 📍

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🔐 Sqids в Laravel: короткие публичные ID

Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.

Sqids превращают их в короткие строки:


637 → 4nxk2a


При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.

В статье показано, как встроить Sqids в:

🟡 route model binding;
🟡 API Resources;
🟡 foreign keys;
🟡 входящие запросы.

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

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
3😢1
This media is not supported in your browser
VIEW IN TELEGRAM
🌸 Вселенная намекает: пора уже начать этот курс

С 14 сентября цены в Proglib Academy вырастут на 20% 👀

Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏

📍 Выбрать курс
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5🌚3
🌞 PayZephyr: единый API для платежей в Laravel

Stripe, PayPal, Paystack и другие платёжные системы — через один интерфейс. PayZephyr объединяет работу с 8 провайдерами и предлагает:

— единый API для платежей;
— переключение между провайдерами и failover;
— защиту от повторного списания;
— проверку подписей вебхуков;
— возвраты и подписки.


🔘 Пример:

Payment::amount(100)
->currency('USD')
->pay();


🔘 Возврат:


Payment::refund($paymentId);


🔘 Установка:

composer require payzephyr/laravel


📌 Подойдёт, если приложение работает с несколькими платёжными системами и хочется не писать отдельную интеграцию для каждой.

🔗GitHub

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍3
😭 Как не потратить недельный лимит AI-кодинга за три дня?

Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.

🔘 Поговорим о том:

— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре.

🔗 Зарегистрироваться на вебинар⁠
Please open Telegram to view this post
VIEW IN TELEGRAM
1🥱1
💰 Версионирование бизнес-правил в Laravel

Бизнес-правила меняются, но старые решения должны оставаться объяснимыми. Например, цена для одного и того же автомобиля может отличаться в зависимости от даты счёта.

Пакет Laravel Rulebook помогает:

🤩 хранить правила в отдельных PHP-классах;
🤩 задавать периоды действия;
🤩 выбирать правило по приоритету;
🤩 объяснять, почему оно победило;
🤩 сохранять результат решения в snapshot.


Пример:


$decision = $rulebook->resolveAt(
subject: $vehicle,
at: $invoice->issued_at,
context: $pricingContext,
);
$price = $decision->outcome();
$reason = $decision->winningResult()->reason();


Подходит для pricing, billing, eligibility и других сценариев, где важна история решений.

🔗 ⁠Laravel Rulebook на Packagist

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73
⚡️ Symfony 8.2: команды Console теперь можно вызывать через пробелы

В Symfony команды обычно записываются через ::


php bin/console tenant:users:import customers.csv


➡️ В Symfony 8.2 появился альтернативный синтаксис:


php bin/console tenant users import customers.csv


Оба варианта запускают одну и ту же команду.

Главное отличие — в spaced-синтаксисе каждый уровень может обрабатывать собственные опции:


php bin/console tenant --name=acme users import customers.csv --dry-run


Здесь:

🔘 tenant получает опцию --name;
🔘 users — промежуточный уровень;
🔘 import запускает конечную команду;
🔘 --dry-run передаётся последней команде.


Для доступа к параметрам родительских команд появился CommandChain:


public function __invoke(
CommandChain $chain,
#[Argument] string $file,
): int {
$tenantName = $chain
->getInput('tenant')
?->getOption('name');

// ...
}


Также Symfony 8.2 позволяет описывать целые группы команд в одном классе через #[AsCommand].

📌 Особенно полезно для CLI-приложений с многоуровневой структурой — например, docker compose, git или административных инструментов.

🔗Читать подробнее

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😢2
🛠 `str_contains` и семья: проверяем строки без ловушек

Проверка через strpos годами путала новичков:


if (strpos($url, 'https') !== false) {
// ...
}


➡️ Почему нужен именно `!== false`?
Потому что совпадение в начале строки возвращает позицию 0, а 0 в PHP может трактоваться как false.

С PHP 8.0 есть три функции, которые сразу возвращают `bool`:


str_contains($email, '@'); // содержит подстроку
str_starts_with($url, 'https://'); // начинается с
str_ends_with($file, '.pdf'); // заканчивается на


Код читается проще — без проверки позиции и !== false.

📌 strpos всё ещё нужен, если требуется узнать позицию совпадения.

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