Pregunta

Fecha:El 30 de mayo de 2015 (dada la naturaleza cambiante de Magento 2).

Magento 2 introducido un plugin concepto, implementado a través de un interceptor patrón.

Lo que no está claro a partir de la documentación es -- que las clases y los objetos en Magento son "interceptar poder"?Es decir, configurar un plugin con el XML que tiene el siguiente aspecto

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

pero no está claro que las clases son válidos como ObservedType.Este mayores artículo de wiki proporciona algunas claves cuando dice

Por favor, tenga en cuenta que el plugin función no se aplica a - Las clases creadas sin la inyección de dependencia, es decir, con el operador new directamente, en el Final de los métodos, en el Final de las clases

Es cualquier objeto creado a través de la inyección de dependencia disponible para ser interceptada?¿El ObservedType deben ser del tipo de sugerencia siempre en un __construct método, o puede (¿debe?) ser algo más?

Principalmente tratando de conseguir mi cabeza alrededor de lo que se puede y no se puede hacer con un Magento 2 interceptor antes de empezar a utilizarlos.

¿Fue útil?

Solución

Cada una de las clases de un Módulo de Magento es intercaptable.

Como se describe en la actual wiki, está limitado por el final de los métodos y clases

No se valida, pero las Clases de bibliotecas (lib) son (o deberían) no permite obtener interceptado.

La limitación cómo llegó el objeto creado no es cierto ya que yo creo, al menos si el cargador está configurado correctamente.Y no importa como que no se crea sobre la marcha, pero cuando el generador consiguió ejecutado.(tan solo es un tema de magento cargador automático debería ser el primero)

Otros consejos

Estamos trabajando en "@api" anotaciones para anotar recomendado los métodos que serán más estables en todas las versiones.Si usted se preocupe acerca de la capacidad de actualización, en forma adicional a lo que puede tenemos un plugin definido, también se debe considerar lo debe tenemos un plugin definido.No recomendamos la intercepción de la no-@métodos de la api, pero a veces sabemos que puede ser la mejor opción.(Le deja a la discreción del promotor.)

Oficialmente, puede interceptar métodos públicos que no son definitivas.Los métodos privados definitivamente no funcionan.De la memoria, la intercepción en la actualidad funciona mediante la creación de un descendiente de la clase que hereda de la clase real (la inyección de dependencia marco crea instancias de la clase que se genera cuando usted pide una nueva instancia de la clase real).Así que nada de lo que va a permitir una sub-clase de ser creado y el método original overrided probablemente va a funcionar, pero el público se recomiendan los métodos, lo que nos da flexiblity a usar otra aplicación inteligente en el futuro (que nunca iba a pasar de ser realista, sin una buena razón).

Sé que esto tiene una respuesta ya, pero es de hace 2 años.Tal vez algunas cosas han cambiado en el ínterin.

Aquí es lo que he encontrado hasta ahora.
A partir de la la documentación oficial y de cavar en el proceso de intercepción.

Voy a responder la otra manera alrededor.
¿ NO ser interceptada en Magento 2.
De los oficiales de doc

  • Los objetos que se crean instancias antes de Magento\Framework\Intercepción se bootstrap (no estoy seguro de dónde está ese punto)
  • Final de los métodos de
  • Cualquier método de final de clases (porque el generado interceptor de la clase tiene que extender la clase original).
  • Cualquier clase que contiene al menos una final de un método público
  • No métodos públicos (se podría trabajar para la protección de métodos, pero este no es "ético", ya que podría exponer a la no-pública de métodos para el exterior de la clase)
  • métodos estáticos
  • __construct
  • Virtual tipos de

A partir de la excavación de alrededor de

  • métodos en las clases que no se crea una instancia a través del administrador de objetos.(Ejemplo \Magento\Framework\Phrase)
  • las clases de la aplicación \Magento\Framework\ObjectManager\NoninterceptableInterface.(Por ejemplo \Magento\Framework\App\Cache\Proxy y todos los otros autogenerado proxies)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top