PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

AI workflow 2026 – 2 lata później, co działa, co nie, Claude 200k w praktyce

by Henryk Tews / wtorek, 21 kwietnia 2026 / Opublikowano w PHP

W 2024 napisałem pierwszy wpis o AI w pracy PHP developera. Minęły dwa lata i obraz zmienił się radykalnie. Nie chodzi już o pytanie „czy używać AI” – chodzi o to jak wbudować narzędzia w workflow żeby nie traciły czasu a go oszczędzały. Po dwóch latach codziennego użycia mam precyzyjny obraz co działa, co nie działa i jak zorganizować pracę żeby wyciągnąć maksimum bez polegania na narzędziu więcej niż powinno.

Stack AI tools w 2026 – co zostało, co odpadło

Narzędzie Status 2024 Status 2026 Powód zmiany
GitHub Copilot Eksperyment Codziennie Nowy model znacznie lepszy przy PHP 8.x i Magento patterns
ChatGPT Regularnie Rzadko Zastąpiony przez Claude z dłuższym kontekstem
Claude Regularnie Codziennie (główne narzędzie) 200k tokenów – cały moduł Magento do kontekstu
Cursor IDE Beta test Projekt po projekcie Refaktoring z kontekstem projektu jest realnie użyteczny
Ollama (lokalne) Eksperyment Dla klientów z wymogami NDA DeepSeek V3 lokalnie dorównuje GPT-4o sprzed roku

Codzienny workflow – szczegółowo

# Typowy dzień - kiedy sięgam po AI

# 1. Implementacja nowej funkcjonalności
#    Copilot w IDE przez cały czas
#    Claude przy projektowaniu API/interfejsów

# 2. Code review (własnego kodu przed PR)
#    diff | claude "review this PHP Magento 2 code for:
#    - type safety issues
#    - missing null checks
#    - Magento 2 anti-patterns (direct model usage, no page size limit)
#    - missing tests for edge cases"

# 3. Debugowanie
#    Stack trace + kontekst -> Claude
#    "Mam ten błąd w Magento 2 przy składaniu zamówienia z MSI.
#     Oto stack trace [...]
#     Oto kod pluginu [...].
#     Co może powodować ten błąd?"

# 4. Pisanie testów
#    "Napisz testy PHPUnit dla tej klasy.
#     Pokryj happy path i następujące edge cases: [lista]"

# 5. Dokumentacja / PHPDoc
#    Copilot Chat lub Claude
#    "Napisz kompletny PHPDoc dla tej metody"

Gdzie Claude 200k kontekstu zmienia grę

<?php

// Przykład promptu który nie był możliwy 2 lata temu przez limit tokenów

/*
Prompt do Claude (rzeczywisty, skrócony):

"Mam moduł Magento 2 do integracji z systemem ERP.
Wklejam wszystkie klasy modułu (12 plików, ~1500 linii).

[...całe 12 plików kodu...]

Pytania:
1. Gdzie w tym kodzie może być problem z N+1 queries?
2. Czy jest coś co narusza Magento 2 service contracts?
3. Jakie edge cases nie są pokryte przez testy?
4. Jak zrefaktorować ErpSyncService żeby lepiej obsługiwał błędy?
"

Odpowiedź Claude (fragment):
- "W linii 147 ErpProductMapper::mapAttributes() iterujesz po $product->getAttributes()
  i dla każdego atrybutu wywołujesz $this->attributeRepository->get($code).
  To klasyczny N+1 – załaduj wszystkie atrybuty z kolekcją przed pętlą."
- "W OrderService::createErpOrder() nie używasz OrderRepositoryInterface::save()
  ale bezpośrednio $order->save() – omijasz pluginy i service contracts."
- "Brakuje testów dla przypadku gdy ERP API zwraca HTTP 429 (rate limiting)"
*/

// Stary workflow (bez dużego kontekstu):
// Kopiuj-wklej jedną klasę -> pytaj -> zmień kontekst -> kopiuj-wklej następną
// = 45 minut analizy

// Nowy workflow (z 200k tokenów):
// Wklej wszystko raz -> kompletna analiza całego modułu
// = 5 minut

AI do generowania testów – mój aktualny flow

<?php

declare(strict_types=1);

// Klasa do przetestowania
class PriceRuleService
{
    public function __construct(
        private CustomerGroupRepository $groupRepo,
        private ProductRepository $productRepo
    ) {}

    public function getCustomerPrice(int $productId, int $customerId): float
    {
        $product = $this->productRepo->getById($productId);
        $group   = $this->groupRepo->getByCustomerId($customerId);

        $basePrice = $product->getPrice();

        $discount = match($group->getCode()) {
            'vip'       => 0.20,
            'wholesale' => 0.15,
            'loyal'     => 0.05,
            default     => 0.0,
        };

        $finalPrice = $basePrice * (1 - $discount);

        // Minimum price floor
        return max($finalPrice, $product->getMinAllowedPrice() ?? 0.0);
    }
}

// Prompt do Claude:
// "Napisz kompletne testy PHPUnit dla PriceRuleService.
//  Pokryj wszystkie grupy klientów, edge case z minimum price,
//  i przypadek gdy produkt lub klient nie istnieje (rzuca wyjątek).
//  Użyj MockObject do mockowania zależności."
<?php

// Wygenerowane przez Claude - lekko zedytowane
declare(strict_types=1);

class PriceRuleServiceTest extends TestCase
{
    private MockObject $groupRepo;
    private MockObject $productRepo;
    private PriceRuleService $service;

    protected function setUp(): void
    {
        $this->groupRepo   = $this->createMock(CustomerGroupRepository::class);
        $this->productRepo = $this->createMock(ProductRepository::class);
        $this->service     = new PriceRuleService($this->groupRepo, $this->productRepo);
    }

    /** @dataProvider customerGroupProvider */
    public function testAppliesCorrectDiscount(
        string $group, float $basePrice, float $expected
    ): void {
        $product = $this->createMock(Product::class);
        $product->method('getPrice')->willReturn($basePrice);
        $product->method('getMinAllowedPrice')->willReturn(null);

        $customerGroup = $this->createMock(CustomerGroup::class);
        $customerGroup->method('getCode')->willReturn($group);

        $this->productRepo->method('getById')->willReturn($product);
        $this->groupRepo->method('getByCustomerId')->willReturn($customerGroup);

        $this->assertEqualsWithDelta($expected, $this->service->getCustomerPrice(1, 1), 0.01);
    }

    public static function customerGroupProvider(): array
    {
        return [
            'vip 20% off'        => ['vip',       100.0, 80.0],
            'wholesale 15% off'  => ['wholesale',  100.0, 85.0],
            'loyal 5% off'       => ['loyal',      100.0, 95.0],
            'retail no discount' => ['retail',     100.0, 100.0],
            'unknown no discount'=> ['guest',      100.0, 100.0],
        ];
    }

    public function testRespectsMinimumPriceFloor(): void
    {
        $product = $this->createMock(Product::class);
        $product->method('getPrice')->willReturn(10.0);
        $product->method('getMinAllowedPrice')->willReturn(9.5);

        $group = $this->createMock(CustomerGroup::class);
        $group->method('getCode')->willReturn('vip'); // 20% off = 8.0 PLN

        $this->productRepo->method('getById')->willReturn($product);
        $this->groupRepo->method('getByCustomerId')->willReturn($group);

        // Po rabacie 20% = 8.0, ale minimum to 9.5 -> zwróć 9.5
        $this->assertEquals(9.5, $this->service->getCustomerPrice(1, 1));
    }
}

Czego AI NIE robi dobrze – updated 2026

Dwa lata późniejsza, uczciwa lista ograniczeń:

  • Decyzje architektoniczne – AI sugeruje wzorce, ale nie zna Twojego długu technicznego, ograniczeń teamowych i historii projektu. Tu własna głowa jest niezbędna.
  • Specyficzne wersje Magento i moduły zewnętrzne – Claude i Copilot nie wiedzą że Twój vendor X zrobił breaking change w wersji 3.2.1. Knowledge cutoff jest realnym ograniczeniem.
  • Złożone problemy z cache Magento – „Dlaczego FPC nie cachuje tej strony dla zalogowanych” wymaga znajomości całego stosu, nie tylko kodu.
  • Security audit – AI wskazuje oczywiste problemy (SQL injection, brak sanityzacji), ale subtelne podatności w logice biznesowej wymagają ludzkiego oczu.
  • Performance profiling – Blackfire i EXPLAIN muszą być interpretowane przez człowieka który rozumie kontekst projektu.

Prompt engineering dla PHP developera – co działa

# Efektywne prompty dla PHP/Magento 2 kodu

# Dobry:
"Mam klasę Magento 2 która pobiera produkty przez Service Contracts.
Kod: [...]
PHPStan level 8 raportuje błąd: [...]
Jak naprawić zachowując kompatybilność z PHP 8.4?"

# Zły:
"Napraw ten kod PHP"  # zbyt mało kontekstu

# Dobry:
"Napisz testy PHPUnit dla metody XYZ.
Pokryj przypadki:
- happy path z poprawnym wejściem
- null jako parametr opcjonalny
- wyjątek gdy produkt nie istnieje
Użyj MockObject dla zależności, nie twórz prawdziwych obiektów Magento."

# Zły:
"Napisz testy" # bez specyfikacji co testować

# Dobry przy code review:
"Przejrzyj ten plugin Magento 2 pod kątem:
1. Czy around plugin jest niezbędny czy wystarczy before/after?
2. Czy są potencjalne problemy z wydajnością?
3. Czy obsługa błędów jest kompletna?
Wersja Magento: 2.4.8, PHP 8.4"

# Szablon który używam przy większości code review:
"Magento 2.4.8, PHP 8.5
Kontekst: [opis co moduł robi]
Kod: [...]
Sprawdź:
- Typowanie i null safety
- Service Contracts (Repository zamiast Model)
- Potencjalne N+1 queries
- Missing edge cases w testach"

Podsumowanie

Dwa lata z AI tools dały mi klarowny obraz: to nie jest narzędzie które zastępuje wiedzę, to narzędzie które amplifikuje prędkość pracy osoby z wiedzą. Mój junior who-knows-the-patterns stał się szybszym senior-with-AI. Kluczowe zasady 2026: Claude z dużym kontekstem do analizy całego modułu, Copilot inline do boilerplate, lokalne modele (Ollama) dla kodu NDA, zawsze weryfikuj każdą sugestię przez własne rozumienie. Czas zaoszczędzony na mechanicznych zadaniach idzie na architekturę i debugging – obszary gdzie wiedza domenowa wciąż dominuje.

About Henryk Tews

Co możesz przeczytać następne

PHP 8.4 ostatnie RC – Lazy Objects, BcMath\Number, Dom\HTMLDocument
WooCommerce vs Magento 2 – architektura, hooks vs DI, kiedy który
PHP 8.3 preview – typed constants, json_validate(), array_find(), clone with
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}