W Magento 2, kiedy tworzysz wtyczkę „około”
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
możesz przejść do następnej wtyczki, kończąc się wywołaniem rzeczywistej oryginalnej metody, poprzez wywołanie / wywołanie przekazanej $proceed
metody. Jest to powszechny wzorzec projektowy, często spotykany w implementacjach oprogramowania pośredniego PHP Frameworks.
Jednak - wprowadza pewne zamieszanie w / r / t w szczegółach implementacji. konkretnie
Jeśli oprócz
aroundPlugin
obiektu zdefiniowano obiekt lub klasębefore
lubafter
wtyczkę, kiedy są one uruchamiane w odniesieniu do łańcucha wokół wtyczek?
tj. czy wszystkie wcześniejsze metody zostaną uruchomione przed uruchomieniem jakichkolwiek metod wtyczek? Czy będzie przed wtyczek tylko ogień przed końcowym, faktycznych prawdziwe pożary metoda?
Konkretnym problemem, który próbuję wyśledzić, jest to, że nie mogę uzyskać wtyczki dołączonej do metody wysyłania przedniego kontrolera Magento 2, gdy Magento jest w trybie buforowania pełnej strony . Pamięć podręczna pełnej strony działa przy użyciu wtyczki wokół, która się nie wywołuje $proceed($response)
. Próbowałem zagłębić się w część kodu wokół tych wtyczek i znalazłem system trudny do uzasadnienia, nie wiedząc, w jaki sposób to działa.
tj. - opis na stronie dokumentacji programistów wydaje się, w tym konkretnym przypadku, niedokładny. Nie jest jasne, czy dokumentacja jest nieprawidłowa, czy jest to niedawno wprowadzony błąd, czy jest to przypadek krawędziowy, czy też moja konfiguracja wtyczki jest nieprawidłowa.
Czy ktoś wie, poprzez bezpośrednią obserwację lub wiedzę kulturową, jak powinna działać ta hierarchizacja?
źródło
\closure $proceed
kontra\callable $proceed
we wtyczce? Oficjalny doc tylko wspomina\callable
i nigdy nie dotyka\closure
.Odpowiedzi:
Wtyczki są najpierw sortowane według kolejności sortowania, a następnie według prefiksu metody.
Przykład: dla metody z 3 wtyczkami (PluginA, PluginB, PluginC) z następującymi metodami i sortowaniem:
Wykonanie powinno być następujące:
źródło
Z książki kucharskiej Magento 2:
źródło
Dla mnie powinno to działać jako:
Jeśli
\Magento\Framework\Interception\Interceptor::___callPlugins()
przejrzysz kod , zobaczysz, że wtyczki są wywoływane w kolejności przechowywanej w$pluginInfo
zmiennej. Te informacje przekazane z automatycznie wygenerowanej metody w takich przechwytywaczach jakJak widzisz
\Magento\Framework\Interception\PluginListInterface
interfejs i\Magento\Framework\Interception\PluginList\PluginList
domyślna implementacja odpowiedzialne za sortowanie wtyczek. Zobacz _inheritPlugins: 152 metodaDla mnie ta funkcja ma dwa błędy logiczne:
return $itemB['sortOrder'];
powinno byćreturn - $itemB['sortOrder']
;return 1;
powinno byćreturn 0;
Mam nadzieję, że ci to pomoże.
źródło