Vantaggi del modello di fabbrica Magento2 rispetto a Magento 1


15

Magento 2 utilizza le classi di fabbrica per i non iniettabili.

Ad esempio classe di prodotto: ad ProductFactory
esempio classe cliente:CustomerFactory

Non capisco qual è il tipo di modello di fabbrica qui?

Perché per ogni classe associata a 1 classe di fabbrica. Sto pensando che sia qualcosa di duplicato. Perché non dovremmo creare una fabbrica astratta per CustomerFactory, ProductFactoryecc.?

e anche per esempio:

Possiamo passare AbstractFactoryper il controllo del tipo invece che ProductFactorynel ProductRepositorycostruttore della classe.

Quindi possiamo evitare l'accoppiamento stretto tra ProductRepositoryeProductFactory


Classe di fabbrica astratta:

namespace Magento\Framework\ObjectManager\Code\Generator;

/**
 * Abstract Factory class 
 */
abstract class AbstractFactory 
{
    /**
     * Object Manager instance
     *
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_objectManager = null;

    /**
     * Instance name to create
     *
     * @var string
     */
    protected $_instanceName = null;


    /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \Magento\Catalog\Model\Product
     */
    public function create(array $data = array())
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }
}

Implementazione astratta della fabbrica:

namespace Magento\Catalog\Model;
use Magento\Framework\ObjectManager\Code\Generator\AbstractFactory;
/**
 * Factory class for @see \Magento\Catalog\Model\Product
 */
class ProductFactory extends AbstractFactory
{

    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\Magento\\Catalog\\Model\\Product')
    {

        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

}

Qual è la relazione tra object manager e factory?

Ci sono così tanti oggetti concatenati:

  • Ad esempio ProductRepository(qui possiamo chiamarlo come client) richiede Productoggetto.

  • Per questo dipende ProductFactorydall'oggetto specifico .

  • ProductFactoryl'oggetto dipende ObjectManagerdall'oggetto.

  • ObjectManagerL'oggetto dipende dall'oggetto Factory (qui Developer Object).

Ovviamente usano le interfacce per un accoppiamento lento. Flusso ancora molto confuso.

Qualcuno può dare profondi vantaggi con il modello di fabbrica Magento 2 e anche in che modo differisce da Magento 1?

Risposte:


8

Una cosa da ricordare è che generiamo automaticamente le classi di fabbrica SOLO SE NON SEI DEFINITO. Ciò significa che se devi fare qualche magia speciale in fabbrica, puoi farlo. (Ad esempio, se vuoi registrare ogni creazione di un'istanza per qualche motivo, scrivi tu stesso la factory e non la genereremo automaticamente.) Se usassimo un'unica classe factory astratta per tutto, questo non funzionerebbe.

Può anche aiutare un po 'con il debug: puoi vedere la classe reale, puoi impostare punti di interruzione, vedere tracce di stack più significative ecc.


può essere un piccolo spazio..per il controllo del tipo voglio solo usare la classe astratta..ma ogni volta che voglio passare solo la classe di fabbrica in cemento.
sivakumar,

Interessante: avrei considerato il contrario. Vorrei che CustomerFactory passasse, quindi ho un suggerimento sul tipo che create () restituirà il Cliente. Con AbstractFactory, non posso usare il suggerimento del tipo php Storm per elaborare il tipo di oggetto restituito dalla fabbrica. (O mi sto perdendo qualcosa?)
Alan Kent,

8

Potrei sbagliarmi qui, ma questo è un vantaggio che ho trovato.
Le fabbriche generate automaticamente sono in qualche modo simili con i getter o setter magici.
Diciamo che vuoi che succeda qualcosa quando viene creata un'istanza di un'entità specifica (chiamiamola BlogPost). Supponiamo che tu voglia impostare un valore predefinito su un campo.
L'esempio potrebbe non essere il migliore, ma ascoltami.
Se usi una factory astratta, dovrai modificarla in modo che quando ricevi l'istanzaNome come parametro 'BlogPost' chiami setDatedopo aver creato un'istanza.

Se si utilizza factory generati automaticamente, è possibile crearla successivamente, chiamare il settercodice, rimuovere la factory generata e funzionerà.
Simile a quello che fai con il setter magico. Si implementa il metodo e si chiama ovunque.


Ciao Marius. Grazie per la tua risposta. D'accordo con te. Ancora bisogno di ulteriori informazioni.
sivakumar,

@sivakumar. Mi piacerebbe una risposta anche da un membro del team principale.
Marius
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.