HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block,...
Transcript of HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block,...
![Page 1: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/1.jpg)
HELLO!
![Page 2: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/2.jpg)
I'M ALEX
![Page 3: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/3.jpg)
ZVIRYATKO
![Page 4: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/4.jpg)
![Page 5: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/5.jpg)
![Page 6: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/6.jpg)
5 YRS AT
![Page 7: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/7.jpg)
DRUPAL 8 PLUGIN API
![Page 8: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/8.jpg)
WHAT IS PLUGIN IN D8?Did you remember ctools? Or any hook_info?
block, eld widget, formatter, form element, action, etc...even cache backend.
![Page 9: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/9.jpg)
src/Plugin/Block/SimpleMessageBlock.php/** * Defines a block with simple message. * * @Block( * id = "simple_message", * admin_label = @Translation("Simple Message"), * ) */class SimpleMessageBlock extends BlockBase /** * @inheritdoc */ public function build() return [ 'message' => [ '#markup' => $this>t('Just a simple message.'), ], ];
![Page 10: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/10.jpg)
OK! BUT HOW TO ADDCUSTOM PLUGIN?
EASIER THAN IN D7
![Page 11: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/11.jpg)
WHERE SHOULD I PUT MYFILES?
All plugins should be placed insrc/Plugin/PLUGIN_NAME directory*
![Page 12: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/12.jpg)
HOW TO DEFINE?
USE ANNOTATIONS/** * @Block( * id = "simple_message", * admin_label = @Translation("Simple Message"), * ) */
![Page 13: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/13.jpg)
WHAT IS THE CODE?
IT DEPENDS ON INTERFACEclass SimpleMessageBlock extends BlockBase /** * @inheritdoc */ public function build() return [ 'message' => [ '#markup' => $this>t('Just a simple message.'), ], ];
![Page 14: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/14.jpg)
LOOKS SIMPLE
IS IT ALL?
NO!
![Page 15: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/15.jpg)
WHAT IS DERIVATIVES?
DYNAMIC PLUGINSforeach (module_implements('block_info') as $module) $module_blocks = module_invoke($module, 'block_info'); $blocks[$module] = $module_blocks;
![Page 16: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/16.jpg)
DERIVATIVE EXAMPLEcore/modules/system/src/Plugin/Block/SystemMenuBlock.php/** * @Block( * id = "system_menu_block", * admin_label = @Translation("Menu"), * category = @Translation("Menus"), * deriver = "Drupal\system\Plugin\Derivative\SystemMenuBlock" * ) */class SystemMenuBlock extends BlockBase // ...
This block is being used for all site menus
![Page 17: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/17.jpg)
BUT HOW IT WORKS?Check the deriver annotation property
deriver = "Drupal\system\Plugin\Derivative\SystemMenuBlock"
core/modules/system/src/Plugin/Derivative/SystemMenuBlock.phpclass SystemMenuBlock extends DeriverBase // ... public function getDerivativeDefinitions($base_definition) $blocks = $this>menuStorage>loadMultiple(); foreach ($blocks as $menu => $entity) $this>derivatives[$menu] = $base_definition; return $this>derivatives;
![Page 18: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/18.jpg)
WHAT IS PLUGIN MANAGER?Fat replacement of hook_*_info system
Plugin manager is responsible for:
Plugin discovery (annotation, yaml)Plugin creation (factory)
![Page 19: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/19.jpg)
WHY DO YOU NEED IT?Create extendable architecture
example: layouts
you can provide layouts from theme or module and have not be hard linked to main module
![Page 20: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/20.jpg)
HOW TO ADDmymodule/mymodule.services.yml
services: plugin.manager.sandwich: class: Drupal\mymodule\SandwichPluginManager parent: default_plugin_manager
![Page 21: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/21.jpg)
mymodule/src/SandwichPluginManager.phpclass SandwichPluginManager extends DefaultPluginManager public function __construct( \Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler ) parent::__construct( 'Plugin/Sandwich', // subdir where to search plugins $namespaces, $module_handler, 'Drupal\mymodule\SandwichInterface', // strict interface 'Drupal\Core\Annotation\Plugin' // annotation class ); $this>alterInfo('sandwich_info'); $this>setCacheBackend($cache_backend, 'sandwich_info');
![Page 22: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/22.jpg)
HOW TO USEGet a list of available plugins:
$type = \Drupal::service('plugin.manager.sandwich');/** * @var Drupal\mymodule\SandwichInterface[] $plugins */$plugins = $type>getDefinitions();
In this case you will receive only objects that implementyour interface
![Page 23: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/23.jpg)
PLUGIN DISCOVERYANNOTATION
YAML
STATIC
HOOK
![Page 24: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/24.jpg)
ANNOTATION DISCOVERYYou already saw it
/** * @Block( * id = "system_menu_block", * admin_label = @Translation("Menu"), * ) */
This is much better then ctools $plugin = array();
Using in plugin managernew AnnotatedClassDiscovery( "Plugin/Sandwich", // Subdirectory $namespaces, // Service "container.namespaces" "Drupal\Core\Block\Annotation\Block" // Annotation @Block);
![Page 25: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/25.jpg)
YAML DISCOVERYUsefull for theme plugins, like breakpoints or layouts
core/themes/bartik/bartik.breakpoints.ymlbartik.wide: label: wide mediaQuery: 'all and (minwidth: 851px)' multipliers: 1x
Drupal\breakpoint\BreakpointManager::$defaultcontains all possible keys
$directories = $moduleHandler>getModuleDirectories() + $themeHandler>getThemeDirectories();new YamlDiscovery('breakpoints', $directories);
![Page 26: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/26.jpg)
STATIC DISCOVERYUseful when you need to add 3rd-party class as plugin
class SandwichPluginManager extends DefaultPluginManager protected function getDiscovery() $this>discovery = new StaticDiscovery(); $this>discovery>setDefinition('cheese_sandwich', [ 'label' => new TranslatableMarkup('Cheese Sandwich'), 'class' => '\Some\Vendor\Library\CheeseSandwich', ]); return $this>discovery;
![Page 27: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/27.jpg)
HOOK DISCOVERYGood old hook_info()
class SandwichPluginManager extends DefaultPluginManager protected function getDiscovery() $this>discovery = new HookDiscovery( $this>moduleHandler, "sandwich_info" ); return $this>discovery;
For hook_info_alter() use this$this>alterInfo("sandwich_info");
![Page 28: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/28.jpg)
DISCOVERY DECORATORSCombine them all together with decorators
$d = new AnnotatedClassDiscovery("Plugin/sandwich", $nmspaces);$d = new ContainerDerivativeDiscoveryDecorator($d);$d = new YamlDiscoveryDecorator($d, 'sandwich', $directories);$d = new InfoHookDecorator($d, 'sandwich_info');$d = new StaticDiscoveryDecorator($d, "callback");
![Page 29: HELLO! 8 Plugin API.pdf · WHAT IS PLUGIN IN D8? Did you remember ctools? Or any hook_info? block, eld widget, formatter, form element, action, etc... even cache backend.](https://reader033.fdocuments.us/reader033/viewer/2022060521/60504ff99969012e4e7d6e5d/html5/thumbnails/29.jpg)
IS IT ALL NOW?