Service Container — это
// bind() — каждый раз создаёт новый экземпляр
app()->bind(PaymentService::class, function ($app) {
return new PaymentService($app->make(HttpClient::class));
});
// singleton() — создаёт один раз, дальше отдаёт тот же объект
app()->singleton(CacheManager::class, function ($app) {
return new CacheManager(config('cache'));
});
🔹 Когда что использовать
→ bind() — если объект
→ singleton() — если объект
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
Оба инструмента для
Gate —
// Определяем в AuthServiceProvider
Gate::define('access-admin-panel', function (User $user) {
return $user->is_admin;
});
// Проверяем
if (Gate::allows('access-admin-panel')) { ... }
// или в контроллере
$this->authorize('access-admin-panel');
Policy —
// php artisan make:policy PostPolicy --model=Post
class PostPolicy
{
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id || $user->is_admin;
}
}
// Использование
$this->authorize('update', $post);
Правило выбора
— Нет модели →
— Есть модель, несколько действий →
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
Оба механизма для организации
Job Chaining — задачи выполняются
Bus::chain([
new ProcessPayment($order),
new SendInvoice($order),
new NotifyWarehouse($order),
])->dispatch();
Job Batching — задачи выполняются
$batch = Bus::batch([
new ImportRow($rows->chunk(100)[0]),
new ImportRow($rows->chunk(100)[1]),
new ImportRow($rows->chunk(100)[2]),
])
->then(fn (Batch $batch) => Log::info('Импорт завершён'))
->catch(fn (Batch $batch, Throwable $e) => Log::error('Ошибка'))
->finally(fn (Batch $batch) => Cache::forget('import-lock'))
->dispatch();
// Можно следить за прогрессом
$batch->progress(); // процент выполнения
Когда что
— Независимые задачи, нужна скорость и прогресс →
— Зависимость между задачами, порядок важен →
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥1
У вас есть два класса:
class A {
public function __construct(private B $b) {}
public function doSomething(): string {
return $this->b->getValue();
}
}
class B {
public function getValue(): string {
return 'real';
}
}Создаём мок через PHPUnit, он реализует интерфейс (или наследует класс) и позволяет изолировать зависимость:
$mockB = $this->createMock(B::class);
$mockB->method('getValue')->willReturn('mocked');
$a = new A($mockB);
$this->assertSame('mocked', $a->doSomething());
Почему работает: createMock() генерирует анонимный класс, расширяющий B. PHP позволяет передать его туда, где ожидается B.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
PHP уничтожает объект, когда его refcount падает до 0. Но есть исключение —
Для этого существует
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2🥱1
В первой части постов навалили жесткой базы, чтобы вправить мозги на место. Во второй дали конкретные инструменты, фреймворки и пошаговые инструкции, что нужно кодить прямо сейчас.
Часть 1. Введение, юзкейсы и реальность
Разбираемся с терминами, снимаем розовые очки и смотрим, где ИИ реально приносит бабки, а где только жжет нервы:
1. «Так что вообще считается AI-агентом?»
2. «Где тут бот, а где уже AI-агент?»
3. «Не надо пихать AI-агента в каждую задачу»
4. «Что уже можно спокойно делать через AI-агентов?»
5. «А что через AI-агентов пока лучше не трогать?»
Часть 2. Изнанка, ошибки и архитектура
Как всё это устроено под капотом, чтобы не слить бюджет и не наломать дров на старте:
6. «Можно ли просто сесть вечером и собрать себе AI-агента?»
7. «С чего вообще начать, если хочется попробовать AI-агентов»
8. «Почему AI-агент может внезапно начать творить дичь»
9. «Где AI-агенты реально экономят время, а где только добавляют возни»
10. «Почему они жрут столько денег?»
Часть 3. Хардкорная практика (Что делать руками)
Хватит теории. Открываем ноут, запускаем Cursor и делаем нормальные, отказоустойчивые системы:
11. «Почему одного промпта мало?»
12. «Почему AI-агенту мало просто “дать доступ к данным”»
13. «Если не следить за AI-агентом, он быстро начинает жить своей жизнью»
14. «Собрать демку легко. Но как же сделать нормально»
15. «Как сделать, чтобы это не развалилось через неделю?»
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
PHP array —
SplFixedArray —
// array: ~400 MB
$arr = array_fill(0, 1_000_000, 0);
// SplFixedArray: ~90 MB
$fixed = new SplFixedArray(1_000_000);
SplDoublyLinkedList / SplStack / SplQueue —
SplMinHeap / SplMaxHeap —
$heap = new SplMinHeap();
$heap->insert(5);
$heap->insert(1);
$heap->insert(3);
// Всегда достаёт минимум за O(log n)
echo $heap->extract(); // 1
echo $heap->extract(); // 3
⚠️ На что обратить внимание на практике
→ SplFixedArray не поддерживает строковые ключи и array_* функции — только числовые индексы
→ В PHP 8.1+ SplFixedArray реализует IteratorAggregate — работает в foreach без обёрток
→ Для задач "top-K элементов" или Dijkstra — SplMinHeap бьёт usort по всем фронтам
→ В большинстве бизнес-задач обычный array быстрее за счёт CPU-кэша — SPL оправдан при сотнях тысяч элементов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2🤔1
Обычная Collection
// ❌ Загрузит ВСЕ записи в память
$users = User::all()->filter(...)->map(...);
// ✅ Lazy Collection — обрабатывает по одной записи через генератор
User::cursor()->filter(function (User $user) {
return $user->is_active;
})->each(function (User $user) {
ProcessUser::dispatch($user);
});
cursor() использует
Lazy Collection из файла:
// Обработка огромного CSV без OutOfMemoryError
$collection = LazyCollection::make(function () {
$handle = fopen('huge_file.csv', 'r');
while ($row = fgetcsv($handle)) {
yield $row;
}
});
$collection->skip(1)->chunk(100)->each(function ($rows) {
ImportBatch::dispatch($rows->toArray());
});
Когда использовать
—
—
Важно: методы типа count() и last() материализуют коллекцию. Их лучше избегать в lazy-контексте.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
self —
static —
class A {
public static function create(): static {
return new static(); // вернёт экземпляр B, если вызвано из B
}
}
class B extends A {}
B::create(); // → объект B, не APlease open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥2
WeakReference —
WeakMap (PHP 8.0) —
$map = new WeakMap();
$obj = new stdClass();
$map[$obj] = 'data';
unset($obj);
// запись в $map исчезла сама
Можно применять:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
Три зоны ответственности — три правила:
🔹 БД —
🔹 API —
🔹 Очереди —
Главное:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4❤1
Большой PR — это архитектурная проблема, но раз он уже есть, вот стратегия:
🔹 Начинать не с первого файла в списке, а с
🔹 До открытия первого файла — ответить на три вопроса:
🔹 Тесты читать первыми, т.к. они
🔹 Искать не ошибки, а
🔹 Замечания по стилю без линтера —
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥4👍2
Symfony — это фреймворк, основанный на
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
Осталось всего 4 места на курс по ИИ-агентам. 30 апреля закрываем набор окончательно.
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
🏃♀️ Записаться, пока есть места
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
В Symfony, Bundle — это
Ключевые аспекты
Бандлы предоставляют способ организовать код в логические единицы. Каждый бандл обычно включает:
— Модели/Сущности
— Сервисы
— Конфигурационные файлы
— Шаблоны (файлы Twig)
— Информацию о маршрутах
У Symfony есть богатая экосистема сторонних бандлов, доступных через такие платформы, как Packagist. Эти бандлы можно легко интегрировать в проект для добавления различных функций, таких как
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🔥1
Баг не воспроизводится локально. На проде один юзер видит чужие данные 👇
📦 Задание
Стартап запустил SaaS. Первые две недели тишина. А потом в поддержку прилетело: «Я зашёл в кабинет и увидел чужой аккаунт». В коде сессий и авторизации не трогали давно, там всё стабильно.
// src/Auth/UserSession.php
class UserSession
{
private static ?User $currentUser = null;
public static function set(User $user): void
{
self::$currentUser = $user;
}
public static function get(): ?User
{
return self::$currentUser;
}
public static function clear(): void
{
self::$currentUser = null;
}
}
// src/Middleware/AuthMiddleware.php
class AuthMiddleware
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly JWTService $jwt,
) {}
public function handle(Request $request, callable $next): Response
{
$token = $request->headers->get('Authorization');
if (!$token) {
return new Response(status: 401);
}
$payload = $this->jwt->decode(str_replace('Bearer ', '', $token));
$user = $this->userRepository->find($payload['sub']);
UserSession::set($user);
return $next($request);
}
}
// src/Controller/DashboardController.php
class DashboardController
{
public function index(): Response
{
$user = UserSession::get();
return new Response(
body: $this->renderDashboard($user),
);
}
}
// src/Console/CacheWarmupCommand.php
class CacheWarmupCommand
{
public function execute(): void
{
$users = $this->userRepository->findAll();
foreach ($users as $user) {
UserSession::set($user);
$this->warmupForUser($user);
}
// прогрев завершён
}
}
🔹 Задачи
— Объяснить механизм утечки
— Объяснить, как CacheWarmupCommand триггерит баг и при каком race window
— Переписать UserSession так, чтобы устранить проблему архитектурно, а не патчем
Ставьте → 🔥 если нравится формат. Если нет → 🌚
💬 Решения пишите в комменты под спойлер — сравним подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤔5🌚2👍1🥱1
Strategy — это
Когда использовать:
—
—
—
Преимущества:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
Singleton — это
🔹 Основные характеристики:
—
—
—
🔹 Когда использовать:
—
—
—
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥3❤1👍1
Adapter (Адаптер) — это
🔹 Когда использовать:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1🔥1
Factory Method —
🔹 Когда использовать:
🔹 Как работает:
🔹 Плюсы:
—
—
—
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🔥1👏1