Özel bir modülde olaylar ne zaman gönderilir?


14

Bu Magento 1 ve Magento 2 ile ilgili bir soru.

İyi bir uygulama olarak, 3. taraf modül geliştiricilerinin diğer modüllerle çalışmayı kolaylaştırmak için özel modüllerindeki olayları göndermeye teşvik edildiğini anlıyorum.

Bilmek isterim:

  • bir geliştirici özel bir modülde olayları nereye göndermelidir?
  • olayları göndermek için önerilen herhangi bir nokta var mı? Kontrolörler, modeller, bloklar, yardımcılar, gözlemciler?
  • Sevk olayları performansı nasıl etkiler?

Evet! iyi soru. lütfen bu soruya cevap verin. Üçüncü taraf uzantı geliştiricileri ve özel projeler için çok yararlı olacaktır.
mapaladiya

Yanıtlar:


10

Burada iyi, açık, kararlı bir cevap bulamayacaksınız. Genel olarak, modülünüzde sizin ve kullanıcılarınızın ihtiyaç duyduğu olayları göndermelisiniz - ihtiyaç duydukları herhangi bir yeri düşünemiyorsanız, onları göndermenize gerek yoktur. Magento'nun kendisi o kadar çok farklı yerde o kadar çok olay yayar (denetleyici öncesi / sonrası sevkiyatı, herhangi bir kabartma işlemi, vb.), Modülünüz hiçbir şey yapmadan çok sayıda yararlı olay gönderir.

Bu tatmin edici olmadığından, modülünüzün, kullanıcılarınızın orijinal işlemden bağımsız olarak öğe eklemek, öğeden silmek, öğeden silmek, değiştirmek veya ayrı bir işlem yapmak isteyebileceği bir işlem olduğunda modülünüzün bir etkinlik göndermesini istersiniz. Örneğin - Magento,visitor_init standart otomatik oluşturulan etkinlikler paketinin bir parçası olmayan bir etkinliğe sahiptir . Bu olay, programcıların Magento verileri kaydetmeden önce ziyaretçi nesnesini değiştirmesine izin verir. Bunlar, orijinal modül geliştiricilerinin deterministik olarak bilmelerinin hiçbir yolu değildiBurası bir etkinliğin eklenmesi gereken yerdi - büyük olasılıkla özellik kullanıcılarından ve / veya sistem kullanıcılarıyla yapılan görüşmelerden geldi. Kullanıcılarınızın ne istediğini bilin ve yönetici aracılığıyla yapmasına izin vermek için bir UI / UX oluşturmak mümkün / pratik değilse, başka bir programcının onlar için yapabileceği bir olay kancası ekleyin.

Az sexily ekleyerek etkinlikler de (kullanıcıların, hatta iki geliştiriciler etkinleştirmek için ucuz bir yol olabilir senin herkesin korkuyor dokunmak o kod gnarly biraz içine biraz işlevsellik eklemek için ekip). Senin Plop dispatchEventiçine kod, kanca orta aramayı ve orijinal kapsamda kodu bozmadan işlevler ekleyebilirsiniz. [Editör: Ayrıca bu korkunç kodu bir noktada refactor gerekir]

Performans açısından akıllıca bir olay eklemek, olayı nereye eklediğinize bağlı olacaktır. dispatchOlayı çağırdığınızda , Magento'nun birkaç ekstra PHP çağrısı yapması, yapılandırılmış gözlemciler için yapılandırmayı sorgulaması ve ardından gözlemcileri çağırması gerekir. Bir kez yapıldığında, bu standart bir Magento sevkiyatı kapsamında ucuz bir ektir. Bununla birlikte, tekrar tekrar yapılırsa (örneğin, her blok oluşturulmadan önce) bu toplanabilir. Burada iyi bir kural yok - her zaman doğru cevap profildir.

Son olarak, Magento 2 ile, söylemek için henüz çok erken. Yukarıdakilerin hepsi hala geçerlidir - ancak eklenti sistemi birkaç kırışıklık ekler. Eklentiler, bir bakış açısıyla, Magento'daki herhangi bir genel yöntem çağrısı için olay benzeri davranış oluşturmanın bir yoludur . Teorik olarak, sınıflarınızı doğru bir şekilde tasarlıyorsanız, asla bir etkinliğe ihtiyacınız olmamalıdır. Bununla birlikte, uygulamada, bir etkinliği biraz korumalı veya özel yöntem koduna bırakmak, alternatif uzun bir yeniden düzenleme işlemi olduğunda Magento geliştiricileri için cazip bir çözüm olacaktır. Ayrıca, özel olarak adlandırılmış bir etkinlik oluşturmak genellikle modülünüzü kullanan geliştiriciler için daha dostça bir deneyim oluşturabilir.

Umarım yardımcı olur!


9

Magento 1 için, olayları atmak için iyi zamanlar tüm CRUD işlemlerinden önce ve sonra ve oluşturma işleminden önce ve sonradır. Bunların birçoğu çekirdekteki soyut sınıflar tarafından zaten sağlanmıştır, bu yüzden pratikte birçok üçüncü taraf etkinliğine ihtiyaç yoktur.

Magento 2 ile durum farklı. Genel yöntem çağrıları eklentilerle engellenebildiğinden, özel etkinliklere artık gerek yoktur.
Sınıfları tasarlarken, her yöntemi herkese açık hale getirmek yerine herkese açık hale getirmek yerine, büyük bir sınıfı birden çok daha küçük sınıfa ayırmak daha iyidir.
Daha küçük sınıfların her biri, bir veya iki güzel adlandırılmış ve yakalanabilir genel yönteme sahip olabilir.


0

Vinai'nin dediği gibi, CRUD operasyonlarından önce / sonra. Olayların gönderilmesi için bir başka önemli yer de adminhtml form bloklarıdır (varsa). Bu şekilde, yönetici form bloklarını yeniden yazmak zorunda kalmadan özel özellikler / alanlar eklediyseniz yeni giriş alanları ekleyebilirsiniz. (Bu Magento 1 içindir). Örneğe bakın


0

Magento 1'in içinde, gerçekleşen otomatik olarak tetiklenen etkinlikler aracılığıyla etkinliklerden yararlanabilirsiniz. Tek yapmanız gereken modellerinizde bir $_eventPrefixve $_eventObjectözellikleri ayarlamaktır . Ayrıca, denetleyicideki 'controller_action_predispatch_ ' . $this->getFullActionName()ve üzerindeki olaylar aracılığıyla 'controller_action_postdispatch_' . $this->getFullActionName()otomatik olarak özel tetiklenmiş denetleyici olaylarınız vardır . Bunlar sizi en çok oraya götürebilir.

Magento 2 için yöntemlerinizi sınıflarınızın içinde herkese açık tutun. Bu, eklentilerin yöntemlerinizi durdurmasına izin verir. Bunu izlerseniz, herhangi bir özel etkinlik oluşturmanız gerekmez.

Umarım bu yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.