Вместо массивов вроде:
$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
Такой вызов приходится расшифровывать:
createUser('Аня', true, false, true);
С PHP 8.0 можно передать аргументы по имени:
createUser(
name: 'Аня',
isAdmin: true,
sendEmail: false,
verified: true,
);
Сигнатуру метода менять не нужно — именованные аргументы работают прямо с существующими параметрами.
createUser(
name: 'Аня',
verified: true,
);
Никаких зависимостей — просто вызов, который сам объясняет, что именно происходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱16👍13
В новой версии Telescope искать и разбирать записи можно без открытия dashboard.
php artisan telescope:list request
php artisan telescope:show latest:request
php artisan telescope:list exception --limit=5
php artisan telescope:list request --tag=Auth:42
php artisan telescope:list --batch=79a09461
php artisan telescope:show latest:exception
Для скриптов и coding agents есть --json:
php artisan telescope:show latest:exception --json
А --full отключает сокращение длинных SQL, сообщений и payload’ов.
В 5.24 также исправили stale-запросы dashboard: при навигации старый polling-запрос больше не должен перезаписывать уже открытый экран.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥2👍1
Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?
Задавайте всё, что давно хотелось спросить
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🔐 Sqids в Laravel: короткие публичные ID
Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.
Sqids превращают их в короткие строки:
При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.
В статье показано, как встроить Sqids в:
🟡 route model binding;
🟡 API Resources;
🟡 foreign keys;
🟡 входящие запросы.
🔗 Документация
🐸 Библиотека пхпшника
Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.
Sqids превращают их в короткие строки:
637 → 4nxk2a
При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.
В статье показано, как встроить Sqids в:
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 вырастут
Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5🌚3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6💯4😁3
Stripe, PayPal, Paystack и другие платёжные системы — через один интерфейс. PayZephyr объединяет работу с 8 провайдерами и предлагает:
— единый API для платежей;
— переключение между провайдерами и failover;
— защиту от повторного списания;
— проверку подписей вебхуков;
— возвраты и подписки.
Payment::amount(100)
->currency('USD')
->pay();
Payment::refund($paymentId);
composer require payzephyr/laravel
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍3
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🥱1
Бизнес-правила меняются, но старые решения должны оставаться объяснимыми. Например, цена для одного и того же автомобиля может отличаться в зависимости от даты счёта.
Пакет 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 и других сценариев, где важна история решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3
В Symfony команды обычно записываются через ::
php bin/console tenant:users:import customers.csv
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
Проверка через
strpos годами путала новичков:
if (strpos($url, 'https') !== 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
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10👍1