Magento 2: Değişkenleri Denetleyici Eyleminden “Görünüme” Geçme


12

Magento 1'de, Denetleyici eyleminizden "Görünüm" e (yani, düzeninizdeki bir blok) veri aktarmak istiyorsanız

  1. Aracılığıyla genel kayıt defterine bir değer / nesne ekleyin Mage::register

  2. Bir blok nesnesini doğrudan getir ve çalıştırdıktan sonra getirilen blok nesnesindeki veri özelliklerini ayarla loadLayout

  3. phtmlDosyalardaki blok nesneler üzerinde çağrı yöntemleri ve blok nesnelerinin daha önce kontrolör eylemine kaydedilmiş verileri okumak için model / veritabanı katmanını kullanmasını sağlayın

Veritabanından okumak için blok nesnesi yöntemlerinin kullanılması Magento 2'de hala işe yarıyor gibi görünüyor - ki bu da bazı işlem türleri için uygun. Ancak,

  1. Magento 2'de artık küresel bir kayıt yok (ya da var mı?)

  2. Düzen sistemi artık bir fabrika aracılığıyla bir sayfa nesnesi oluşturarak çalışır ve Magento 1'deki gibi blok referanslarını yakalayamazsınız.

Magento 2'de doğrudan bir denetleyici eyleminden bir görünüme veri aktarmak mümkün müdür? Yoksa bu Magento'nun cesur yeni Design Pattern ™ dünyası için bir kalıp mı? Bu çok doğrudan bir kalıpsa, bir şablonda görüntülemek istediğimiz bazı hesaplanmış bilgiler varsa, ancak bu bilgileri durum bilgisi olan bir sistemde saklamak istemiyorsa (yani, bunu veri tabanı)

Bunu kendim bir araya getirmenin birkaç farklı yolunu düşünebilirim - ama Magento 2'nin bunu nasıl yapmanızı istediğiyle ilgileniyorum .

Not : Bunun gibi bir şey kullanarak bir denetleyici eyleminde bir blok örneği getirmenin mümkün olduğunu anlıyorum

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

Magento 2 çekirdek kodu bunu sıklıkla yapar. Bununla birlikte, denetleyici nesnesine getirilen blok nesnesi , ya şablon aracılığıyla mevcut olandan farklı bir nesne gibi görünür veya (eski ( ), şablonu gerçekte oluşturan nesne gibi görünürken, later ( ) Magento Block tipinin bir örneği).phtml$this$block$this$block

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

"Görünüşe göre" diyorum çünkü kontrolör eylem yönteminde veri ayarlarsam, phtmlşablonda mevcut değildir - ve spl_object_hashyukarıdaki sonuçları karşılaştırırsam, üç farklı karma elde ederim. Ancak, tüm bunlar için yukarıdakilerin yaptığım başka bir hata olabileceği konusunda yeterince yeniyim - bu yüzden bloklar üzerinde veri ayarlayabilir ve bir şablonda getirebildiyseniz bunu duymak isterim !

Yanıtlar:


17

# 1 ile ilgili olarak, kayıt hala var, Magento 1'den bildiklerinize çok benziyor. Görmek:\Magento\Framework\Registry

Bağımlılık enjeksiyonu yoluyla kurucunuza ekleyin ve daha sonra verileri depolamak / erişmek için tanıdıklarınızı $registry->register($key, $value)ve $registry->registry($key)yöntemlerinizi kullanabilirsiniz.

Henüz yapmadıysanız \ Magento \ Framework ad alanının etrafında dolaşmanızı öneririm. Daha önce Mage veya App'den erişilebilen bir çok şey hala orada, sadece ayrıldı.

En iyi uygulamalara gelince, buna cevap veremem, ancak cevabın mümkün olduğunca mantığı denetleyiciden uzak tutmak olacağını umuyorum. Çekirdeğe bakmak muhtemelen en iyi bahistir. Örneğin, müşteri adresi düzenleme sayfasına bakın: Temel denetleyici ; kapsamlı blok - adres kimliğini çekme ve gerekirse yükleme dahil. Bunu doğrudan blokta ele alırlar; kontrol cihazında yapmazlar ve sonra etrafta geçirirler.


2
Hile, elbette, çekirdeğin hangi parçalara bakacağını ve hangilerini görmezden geleceğini bilmek :) İşaretçiler için teşekkürler, yararlı bilgiler için +1!
Alan Storm

1
Son paragraf için +1. Hesaplanmış bir değer paylaşmanız gerekiyorsa, hesaplama davranışını nesneye ayırın ve bu değeri gerektiren bloklardan çağırın. Kayıt defteri önerilmez çünkü küresel değişebilir durumdur ve oradan ne alacağınızdan asla emin olamazsınız. Blokların eylemden doğrudan adreslenmesi de önerilmez, çünkü bir sayfada bloğun var olup olmadığından emin
olamazsınız

@AntonKril sayfa oluşturucu yardımcılarına ne dersiniz? CMS sayfa yardımcısı, ürün görünümü yardımcısı, bunların oluşturulmasını HTTP isteğinden ayırmak mı gerekiyor?
Ivan Chepurnyi

5

Sen gerektiğini değil View Kontrolör Eylem gelen Değişkenler geçen. Değişkenleri Görünüme geçirmek için bloğu kullanın (şablon motoru).


Neden? Get / post parametrelerini bloktan görünüme nasıl geçirebilirsiniz? Çoğu mantık onları denetleyiciden görüntülemek için geçirmez mi?
LucScu

İstek Nesnesi'ni bloklar halinde kullanın. Kayıt defteri aracılığıyla denetleyiciden veri almayı engellerseniz, diğer denetleyicilerle blokları kullanamazsınız. Buna Geçici bağlantı ve kötü uygulamaları denir
KAndy

Ben denetleyiciden bloğa istek parametrelerini geçirmek için $ block-> assign () kullanın. Aynı zamanda kötü bir uygulama mı?
LucScu

Blokların eylemden doğrudan adreslenmesi de önerilmez, çünkü bir sayfada bloğun olup olmadığından asla emin olmazsınız.
KAndy

Benim durumumda eminim, çünkü denetleyici, düzen ve bloğun sadece kodum tarafından kontrol edildiği özel bir senaryo, bu yüzden denetleyiciden bloğa mantıksal geçiş isteğinin parametrelerini düşünüyorum. Cevaplarınız için teşekkürler!
LucScu
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.