Co wyzwala generowanie fabryki w Magento 2


39

Magento 2 zawiera wiele plików klas, które są wstępnie generowane lub generowane w locie. Oni żyją w

var/generated

Wygenerowane pliki obejmują klasy fabryczne. Z dokumentacji rozumiem, że programista używa klas fabrycznych do tworzenia obiektów „niewtryskiwalnych”. Obiekt „nienadający się do wstrzyknięcia” to obiekt, którego nie można dodać za pomocą __constructorwstrzykiwania zależności, zwykle dlatego, że wymaga on danych wejściowych użytkownika do utworzenia wystąpienia.

Z dokumentacji nie wynika jasno, skąd Magento 2 wie, że musi wygenerować klasę fabryczną. Ten kawałek

Jeśli menedżer obiektów w trybie wykonawczym lub kompilatorze napotka nieistniejącą fabrykę, menedżer obiektów wygeneruje fabrykę.

wygląda na to, że jeśli użyję klasy fabrycznej w menedżerze obiektów (lub, co za tym idzie, we wstrzykiwaniu zależności __konstruktorów), Magento 2 wygeneruje ją dla mnie. Ale skąd menedżer obiektów wie, że to, o co proszę, to fabryka?

Wydaje się również, że istnieją dwa polecenia do automatycznego generowania (lub „kompilowania”) wszystkich generowanych klas. Uruchomienie jednego z tych poleceń generuje dużą liczbę klas Factory. Jakich plików konfiguracyjnych i / lub kodowych oczekują te polecenia, aby wygenerować potrzebne obiekty fabryczne?

Wiem, że śledzenie menedżera obiektów i / lub kodu poleceń do końca ujawniłoby to, ale mam nadzieję uniknąć tej długiej i żmudnej podróży.

Odpowiedzi:


21

Interesująca lokalizacja kodu, jak to wszystko działa razem: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

Różne typy pochodzą głównie stąd https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator, ale także stąd https://github.com/magento / magento2 / tree / develop / lib / internal / Magento / Framework / Interception / Code / Generator for the Interception code.

Wszystko to jest uruchamiane przez autoloader tutaj https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

Nie znalazłem w kodzie warunków, dla których generowane są fabryki, ale z mojego zrozumienia klasa fabryczna jest generowana, gdy jest ona wymagana i nie można jej znaleźć.
Istnieją pewne zastrzeżone słowa kluczowe Factory, Proxy, Interceptor, jeśli zostaną użyte, spowodują wygenerowanie kodu, gdy określone klasy nie zostaną znalezione.
Wyślę wiadomość, gdy tylko znajdę kod, który uruchamia generowanie fabryki.
Jeśli więc zażądasz klasy, Some\Namespace\HereFactorya klasa nie istnieje, ponieważ kończy się słowem kluczowym Factory, zostanie wygenerowana wvar/generation/Some/Namespace/HereFactory.php


Wygląda na to, że dokumenty powinny zostać zaktualizowane, ponieważ menedżer obiektów ObjectManager tak naprawdę nie generuje. Specjalny program ładujący jest częścią odpowiedzi. github.com/magento/magento2/blob/develop/lib/internal/Magento/…
Chris O'Toole

1
To zgadza się z moim doświadczeniem (patrz gist.github.com/astorm/f245ce9c761c9a8053aa), ale rodzi pytanie 1. Gdzie to się dzieje w kodzie menedżera obiektów (tj. Jaka jest rzeczywista konwencja) 2. W jaki sposób kompilator / generator wie, jakie fabryki generować?
Alan Storm

8

W tej chwili kopię tę samą zupę grochową. Jak dotąd rozumiem, że wszystkie rzeczy generowane automatycznie /var/generationsą wykonywane na podstawie preferencji i interfejsów zadeklarowanych w app/etc/di.xml.

Twoje interfejsy i preferencje zostaną zadeklarowane w di.xmlpliku w twoim /app/code/Vendor/<module>/etc/di.xml.

Wie, aby wygenerować dla Ciebie obiekt (y), ponieważ zadeklarowałeś interfejs w swoim __constructorAND i zadeklarowałeś preferencje dla tego interfejsu globalnie lub lokalnie w odpowiednim di.xmlpliku.

Z moimi komentarzami oferuję trzy ziarna soli.


+1 za przydatne informacje - ale wygląda na to, że Fabryki pochodzą skądinąd poza di.xmlplikami - możesz wysłać coś do menedżera obiektów, który kończy się na Fabryce, i wygeneruje dla ciebie plik.
Alan Storm

czy to pomaga? bit.ly/1BOtdie
Steve Johnson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.