Magento 2: passaggio delle variabili dall'azione del controller a "Visualizza"


12

In Magento 1, se si desidera passare i dati dall'azione del Controller alla "Visualizza" (ovvero un blocco nel layout, è possibile)

  1. Aggiungere un valore / oggetto al registro globale tramite Mage::register

  2. Recupera direttamente un oggetto blocco e imposta le proprietà dei dati sull'oggetto blocco recuperato dopo l'esecuzione loadLayout

  3. Chiamare metodi su oggetti blocco nei phtmlfile e fare in modo che gli oggetti blocco utilizzino il livello modello / database per leggere i dati precedentemente salvati nell'azione del controller

L'uso dei metodi a blocchi di oggetti per leggere dal database sembra funzionare ancora in Magento 2, il che è appropriato per alcuni tipi di operazioni. Tuttavia,

  1. Non c'è più un registro globale in Magento 2 (o c'è?)

  2. Il sistema di layout ora funziona creando un oggetto pagina tramite una factory e non è possibile afferrare i riferimenti di blocco nello stesso modo in Magento 1

In Magento 2 è possibile passare i dati direttamente da un'azione del controller a una vista? Oppure questo è un modello troppo diretto per il nuovo coraggioso mondo di Design Pattern ™ di Magento? Se questo è un modello troppo diretto, cosa dovrebbe fare se ci sono alcune informazioni calcolate che vogliamo visualizzare in un modello, ma non vogliamo archiviarle in un sistema con stato (cioè non vogliamo salvarle nel Banca dati)

Posso pensare a un modo diverso di hackerare questo insieme da solo - ma sono interessato a come Magento 2 vuole che tu lo faccia.

Nota : mi rendo conto che è possibile recuperare un'istanza di blocco in un'azione del controller usando qualcosa del genere

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

var_dump(spl_object_hash($block));

Il codice core di Magento 2 lo fa spesso. Tuttavia, l'oggetto di blocco recuperato nell'oggetto controller sembra essere un oggetto diverso da quello disponibile in un phtmlmodello tramite uno $thiso $block(il primo ( $this) sembra essere l'oggetto che rende effettivamente il modello, mentre il successivo ( $block) sembra essere un'istanza del tipo di blocco Magento).

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

Dico "sembra essere" perché se imposto i dati nel metodo di azione del controller, non sono disponibili nel phtmlmodello - e se confronto i spl_object_hashrisultati sopra, ottengo tre hash diversi. Tuttavia, sono abbastanza nuovo per tutto ciò che quanto sopra potrebbe essere un altro errore che ho fatto - quindi se sei stato in grado di impostare i dati su blocchi e recuperarli in un modello mi piacerebbe sentirne parlare !

Risposte:


17

Per quanto riguarda il numero 1, il registro esiste ancora, molto simile a quello che sai da Magento 1. È appena stato spostato. Vedere:\Magento\Framework\Registry

Aggiungerlo al costruttore tramite l'iniezione di dipendenza, e quindi è possibile utilizzare i vostri familiari $registry->register($key, $value)e $registry->registry($key)metodi per memorizzare i dati / di accesso.

Ti consiglio di dare un'occhiata allo spazio dei nomi \ Magento \ Framework se non l'hai già fatto. Molto di ciò che era accessibile da Mage o App prima è ancora lì, appena suddiviso.

Per quanto riguarda le migliori pratiche, non posso rispondere, ma mi aspetto che la risposta sia quella di mantenere quanta più logica possibile fuori dal controller. Guardare il nucleo è probabilmente la soluzione migliore. Ad esempio, consultare la pagina di modifica dell'indirizzo del cliente: Controller di base ; blocco esteso - incluso il richiamo dell'ID indirizzo e il caricamento, se necessario. Lo gestiscono direttamente nel blocco; non lo fanno nel controller e poi lo passano in giro.


2
Il trucco, ovviamente, è sapere quali parti del core guardare e quali ignorare :) Grazie per i puntatori, +1 per informazioni utili!
Alan Storm,

1
+1 per l'ultimo paragrafo. Se devi condividere un valore calcolato, metti il ​​comportamento del calcolo in un oggetto separato e chiamalo dai blocchi che richiedono quel valore. Il registro è scoraggiato perché è uno stato mutabile globale e non si è mai sicuri di ciò che si otterrà da lì. L'indirizzamento diretto dei blocchi dall'azione è anche scoraggiato perché non si è mai sicuri se il blocco è presente in una pagina (il layout può ucciderlo)
Anton Kril

@AntonKril che ne dici degli aiutanti del renderer di pagine? Helper della pagina CMS, helper della vista prodotto, sono quelli destinati a separare il rendering dalla richiesta HTTP?
Ivan Chepurnyi,

5

Si dovrebbe non passando le variabili da azione di controllo a vista. Utilizzare il blocco a per passare le variabili alla vista (motore modello).


Perché? Come hai potuto passare i parametri get / post dal blocco alla visualizzazione? La maggior parte della logica non li passa dal controller per visualizzarli?
LucScu,

Usa l'oggetto richiesta in blocchi. Se blocchi il recupero dei dati dal controller tramite il Registro di sistema, non puoi utilizzarlo con altri controller. Si chiama accoppiamento temporale e le sue cattive pratiche
KAndy,

Uso $ block-> assegnato () per passare i parametri della richiesta dal controller al blocco. È anche una cattiva pratica?
LucScu,

Anche l'indirizzamento diretto dei blocchi dall'azione è sconsigliato perché non si è mai sicuri se il blocco è presente in una pagina.
KAndy,

Nel mio caso sono sicuro, perché si tratta di uno scenario personalizzato in cui controller, layout e blocco sono controllati solo dal mio codice, quindi penso che i parametri della richiesta di passaggio logico dal controller al blocco. Grazie per le tue risposte!
LucScu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.