В Magento 2, когда вы создаете плагин "вокруг"
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
Вы можете перейти к следующему плагину, который завершается вызовом фактического оригинального метода, вызывая / вызывая переданный $proceed
метод. Это общий шаблон проектирования, часто встречающийся в реализациях промежуточного программного обеспечения PHP Frameworks.
Однако - это вносит некоторую путаницу в детали реализации. конкретно
Если в дополнение к
aroundPlugin
объекту / классу определен плагинbefore
илиafter
, когда они запускаются относительно цепочки вокруг плагинов?
т. е. будут ли срабатывать все методы before перед тем, как сработают все методы плагинов? Или плагины будут срабатывать только до того, как сработает последний реальный метод?
Конкретная проблема, которую я пытаюсь отследить, заключается в том, что я не могу подключить плагин к методу диспетчеризации фронт-контроллера Magento 2, когда Magento находится в режиме полного кэширования страниц . Кеш полной страницы работает вокруг плагина, который не вызывает $proceed($response)
. Я попытался покопаться в некотором коде вокруг этих плагинов и обнаружил, что систему трудно рассуждать, не зная, как предполагается, что плагины работают.
то есть - описание на странице документации разработчика , в данном конкретном случае, представляется неточным. Неясно, является ли документация неправильной, или это недавно введенная ошибка, является ли это крайним случаем, или если моя конфигурация плагина неверна.
Кто-нибудь знает по прямому наблюдению или культурным знаниям, как должна работать эта расстановка приоритетов?
источник
\closure $proceed
против\callable $proceed
в плагине? Официальный документ только упоминает\callable
и никогда не затрагивает\closure
.Ответы:
Плагины сортируются сначала по порядку сортировки, а затем по префиксу метода.
Пример: для метода с 3 плагинами (PluginA, PluginB, PluginC) со следующими методами и sortOrder:
Ход выполнения должен быть следующим:
источник
Из кулинарной книги Magento 2:
источник
Для меня это должно работать как:
Если вы просматриваете код,
\Magento\Framework\Interception\Interceptor::___callPlugins()
вы можете увидеть, что плагины вызываются в порядке, хранящемся в$pluginInfo
переменной. Эта информация передается из автоматически сгенерированного метода в перехватчики типаКак видите,
\Magento\Framework\Interception\PluginListInterface
интерфейс и\Magento\Framework\Interception\PluginList\PluginList
реализация по умолчанию отвечают за сортировку плагинов. Смотрите _inheritPlugins: 152 методДля меня эта функция имеет две логические ошибки:
return $itemB['sortOrder'];
должно бытьreturn - $itemB['sortOrder']
;return 1;
должно бытьreturn 0;
Надеюсь, это поможет вам.
источник