Shopware 6: Çekirdeğe müdahale yerine eklentiler

Bir online mağaza, bir gün tamamen bitmiş sayılabilecek bir proje değildir. Ödeme yöntemleri değişir, kargo firmaları arayüzlerini yeniler, kurumsal kaynak planlama (ERP) sistemine yeni bir alan eklenir ve Shopware'in kendisi de güvenlik düzeltmeleri ile yeni özellikler içeren güncellemeleri düzenli olarak yayımlar. İşte bu yüzden bir Shopware 6 projesinin kalitesi yayına alındığı gün değil, ardından gelen ikinci, üçüncü ve onuncu güncellemede belli olur.

Bu konudaki ilkemiz basittir: Shopware çekirdeğine dokunmuyoruz. Her uyarlama bir eklentide, bir temada ya da bir uygulamada yer alır. Bunun neden bu kadar önemli olduğunu ve pratikte nasıl göründüğünü aşağıda anlatıyoruz.

Çekirdekteki değişiklikler neden pahalıya patlar?

Shopware çekirdeğindeki bir dosyayı doğrudan değiştirmek ilk bakışta hızlı ve pratik görünür. Sorun daha sonra ortaya çıkar: Bir sonraki güncelleme bu dosyayı yenisiyle değiştirir; yapılan değişiklik ya sessizce kaybolur ya da elle yeniden eklenmesi gerekir. Aradan bir yıl geçtiğinde hangi satırların neden değiştirildiğini çoğu zaman kimse tam olarak hatırlamaz.

Sonuç tanıdıktır: Güncellemeler riskli göründüğü için ertelenir. Mağaza eski bir sürümde kalır, güvenlik düzeltmeleri gecikerek gelir ve bir noktada güncel sürümle arasındaki fark o kadar büyür ki güncelleme neredeyse yeniden geliştirmeye dönüşür. Artık güncellenemeyen bir mağaza hem teknik hem de ticari açıdan bir risktir.

Shopware'in sunduğu araçlar

Shopware 6, Symfony tabanlıdır ve baştan itibaren genişletilebilir olacak şekilde tasarlanmıştır. Bir eklenti, özünde kendi yaşam döngüsüne sahip bir Symfony bundle'ıdır: Kurulur, etkinleştirilir, güncellenir ve gerektiğinde yeniden kaldırılır. Bir eklentinin içinde birden fazla mekanizma kullanılabilir.

Servisleri değiştirmek yerine dekore etmek

Fiyat hesaplaması ya da ürünlerin yüklenmesi gibi bir çekirdek işlevin farklı davranması gerektiğinde ilgili servisi dekore ediyoruz. Decorator deseni, orijinal servisi aynı arayüzü uygulayan kendi sınıfımızla sarar ve yalnızca gerekli olanı ekler ya da değiştirir. Geri kalan her şey orijinal servise iletilir. Shopware bir güncellemede orijinal servisi iyileştirdiğinde, arayüz sabit kaldığı sürece mağaza bundan bizim ayrıca bir şey yapmamıza gerek kalmadan yararlanır.

Olaylara tepki vermek

Pek çok uyarlama için bir sınıfa müdahale etmek hiç gerekmez. Shopware sayısız noktada olay (event) tetikler: bir sayfa yüklendiğinde, bir sipariş tamamlandığında ya da bir varlık kaydedildiğinde. Eklentideki bir event subscriber tam bu noktaya bağlanır, şablon için veri ekler veya örneğin siparişin harici bir sisteme aktarılması gibi bir sonraki süreci başlatır.

Şablonları kopyalamak yerine miras almak

Mağaza önyüzünde Shopware'in Twig şablon kalıtımıyla çalışıyoruz. sw_extends sayesinde bir eklenti veya tema şablonu orijinal şablonu genişletir ve yalnızca belirli blokları değiştirir. parent() çağrısıyla bir bloğun özgün içeriği korunur. Şablonun tamamını kopyalamak yerine sadece gerçekten farklı olan bloğu değiştiriyoruz. Temanın kendisi de bir eklentidir; aynı şekilde sürümlenir ve yayına alınır.

Kendi verilerinizi düzgün modellemek

Bir mağazanın kendine özgü veri yapılarına ihtiyacı olduğunda bunları Shopware'in Data Abstraction Layer (DAL) katmanı üzerinden tanımlıyoruz: Bir entity tanımı alanları ve ilişkileri açıklar, bir migration da tabloyu oluşturur. Böylece veriler otomatik olarak API'lerde ve yönetim panelinde kullanılabilir hâle gelir. Mevcut çekirdek varlıklar da tablolarına dokunulmadan uzantılarla zenginleştirilebilir.

Yönetim panelini genişletmek

Yönetim paneli de genişletilebilir. Özel modüller, mevcut formlara eklenen alanlar veya yeni ayar sayfaları, Shopware'in derleme sırasında dahil ettiği eklenti bileşenleri olarak geliştirilir.

Eklenti mi, uygulama mı?

Shopware 6, eklentilerin yanında bir uygulama (app) sistemi de sunar. Bir uygulama mağazanın içinde çalışmaz; mağazayla webhook'lar ve Admin API üzerinden iletişim kurar. Bu yaklaşım, Shopware'in bulut sürümünde de çalışması gereken uzantılar veya zaten ayrı bir sunucuda bulunan iş mantığı için uygundur. Eklentiler ise Symfony dünyasına tam erişime sahiptir ve mağazanın süreçlerine derinlemesine müdahale etmek gerektiğinde doğru tercihtir. Bu kararı her gereksinim için ayrı ayrı veriyoruz, genel bir kuralla değil.

Shopware projelerini nasıl kuruyoruz?

  • Composer tabanlı proje: Shopware ve tüm bağımlılıklar composer.json dosyasında sabitlenir. Sürümler izlenebilir, güncellemeler bilinçli olarak yapılır.
  • Depoda projeye özel eklentiler: Projeye özgü uzantılar, açık isimlerle ve her eklentiye tek bir görev verilerek projeyle birlikte sürümlenir.
  • Vendor dizininde değişiklik yok: Orada bulunan her şey Shopware'e ya da uzantıların üreticilerine aittir.
  • Canlıdan önce test ortamı: Güncellemeler önce gerçekçi verilerle çalışan bir test ortamına yüklenir ve orada kontrol edilir – ödeme adımları, ödeme yöntemleri, entegrasyonlar.
  • Otomatik kontroller: Kendi eklentilerimiz için statik analiz ve testler, bozulan arayüzleri erkenden yakalar.

Yeni projeleri Shopware 6.7 üzerinde kuruyoruz. Her uyarlama kendi eklentisinde yer aldığı için, bir güncellemeden önce değişen bir arayüzden hangi uzantının etkilendiğini tek tek kontrol edebiliyoruz.

Sonuç

Sorunsuz güncellenebilen bir mağaza güvenli, hızlı ve yeni özelliklere açık kalır. Eklentiler, decorator'lar, olaylar ve şablon kalıtımı ek bir yük değil; Shopware 6'nın en başından beri öngördüğü çalışma biçimidir. Artık güncellemeleri kaldıramayan mevcut bir mağazayı bize devretmek isterseniz, önce çekirdeğin nerelerde değiştirildiğini tespit ediyor, ardından bu değişiklikleri adım adım uygun uzantılara taşıyoruz.

Yukarı çık