Problem/Motivation
If you define a Display Extender plugin in a module and enable it, then uninstall that module, you are unable to load any pages. You get a "Drupal\Component\Plugin\Exception\PluginNotFoundException" error.
The same thing will occur if a module defines an input filter and then that module is uninstalled. If you go to a page with processed text using a format that filter was enabled in, then it will error out with a plugin not found exception.
While we can check uninstall requirements on a per-module basis, having core do this would make much more sense and prevent the dreaded WSOD as more modules get tried and uninstalled.
Proposed resolution
Simplest fix would be in DisplayPluginBase.php:165:
if ($plugin = $manager->createInstance($extender)) {
Change to:
if ($manager->hasDefinition($extender) && $plugin = $manager->createInstance($extender)) {
The other, more involved but possible better option would be to define a default fallback plugin for display extenders, and possibly any other Views plugins that can be defined and cause this problem.
What may be the best solution is to include these plugins, along with any others in the uninstall validator. Perhaps a new method in DefaultPluginManager (or even a trait for plugin managers to include) that allows each plugin manager to perform a check if it can be safely removed or not.
eg for the views handler:
public function uninstallRequirements($module_name) {
foreach ($definitions as $definition) {
if ($definition['provider'] == $module_name && $config->get('views.settings.display_extenders' . $definition['id'])) {
//Throw an exception or return an explanation of why this module can not be uninstalled.
}
}
}
For Filters it would have to loop through each formatter config entity and check if that filter is enabled.
Recommended workaround
Until this bug is fixed, any module implementing display extenders should implement hook_uninstall()
to require removing dependencies on it from existing views.
Remaining tasks
<!-- See https://drupal.org/core-mentoring/novice-tasks for tips on identifying novice tasks. Delete or add "Novice" from the Novice? column in the table below as appropriate. Uncomment tasks as the issue advances. Update the Complete? column to indicate when they are done, and maybe reference the comment number where they were done. -->
User interface changes
API changes
Data model changes