Symfony 8: 2026'daki Yeni Ozellikler, PHP 8.4 Lazy Objects ve Mulakat Sorulari

Symfony 8'in yeni ozelliklerini, PHP 8.4 lazy objects entegrasyonunu, cok adimli formlari ve 2026 mulakat sorularini kod ornekleriyle kesfet.

Symfony 8 new features PHP 8.4 lazy objects

Symfony 8, Kasim 2025'te yayinlandi ve PHP ekosisteminde onemli bir donusumu temsil ediyor. Minimum PHP 8.4 gereksinimi ile gelen bu surum, native lazy objects, property hooks ve HTML5 parser gibi dil duzeyindeki yenilikleri framework mimarisine derinlemesine entegre ediyor. FrameworkBundle modularizasyonu, yeni form akis sistemi ve invoke edilebilir komut yapisi, Symfony'nin hem gelistirici deneyimini hem de performansini yeni bir seviyeye tasiyor. Bu makale, Symfony 8'in en kritik ozelliklerini kod ornekleriyle inceliyor ve 2026 yilinda mulakatlarda one cikan konulari ele aliyor.

Symfony 8'e Genel Bakis

Symfony 8, PHP 8.4'un native lazy objects destegiyle proxy kod uretimini ortadan kaldiriyor, AbstractFlowType ile cok adimli form yonetimini kolaylastiriyor, invoke edilebilir komutlarda enum ve MapInput destegi sunuyor, JsonStreamer ve ObjectMapper gibi yeni bilesen tanitiyor ve framework bundle modularizasyonu ile daha hafif uygulama yapilari olusturmayi mumkun kiliyor.

Native Lazy Objects: Proxy Kod Uretiminin Sonu

Symfony'nin dependency injection container'i yillardir proxy siniflar olusturarak lazy loading saglamaktaydi. PHP 8.4'un native lazy objects ozelligi sayesinde bu ara katman tamamen ortadan kalkiyor. #[Lazy] attribute'u ile isaretlenen bir servis, constructor'i yalnizca bir metodu gercekten cagirildiginda calistiriyor. Bu degisiklik hem performans hem de kod temizligi acisindan buyuk bir kazanim sunuyor.

Asagidaki ornekte, HeavyReportGenerator servisi #[Lazy] attribute'u ile isaretlenmis durumda. Container bu servisi olusturdugunda, veritabani baglantisi, PDF motoru ve cache arayuzu gibi agir bagimliliklar hemen yuklenmez; yalnizca generate() metodu cagirildiginda devreye girer:

src/Service/HeavyReportGenerator.phpphp
namespace App\Service;

use Symfony\Component\DependencyInjection\Attribute\Lazy;

#[Lazy]
final readonly class HeavyReportGenerator
{
    public function __construct(
        private DatabaseConnection $db,
        private PdfEngine $pdf,
        private CacheInterface $cache,
    ) {
        // Constructor runs only when a method is actually called
    }

    public function generate(int $reportId): string
    {
        $data = $this->db->fetchReport($reportId);
        return $this->pdf->render($data);
    }
}

Bu yaklasim ozellikle dashboard controller'lari gibi birden fazla agir servisi enjekte eden siniflarda buyuk fark yaratmaktadir. Eger controller'daki her istekte yalnizca belirli servisler kullaniliyorsa, diger servislerin baslatilmasi gereksiz kaynak tuketimine neden olur. #[Autowire(lazy: true)] ile bu sorun controller duzeyinde cozuluyor:

src/Controller/DashboardController.phpphp
namespace App\Controller;

use Symfony\Component\DependencyInjection\Attribute\Autowire;

class DashboardController
{
    public function __construct(
        #[Autowire(lazy: true)]
        private HeavyReportGenerator $reportGenerator,
    ) {}
}

Proxy sinif uretimi yerine PHP 8.4'un ReflectionClass::newLazyProxy() mekanizmasini kullanan bu yaklasim, onceden var/cache dizininde saklanan proxy dosyalarinin gerekliligi ortadan kaldiriyor. Sonuc olarak derleme suresi kisaliyor, hata ayiklama sureci basitlesiyor ve runtime performansi artiyor.

Cok Adimli Formlar: AbstractFlowType ile Yeni Yaklasim

Karmasik kayit surecleri, siparis adimlari veya wizard tarzindaki formlar, Symfony gelisitricilerinin uzun suredir ucuncu parti paketlerle cozdugu bir konuydu. Symfony 8, AbstractFlowType sinifiyla cok adimli form yonetimini cekirdek framework'e tasiyor. Her adim bagimsiz bir form tipi olarak tanimlanirken, DTO uzerinden veri tutarliligi saglanir.

Asagidaki ornekte, uc adimli bir kullanici kayit formu tanimlanmistir. buildFormFlow metodu adimlari siralar ve NavigatorFlowType ile ileri-geri gezinme saglanir:

src/Form/UserSignUpType.phpphp
namespace App\Form;

use Symfony\Component\Form\Flow\AbstractFlowType;
use Symfony\Component\Form\Flow\FormFlowBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserSignUpType extends AbstractFlowType
{
    public function buildFormFlow(FormFlowBuilderInterface $builder, array $options): void
    {
        $builder->addStep('personal', UserPersonalType::class);
        $builder->addStep('professional', UserProfessionalType::class);
        $builder->addStep('account', UserAccountType::class);

        $builder->add('navigator', NavigatorFlowType::class);
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => UserSignUp::class,
            'step_property_path' => 'currentStep',
        ]);
    }
}

Form akisinin veri katmani, validation gruplarini kullanan bir DTO ile yonetilir. Her adimin kendi dogrulama kurallari bulunur ve yalnizca ilgili adim gecildiginde tetiklenir:

src/DTO/UserSignUp.phpphp
namespace App\DTO;

use Symfony\Component\Validator\Constraints as Assert;

class UserSignUp
{
    public function __construct(
        #[Assert\Valid(groups: ['personal'])]
        public Personal $personal = new Personal(),

        #[Assert\Valid(groups: ['professional'])]
        public Professional $professional = new Professional(),

        #[Assert\Valid(groups: ['account'])]
        public Account $account = new Account(),

        public string $currentStep = 'personal',
    ) {}
}

Controller tarafinda ise form akisi olusturma, istek isleme ve tamamlanma kontrolu oldukca yalin bir sekilde gerceklestiriliyor:

src/Controller/SignUpController.phpphp
#[Route('/signup')]
public function __invoke(Request $request): Response
{
    $flow = $this->createForm(UserSignUpType::class, new UserSignUp())
        ->handleRequest($request);

    if ($flow->isSubmitted() && $flow->isValid() && $flow->isFinished()) {
        $this->userService->register($flow->getData());
        return $this->redirectToRoute('app_signup_success');
    }

    return $this->render('signup/flow.html.twig', [
        'form' => $flow->getStepForm(),
    ]);
}

Bu yapinin en buyuk avantaji, adim yonetimi, dogrulama ve veri tasimasi gibi tekrarlayan kodlarin framework tarafindan ele alinmasidir. Gelistirici yalnizca is mantigina odaklanabilir.

Symfony mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Invoke Edilebilir Komutlar ve Input Attribute'leri

Symfony 8'deki konsol bileseni, komut siniflarini buyuk olcude saderlestiriyor. Artik configure() ve execute() metotlari yerine, tek bir __invoke() metodu kullanilabiliyor. Arguman ve opsiyonlar dogrudan PHP attribute'leri ile tanimlanir:

src/Command/CreateUserCommand.phpphp
namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Attribute\Argument;
use Symfony\Component\Console\Attribute\Option;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(
    name: 'app:create-user',
    description: 'Create a new user account',
)]
class CreateUserCommand
{
    public function __invoke(
        SymfonyStyle $io,
        #[Argument(description: 'The username for the new account')]
        string $username,
        #[Argument(description: 'The email address')]
        string $email,
        #[Option(shortcut: 'r', description: 'Role to assign')]
        string $role = 'ROLE_USER',
        #[Option(description: 'Activate immediately')]
        bool $activate = false,
    ): int {
        // User creation logic
        $io->success(sprintf('User "%s" created with role %s.', $username, $role));
        return Command::SUCCESS;
    }
}

Bu yaklasimin bir diger guclu yonu, PHP 8.1 enum tiplerinin dogrudan arguman olarak kabul edilebilmesidir. Gecersiz bir deger girildiginde framework otomatik olarak hata mesaji uretir:

src/Enum/CloudRegion.phpphp
enum CloudRegion: string {
    case UsEast = 'us-east';
    case UsWest = 'us-west';
    case EuWest = 'eu-west';
}

// In the command
public function __invoke(
    SymfonyStyle $io,
    #[Argument] CloudRegion $region,
    #[Option] ?ServerSize $size = null,
): int {
    $io->info(sprintf('Deploying to %s', $region->value));
    return Command::SUCCESS;
}

Cok sayida arguman ve opsiyon iceren komutlar icin #[MapInput] attribute'u ile giris parametreleri ayri bir sinifta gruplanabilir. Bu pattern, komut sinifinin kendisini temiz tutar ve test edilebilirligi arttirir:

src/Command/Input/DeployInput.phpphp
class DeployInput
{
    #[Argument]
    public CloudRegion $region;

    #[Option]
    public string $branch = 'main';

    #[Option(shortcut: 'f')]
    public bool $force = false;
}

// src/Command/DeployCommand.php
#[AsCommand(name: 'app:deploy')]
class DeployCommand
{
    public function __invoke(
        SymfonyStyle $io,
        #[MapInput] DeployInput $input,
    ): int {
        // Access $input->region, $input->branch, $input->force
        return Command::SUCCESS;
    }
}

JsonStreamer, JsonPath ve ObjectMapper Bilesenleri

Symfony 8, JSON isleme konusunda uc yeni bilesen tanitiyor. JsonStreamer, buyuk JSON dosyalarini bellege tamamen yuklemeden parcalar halinde islemeyi saglayan, yuksek performansli bir bilesen olarak one cikiyor. Milyonlarca kayit iceren API yaniti veya veri aktarimi senaryolarinda bellek tuketimini onemli olcude dusuruyor.

JsonPath bileseni, ic ice gecmis JSON yapilarinda belirli degerlere ulasmayi kolaylastiran ifade tabanli bir erisim mekanizmasi sunuyor. JMESPath veya JSONPath standartlarina asina olan gelistiriciler bu bileseni hizla benimseyebilir.

ObjectMapper ise nesneler arasi donusumu attribute tabanli bir yaklasimla gerceklestiriyor. DTO'lar ile entity siniflari arasindaki veri aktarimini, manuel mapping koduna ihtiyac duymadan otomatiklestiriyor. Bu uc bilesen birlikte, Symfony uygulamalarinda veri isleme katmanini buyuk olcude guclandiriyor.

Mulakat Perspektifi

JsonStreamer ve ObjectMapper bilesenleri, 2026 yilinda Symfony mulakat sorulari arasinda siklikla karsimiza cikacak konular arasinda yer aliyor. Adaylarin bu bilesenlerin hangi problemleri cozdugunuaciklayabilmesi ve geleneksel json_decode/json_encode yaklasimina kiyasla avantajlarini ortaya koyabilmesi bekleniyor.

Guvenlik ve Gelistirici Deneyimi Iyilestirmeleri

Symfony 8, guvenlik bileseninde onemli iyilestirmeler sunuyor. Yeni access token authenticator, API tabanli kimlik dogrulama senaryolarini basitlestiriyor. Login throttling mekanizmasi varsayilan olarak etkinlestirilerek brute-force saldirilarina karsi koruma sagliyor. Security bundle'indaki voter sistemi daha esnek hale getirilerek, karmasik yetkilendirme senaryolarinda daha okunabilir kod yazilmasina olanak taniyor.

Gelistirici deneyimi acisindan, Web Profiler yeni panellerle zenginlestirildi. Lazy object kullanim istatistikleri, form akis adimlari ve serializer performans metrikleri artik profiler uzerinden dogrudan izlenebiliyor. Debug toolbar'daki iyilestirmeler, ozellikle dependency injection sorunlarinin tespit edilmesinde zaman kazandiriyor.

Framework bundle modularizasyonu da bu surumun dikkat cekici yeniliklerinden biri. Artik uygulamanin ihtiyac duydugu bilesenler secilerek daha hafif bir yapilandirma olusturulabiliyor. Bu yaklasim, mikro servis mimarisinde veya API-only uygulamalarda gereksiz bagimliliklari ortadan kaldiriyor ve baslatma suresini kisaltiyor.

Yukselme Yolu: Symfony 7'den 8'e

Symfony 8'e gecis, once Symfony 7.4'teki tum deprecation uyarilarinin giderilmesini gerektiriyor. Symfony, ana surumler arasinda geriye donuk uyumlulugu korumaz; ancak 7.4'te deprecated olarak isaretlenen her ozellik, 8.0'da kaldirilan ozelliklerle bire bir eslesir. Bu nedenle oncelikle uygulamanin Symfony 7.4'un en son surumunde sorunsuz calistigindan emin olmak gerekiyor. symfony/deprecation-contract bileseni ile deprecation loglarini izlemek, gecis surecini buyuk olcude kolaylastiriyor.

PHP 8.4 Property Hooks ve Symfony Baglami

PHP 8.4'un property hooks ozelligi, getter ve setter metotlarina olan ihtiyaci azaltiyor. Bu ozellik ozellikle Doctrine entity siniflari ve DTO'larda daha temiz bir API sunuyor. Asagidaki ornekte, Product entity'sinde name property'si otomatik olarak trim ediliyor, price negatif deger kontrolu yapiyor ve priceWithTax hesaplanmis bir deger olarak sunuluyor:

src/Entity/Product.phpphp
class Product
{
    public string $name {
        set(string $value) {
            $this->name = trim($value);
        }
    }

    public float $price {
        set(float $value) {
            if ($value < 0) {
                throw new \InvalidArgumentException('Price cannot be negative');
            }
            $this->price = $value;
        }
    }

    public float $priceWithTax {
        get => $this->price * 1.20;
    }
}

Property hooks, Symfony'nin Serializer, Validator ve Form bilesenleryle uyumlu calisiyor. Dogrulama kisitlamalari property duzeyinde uygulanmaya devam ederken, hooks katmani veri butunlugunu sinif icerisinde garanti altina aliyor. Bu iki katmanli yaklasim, daha saglam ve bakimi kolay entity siniflari olusturmayi mumkun kiliyor.

2026 Mulakatlari Icin Hazirlanmasi Gereken Konular

Symfony 8, teknik mulakatlarda soru yelpazesini onemli olcude genisletiyor. Asagidaki konular, 2026 yilinda adaylarin karsilasabilecegi en kritik alanlar arasinda yer aliyor:

  • Native lazy objects ve performans: #[Lazy] attribute'unun proxy siniflardan farki, kullanim senaryolari ve performans uzerindeki etkisi. PHP 8.4 lazy objects Symfony entegrasyonunun teknik detaylari.
  • Cok adimli form mimarisi: AbstractFlowType kullanimi, validation gruplari ile adim bazli dogrulama ve DTO tasarimi.
  • Invoke edilebilir komutlar: Yeni attribute tabanli komut yapisi, enum destegi ve #[MapInput] ile input siniflarinin kullanimi.
  • Framework bundle modularizasyonu: Uygulamanin ihtiyacina gore bilesen secimi ve bunun mikro servis mimarisindeki onemi.
  • Symfony 8 new features kapsaminda JsonStreamer, ObjectMapper ve JsonPath bilesenlerinin kullanim alanlari.
  • Guvenlik iyilestirmeleri: Access token authenticator, login throttling ve voter sistemi.
  • PHP 8.4 property hooks: Entity ve DTO siniflarinda property hooks kullanimi ile geleneksel getter/setter karsilastirmasi.

Bu konulari derinlemesine calisarak mulakatlara hazirlanmak icin Symfony mimari kaliplari mulakat sorulari modulunu incelemek faydali olacaktir. Ayrica Symfony temelleri ve dependency injection modulleri de temel bilgileri pekistirmek acisindan onemlidir.

Symfony interview questions 2026 arasinda ozellikle lazy objects, form akislari ve yeni bilesen mimarisi konularinin on plana cikacagi ongoruluyor. Bu alanlarda pratik yaparak teorik bilgiyi kod ornekleriyle desteklemek, mulakat basarisi icin belirleyici bir faktor olacaktir.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Sonuc

Symfony 8, PHP 8.4'un dil duzeyindeki yeniliklerini framework mimarisine derinlemesine entegre eden, olgun ve ileri gorulu bir surum olarak one cikiyor. Onemli cikarimlari ozetlemek gerekirse:

  • Native lazy objects, proxy kod uretimini ortadan kaldirarak performansi artiriyor ve hata ayiklamayi kolaylastiriyor.
  • AbstractFlowType, cok adimli formlari framework duzeyinde destekleyerek ucuncu parti paket ihtiyacini ortadan kaldiriyor.
  • Invoke edilebilir komutlar, konsol bileseni gelistirme surecini attribute tabanli bir yaklasimla basitlestiriyor.
  • JsonStreamer ve ObjectMapper, veri isleme ve nesne donusumu senaryolarinda yuksek performans ve temiz kod sunuyor.
  • Framework bundle modularizasyonu, uygulamalarin yalnizca ihtiyac duydugu bilesenleri icermesini saglayarak daha hafif yapilar olusturuyor.
  • PHP 8.4 property hooks, entity ve DTO siniflarinda daha temiz ve daha guvenli bir API ortaya koyuyor.
  • Guvenlik iyilestirmeleri, varsayilan koruma mekanizmalarini guclandirerek uygulamalarin dayanikliligini artiriyor.

Symfony 8, hem yeni projelere baslayan hem de mevcut uygulamalarini modernize etmek isteyen gelistiriciler icin guclu bir temel sunuyor. Mulakat hazirligi acisindan ise bu surumun getirdigi degisiklikleri hem teorik hem de pratik duzeyde kavramak, 2026 teknik mulakatlarinda onemli bir avantaj saglayacaktir.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Etiketler

#symfony
#php
#lazy-objects
#interview

Paylaş

İlgili makaleler