SlideShare a Scribd company logo
DRUPAL 8 PLUGIN API
How to make your module extendable using plugins?
Manoj K
• Drupal Dev, Enthusiast, and Contributor
• Sr. Drupal Consultant @ Valuebound
• Speaker | Blogger | Mentor
• d.o/manojapare
• Github/manoj-apare
• @manojapare
INTRODUCTION
• Plugins
• Plugin API
PLUGINS vs. INFO HOOKS
WHEN TO USE?
• Plugin
• Service
PLUGIN SYSTEM: 3 BASE ELEMENTS
1.Plugin Types
2.Plugin Discovery
3.Plugin Factory
PLUGIN DISCOVERY TYPES
1. StaticDiscovery:
$this->discovery = new StaticDiscovery();
// Add a plugin with a custom value.
$this->discovery->setDefinition('test_block', [
'class' => 'Drupalplugin_testPluginplugin_testmock_blockMockTestBlock',
'metadata' => [
'custom' => TRUE,
],
]);
PLUGIN DISCOVERY TYPES
2. HookDiscovery:/
foreach ($this->moduleHandler->getImplementations($this->hook) as $module) {
$result = $this->moduleHandler->invoke($module, $this->hook);
foreach ($result as $plugin_id => $definition) {
$definition['provider'] = $module;
$definitions[$plugin_id] = $definition;
}
}
PLUGIN DISCOVERY TYPES
3. AnnotatedClassDiscovery:
@FieldType(
id = "datetime",
label = @Translation("Date"),
description = @Translation("Create and store date values."),
default_widget = "datetime_default",
default_formatter = "datetime_default",
list_class = "DrupaldatetimePluginFieldFieldTypeDateTimeFieldItemList",
constraints = {"DateTimeFormat" = {}}
)
PLUGIN DISCOVERY TYPES
4. YamlDiscovery:
$yaml_discovery = new YamlDiscovery(
'links.action',
$this->moduleHandler->getModuleDirectories()
);
CREATE PLUGIN MANAGER
Drupal Console commands:
• generate:plugin:type:annotation (gpta)
• generate:plugin:type:yaml (gpty)
CREATE PLUGIN MANAGER (Continued)
• DefaultPluginManager
• As a service:
services:
plugin.manager.archiver:
class: DrupalCoreArchiverArchiverManager
parent: default_plugin_manager
CREATE NEW PLUGIN
Drupal Console commands:
• debug:plugin (dpl)
• generate:plugin:skeleton (gps)
USING PLUGIN MANAGER
1.Invoke plugin class:
$type = Drupal::service('plugin.manager.archiver');
1.Get a list of available plugins:
$plugin_definitions = $type->getDefinitions();
1.Get a specific plugin:
$plugin_definition = $type->getDefinition('plugin_id');
1.Create an instance of a plugin:
$plugin = $type->createInstance('plugin_id', ['of' => 'configuration values']);
References
• https://www.drupal.org/docs/8/api/plugin-api
• http://drupalconsole.com/commands
Drupal 8 Plugin API - Manoj K
Drupal 8 Plugin API - Manoj K
Ad

Recommended

Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Acquia
 
Views plugins-in-d7-and-d8
Views plugins-in-d7-and-d8
Frank Holldorff
 
Word press Plugins by WordPress Experts
Word press Plugins by WordPress Experts
Yameen Khan
 
WordPress Plugins
WordPress Plugins
OpenSource Technologies Pvt. Ltd.
 
Headless Drupal
Headless Drupal
drubb
 
Composer & Drupal
Composer & Drupal
drubb
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)
Joseph Chiang
 
Lviv 2013 d7 vs d8
Lviv 2013 d7 vs d8
Andy Postnikov
 
The Drupal 8 plugin system: extensibility for all
The Drupal 8 plugin system: extensibility for all
Bart Feenstra
 
Dcp'15
Dcp'15
Piyuesh Kumar
 
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
LEDC 2016
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mind
Valentine Matsveiko
 
D7 as D8
D7 as D8
Pablo López Escobés
 
Typed data in drupal 8
Typed data in drupal 8
Ihor Karpylenko
 
Drupal 8 Hooks
Drupal 8 Hooks
Sathya Sheela Sankaralingam
 
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
Bart Feenstra
 
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
Bart Feenstra
 
Think Generic - Add API's To Your Custom Modules
Think Generic - Add API's To Your Custom Modules
Jens Sørensen
 
Top 15 most popular drupal 8 modules
Top 15 most popular drupal 8 modules
Innoraft
 
Drupal 8 Deep Dive: Plugin System
Drupal 8 Deep Dive: Plugin System
Acquia
 
ознакомления с модулем Entity api
ознакомления с модулем Entity api
DrupalCamp Kyiv Рысь
 
Field api.From d7 to d8
Field api.From d7 to d8
Pavel Makhrinsky
 
Understanding the Entity API Module
Understanding the Entity API Module
Sergiu Savva
 
Drupal 7 Entity & Entity API
Drupal 7 Entity & Entity API
均民 戴
 
Entity api
Entity api
Bishant Shrestha
 
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
Bart Feenstra
 
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
DrupalMumbai
 
How To Write Dynamic Migrations - Mohit Aghera
How To Write Dynamic Migrations - Mohit Aghera
DrupalMumbai
 
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
DrupalMumbai
 
Being! Black Hat with Drupal - Anand Toshniwal
Being! Black Hat with Drupal - Anand Toshniwal
DrupalMumbai
 

More Related Content

Similar to Drupal 8 Plugin API - Manoj K (18)

The Drupal 8 plugin system: extensibility for all
The Drupal 8 plugin system: extensibility for all
Bart Feenstra
 
Dcp'15
Dcp'15
Piyuesh Kumar
 
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
LEDC 2016
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mind
Valentine Matsveiko
 
D7 as D8
D7 as D8
Pablo López Escobés
 
Typed data in drupal 8
Typed data in drupal 8
Ihor Karpylenko
 
Drupal 8 Hooks
Drupal 8 Hooks
Sathya Sheela Sankaralingam
 
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
Bart Feenstra
 
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
Bart Feenstra
 
Think Generic - Add API's To Your Custom Modules
Think Generic - Add API's To Your Custom Modules
Jens Sørensen
 
Top 15 most popular drupal 8 modules
Top 15 most popular drupal 8 modules
Innoraft
 
Drupal 8 Deep Dive: Plugin System
Drupal 8 Deep Dive: Plugin System
Acquia
 
ознакомления с модулем Entity api
ознакомления с модулем Entity api
DrupalCamp Kyiv Рысь
 
Field api.From d7 to d8
Field api.From d7 to d8
Pavel Makhrinsky
 
Understanding the Entity API Module
Understanding the Entity API Module
Sergiu Savva
 
Drupal 7 Entity & Entity API
Drupal 7 Entity & Entity API
均民 戴
 
Entity api
Entity api
Bishant Shrestha
 
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
Bart Feenstra
 
The Drupal 8 plugin system: extensibility for all
The Drupal 8 plugin system: extensibility for all
Bart Feenstra
 
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
Валентин Мацвейко та Владислав Мойсеєнко — D8: Migrate Yourself: code->module...
LEDC 2016
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mind
Valentine Matsveiko
 
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
The Drupal 8 plugin system: extensibility for all (DrupalCamp Baltics 2015)
Bart Feenstra
 
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
The Drupal 8 plugin system: extensibility for all (Drupalaton 2015)
Bart Feenstra
 
Think Generic - Add API's To Your Custom Modules
Think Generic - Add API's To Your Custom Modules
Jens Sørensen
 
Top 15 most popular drupal 8 modules
Top 15 most popular drupal 8 modules
Innoraft
 
Drupal 8 Deep Dive: Plugin System
Drupal 8 Deep Dive: Plugin System
Acquia
 
ознакомления с модулем Entity api
ознакомления с модулем Entity api
DrupalCamp Kyiv Рысь
 
Understanding the Entity API Module
Understanding the Entity API Module
Sergiu Savva
 
Drupal 7 Entity & Entity API
Drupal 7 Entity & Entity API
均民 戴
 
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
An Introduction to Object-Oriented Programming (SaunaCamp Helsinki 2015)
Bart Feenstra
 

More from DrupalMumbai (15)

20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
DrupalMumbai
 
How To Write Dynamic Migrations - Mohit Aghera
How To Write Dynamic Migrations - Mohit Aghera
DrupalMumbai
 
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
DrupalMumbai
 
Being! Black Hat with Drupal - Anand Toshniwal
Being! Black Hat with Drupal - Anand Toshniwal
DrupalMumbai
 
AMPifying your Drupal 8 Site : higher performance and higher engagement - Par...
AMPifying your Drupal 8 Site : higher performance and higher engagement - Par...
DrupalMumbai
 
Virtual Reality in WEB ! - Vidit Anjaria, Swastik Pareek
Virtual Reality in WEB ! - Vidit Anjaria, Swastik Pareek
DrupalMumbai
 
Building and Maintaining a Healthy Community - Jayesh Katta Ramalingaiah
Building and Maintaining a Healthy Community - Jayesh Katta Ramalingaiah
DrupalMumbai
 
How to use CSS Grids today in the real world - Manjit Singh
How to use CSS Grids today in the real world - Manjit Singh
DrupalMumbai
 
13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS
DrupalMumbai
 
13th Sep - Drupal Global Training Day by TCS - Drupal core advanced overview
13th Sep - Drupal Global Training Day by TCS - Drupal core advanced overview
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Administration
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Administration
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Terminologies
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Terminologies
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Extending Drupal
Drupal Global Training Day by Drupal Mumbai 6th Sep - Extending Drupal
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Intro
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Intro
DrupalMumbai
 
Drupal Mumbai Introduction
Drupal Mumbai Introduction
DrupalMumbai
 
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
DrupalMumbai
 
How To Write Dynamic Migrations - Mohit Aghera
How To Write Dynamic Migrations - Mohit Aghera
DrupalMumbai
 
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
Event Schedule DCM2018 Event Schedule DCM2018 100% 10 Too Many Project Meth...
DrupalMumbai
 
Being! Black Hat with Drupal - Anand Toshniwal
Being! Black Hat with Drupal - Anand Toshniwal
DrupalMumbai
 
AMPifying your Drupal 8 Site : higher performance and higher engagement - Par...
AMPifying your Drupal 8 Site : higher performance and higher engagement - Par...
DrupalMumbai
 
Virtual Reality in WEB ! - Vidit Anjaria, Swastik Pareek
Virtual Reality in WEB ! - Vidit Anjaria, Swastik Pareek
DrupalMumbai
 
Building and Maintaining a Healthy Community - Jayesh Katta Ramalingaiah
Building and Maintaining a Healthy Community - Jayesh Katta Ramalingaiah
DrupalMumbai
 
How to use CSS Grids today in the real world - Manjit Singh
How to use CSS Grids today in the real world - Manjit Singh
DrupalMumbai
 
13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS
DrupalMumbai
 
13th Sep - Drupal Global Training Day by TCS - Drupal core advanced overview
13th Sep - Drupal Global Training Day by TCS - Drupal core advanced overview
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Administration
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Administration
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Terminologies
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Terminologies
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Extending Drupal
Drupal Global Training Day by Drupal Mumbai 6th Sep - Extending Drupal
DrupalMumbai
 
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Intro
Drupal Global Training Day by Drupal Mumbai 6th Sep - Drupal Intro
DrupalMumbai
 
Drupal Mumbai Introduction
Drupal Mumbai Introduction
DrupalMumbai
 
Ad

Recently uploaded (20)

AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
Safe Software
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
OpenPOWER Foundation & Open-Source Core Innovations
OpenPOWER Foundation & Open-Source Core Innovations
IBM
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
Quantum AI: Where Impossible Becomes Probable
Quantum AI: Where Impossible Becomes Probable
Saikat Basu
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
"Database isolation: how we deal with hundreds of direct connections to the d...
"Database isolation: how we deal with hundreds of direct connections to the d...
Fwdays
 
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
AI Agents and FME: A How-to Guide on Generating Synthetic Metadata
Safe Software
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
OpenPOWER Foundation & Open-Source Core Innovations
OpenPOWER Foundation & Open-Source Core Innovations
IBM
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Oh, the Possibilities - Balancing Innovation and Risk with Generative AI.pdf
Priyanka Aash
 
Quantum AI: Where Impossible Becomes Probable
Quantum AI: Where Impossible Becomes Probable
Saikat Basu
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
"Database isolation: how we deal with hundreds of direct connections to the d...
"Database isolation: how we deal with hundreds of direct connections to the d...
Fwdays
 
Ad

Drupal 8 Plugin API - Manoj K

  • 1. DRUPAL 8 PLUGIN API How to make your module extendable using plugins?
  • 2. Manoj K • Drupal Dev, Enthusiast, and Contributor • Sr. Drupal Consultant @ Valuebound • Speaker | Blogger | Mentor • d.o/manojapare • Github/manoj-apare • @manojapare
  • 5. WHEN TO USE? • Plugin • Service
  • 6. PLUGIN SYSTEM: 3 BASE ELEMENTS 1.Plugin Types 2.Plugin Discovery 3.Plugin Factory
  • 7. PLUGIN DISCOVERY TYPES 1. StaticDiscovery: $this->discovery = new StaticDiscovery(); // Add a plugin with a custom value. $this->discovery->setDefinition('test_block', [ 'class' => 'Drupalplugin_testPluginplugin_testmock_blockMockTestBlock', 'metadata' => [ 'custom' => TRUE, ], ]);
  • 8. PLUGIN DISCOVERY TYPES 2. HookDiscovery:/ foreach ($this->moduleHandler->getImplementations($this->hook) as $module) { $result = $this->moduleHandler->invoke($module, $this->hook); foreach ($result as $plugin_id => $definition) { $definition['provider'] = $module; $definitions[$plugin_id] = $definition; } }
  • 9. PLUGIN DISCOVERY TYPES 3. AnnotatedClassDiscovery: @FieldType( id = "datetime", label = @Translation("Date"), description = @Translation("Create and store date values."), default_widget = "datetime_default", default_formatter = "datetime_default", list_class = "DrupaldatetimePluginFieldFieldTypeDateTimeFieldItemList", constraints = {"DateTimeFormat" = {}} )
  • 10. PLUGIN DISCOVERY TYPES 4. YamlDiscovery: $yaml_discovery = new YamlDiscovery( 'links.action', $this->moduleHandler->getModuleDirectories() );
  • 11. CREATE PLUGIN MANAGER Drupal Console commands: • generate:plugin:type:annotation (gpta) • generate:plugin:type:yaml (gpty)
  • 12. CREATE PLUGIN MANAGER (Continued) • DefaultPluginManager • As a service: services: plugin.manager.archiver: class: DrupalCoreArchiverArchiverManager parent: default_plugin_manager
  • 13. CREATE NEW PLUGIN Drupal Console commands: • debug:plugin (dpl) • generate:plugin:skeleton (gps)
  • 14. USING PLUGIN MANAGER 1.Invoke plugin class: $type = Drupal::service('plugin.manager.archiver'); 1.Get a list of available plugins: $plugin_definitions = $type->getDefinitions(); 1.Get a specific plugin: $plugin_definition = $type->getDefinition('plugin_id'); 1.Create an instance of a plugin: $plugin = $type->createInstance('plugin_id', ['of' => 'configuration values']);