La razón obvia para usar una reescritura en lugar de un complemento es cuando necesita anular un método privado, protegido o final .
Pero también considere los siguientes escenarios.
1er escenario (orden de clasificación absoluto):
Las reescrituras pueden ser útiles cuando necesita que su código se ejecute antes de los complementos . Sé que puedes hacerlo configurando el complemento sortOrder
, pero no puedes estar seguro de que tu código siempre será el primero cuando alguien (no tú) vaya a instalar componentes de terceros.
2do escenario (excluir código):
Si necesita excluir o reescribir solo un fragmento de código en un método, un complemento podría ser una forma subóptima. Sé que puedes usar un around
complemento y evitar llamar al proceed
, pero esto podría romper otros complementos en la pila.
3er escenario (estilo de código):
Debería usar reescrituras cuando necesite reescribir un comportamiento, los complementos deben usarse para modificar la salida o ejecutar el código antes / después.
Un complemento, siempre debe ejecutar el código original para evitar romper otros módulos.
Mi conclusión:
Si puede considerar un método central como un cuadro negro con una entrada y una salida y es independiente de sus mecanismos internos, entonces un complemento podría ser la mejor opción.
Si necesita cambiar un comportamiento interno , una reescritura podría ser la mejor opción.