Skip to content
docsv0.13.1

MetadataActivationSafety

Contesta si apagar un plugin dejaría el grafo sin cerrar, para un host que declara sus plugins como clases — que es la forma de toda app generada por `milpa/framework`. ## Por qué existe `PluginsManager` ya implementaba {@see ActivationSafetyInterface}, pero una app que arranca por `Milpa\Runtime\Kernel` **no usa ese gestor**: declara clases en `config/plugins.php` y el kernel las resuelve. Así que en la plantilla que se reparte no había NINGUNA implementación, `PluginOperations` recibía `safety: null`, y la comprobación no se saltaba por decisión — se saltaba por ausencia. Medido: dos plugins proveyendo la misma capacidad y uno requiriéndola; apagar el primero pasa (queda el otro), apagar el segundo también pasaba, y la app dejaba de arrancar. A partir de ahí `plugins.enable` tampoco corre, porque necesita que el host arranque — hay que editar el estado a mano. El docblock de {@see ActivationSafetyInterface} dice que eso ya pasó de verdad una vez. ## Qué pregunta, exactamente Resuelve el grafo **sin** el plugin en cuestión y mira si queda bloqueado. Nada más: no opina sobre si el plugin es importante, ni sobre cuántos lo usan. La pregunta es si el host seguiría pudiendo arrancar, que es la única cuya respuesta es irreversible en la práctica. Un plugin que no está en la lista no bloquea nada: apagar lo que no está declarado no cambia el grafo, y contestar un motivo ahí sería inventar un problema.

MetadataActivationSafety::__construct()

public function __construct(array $declared, ?Milpa\Plugin\Contracts\PluginRegistryInterface $registry = null, ?Milpa\Plugin\Runtime\MetadataGraphResolver $resolver = null):

Parameters

Parameters of __construct()
NameTypeDescription
$declaredlist<class-string>Las clases que el host declara en `config/plugins.php`.
$registry(PluginRegistryInterface | null)Quién sabe cuáles están ENCENDIDAS. Sin él sólo se puede razonar sobre lo declarado, que es más permisivo — ver {@see enCurso()}.
$resolver?Milpa\Plugin\Runtime\MetadataGraphResolver

MetadataActivationSafety::blockingReasonWithout()

public function blockingReasonWithout(string $pluginName): ?string

El motivo por el que apagar `$pluginName` dejaría este host sin poder arrancar, o `null`. Resuelve el grafo SIN ese plugin y devuelve la razón que el resolver dé. Falla cerrado: si la resolución no se puede hacer, contesta con un motivo bloqueante en vez de con `null` — decir «no se rompe nada» cuando en realidad no se pudo preguntar es la peor de las respuestas.

Parameters

Parameters of blockingReasonWithout()
NameTypeDescription
$pluginNamestring

MetadataActivationSafety::blockingReasonWith()

public function blockingReasonWith(string $newPluginClass): ?string

Resuelve el grafo CON `$newPluginClass` agregado y devuelve la razón que el resolver dé si quedaría bloqueado. La otra mitad de {@see self::blockingReasonWithout()}: agregar trae `requires`, y el invariante es uno —el grafo nunca se deja abierto por una mutación (greenhouse decisions/0178). Falla cerrado: sin metadata legible o sin poder resolver, contesta con un motivo, no con `null`.

Parameters

Parameters of blockingReasonWith()
NameTypeDescription
$newPluginClassstring