Dev days Szeged 2014: Plugin system in drupal 8

76
Drupal 8 plugin system aspilicious

description

Drupal dev days 2014 presentation in Szeged. Plugin system in drupal 8. This is the unchanged version of my slides.

Transcript of Dev days Szeged 2014: Plugin system in drupal 8

Page 1: Dev days Szeged 2014: Plugin system in drupal 8

Drupal 8 plugin system aspilicious!

Page 2: Dev days Szeged 2014: Plugin system in drupal 8

About me •  Bram Goffings

@aspilicious

•  Drupal developer

•  Work for Nascom www.nascom.be

•  Maintainer of Display Suite

•  Drupal 8 core contributor

Page 3: Dev days Szeged 2014: Plugin system in drupal 8

Target audience

•  Site builders & module developers

•  Experience with module development

•  Understanding of the hook system

•  Know how to handle object oriented code

Page 4: Dev days Szeged 2014: Plugin system in drupal 8

Success?

•  Nobody is scared anymore

•  Everyone can make a *basic* plugin type

Page 5: Dev days Szeged 2014: Plugin system in drupal 8

Not the expert

•  I’m an end user, just like you

•  Learned by trying (and failing)

•  I can say stupid things

Page 6: Dev days Szeged 2014: Plugin system in drupal 8

Drupal developer •  Mr. Steven

•  Brave drupal 7 expert

•  Made his first Drupal 8 site

•  Wants to build a plugin system

Page 7: Dev days Szeged 2014: Plugin system in drupal 8

Client

•  Mr. Arnold

•  Rich webmaster

•  Loves cars

Page 8: Dev days Szeged 2014: Plugin system in drupal 8

•  I want to choose my favorite car on my profile from a predefined list.

•  It should be possible to plug in different cars into the list.

•  The name and an image of the selected car should placed on the homepage.

Page 9: Dev days Szeged 2014: Plugin system in drupal 8

I take the job…

Page 10: Dev days Szeged 2014: Plugin system in drupal 8

Step 1

I want to choose my favorite car on my profile from a predefined list.

Page 11: Dev days Szeged 2014: Plugin system in drupal 8

Arnold’s wireframe

Page 12: Dev days Szeged 2014: Plugin system in drupal 8

Steven’s plan

•  Add a “Car selector” field

•  Create a custom select widget

Page 13: Dev days Szeged 2014: Plugin system in drupal 8

The drupal 7 way

•  Implements hook_field_widget_info()

•  Implements hook_field_widget_form()

Page 14: Dev days Szeged 2014: Plugin system in drupal 8

Those hooks are gone!

Page 15: Dev days Szeged 2014: Plugin system in drupal 8

They are plugin-y-fied!

Page 16: Dev days Szeged 2014: Plugin system in drupal 8

What is a plugin?

Plugins are small pieces of functionality that are swappable.

Plugins that perform similar functionality are of the same plugin type.

Page 17: Dev days Szeged 2014: Plugin system in drupal 8

Field widget plugins!

•  There is a “widget” plugin type!

•  Each field widget is from that type!

Page 18: Dev days Szeged 2014: Plugin system in drupal 8

Structure

Page 19: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

namespace Drupal\options\Plugin\Field\FieldWidget;

Page 20: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

namespace Drupal\options\Plugin\Field\FieldWidget;

Page 21: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

namespace Drupal\options\Plugin\Field\FieldWidget;

Page 22: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

namespace Drupal\options\Plugin\Field\FieldWidget;

Page 23: Dev days Szeged 2014: Plugin system in drupal 8

Namespaces

•  Namespaces were introduced in PHP 5.3

•  Used to avoid name collisions

Page 24: Dev days Szeged 2014: Plugin system in drupal 8

PSR-0

•  Aims to provide a standard file, class and namespace convention to allow plug-and-play code.

•  Uses the defined namespaces to automatically load files when needed.

•  One on one mapping between namespaces and directory structure.

Page 25: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

namespace Drupal\options\Plugin\Field\FieldWidget;

Page 26: Dev days Szeged 2014: Plugin system in drupal 8

Structure

Page 27: Dev days Szeged 2014: Plugin system in drupal 8

PSR-4

•  “New standard”

•  Makes alternative mapping possible

•  Drupal will use it to remove “unneeded” folders. The empty *drupal* and *module-name* folder won’t be needed anymore.

Page 28: Dev days Szeged 2014: Plugin system in drupal 8

Let’s recap

•  We know how to find plugins

•  We understand namespaces and the directory structure

•  We understand PSR-0 and the difference between PSR-4

Page 29: Dev days Szeged 2014: Plugin system in drupal 8

SelectWidget.php

Page 30: Dev days Szeged 2014: Plugin system in drupal 8

Available methods

Page 31: Dev days Szeged 2014: Plugin system in drupal 8

Car module structure

Page 32: Dev days Szeged 2014: Plugin system in drupal 8

car.info.yml

Page 33: Dev days Szeged 2014: Plugin system in drupal 8
Page 34: Dev days Szeged 2014: Plugin system in drupal 8

Step 1: done

Page 35: Dev days Szeged 2014: Plugin system in drupal 8
Page 36: Dev days Szeged 2014: Plugin system in drupal 8

Let’s recap

•  We know how to start with writing a field widget plugin

•  We know how to start writing a custom module

Page 37: Dev days Szeged 2014: Plugin system in drupal 8

Step 2

It should be possible to plug in different cars into the list.

Page 38: Dev days Szeged 2014: Plugin system in drupal 8

Steven’s plan

•  Create a custom plugin type named “Car”

•  Create two sample car plugins

Page 39: Dev days Szeged 2014: Plugin system in drupal 8

Custom plugin type

•  Create a plugin manager service record

•  Create an annotation class

•  Create the plugin manager class

Page 40: Dev days Szeged 2014: Plugin system in drupal 8

Custom plugin type

Page 41: Dev days Szeged 2014: Plugin system in drupal 8

car.services.yml

Page 42: Dev days Szeged 2014: Plugin system in drupal 8
Page 43: Dev days Szeged 2014: Plugin system in drupal 8
Page 44: Dev days Szeged 2014: Plugin system in drupal 8

Car module structure (part 2)

Page 45: Dev days Szeged 2014: Plugin system in drupal 8

Sample plugins

Page 46: Dev days Szeged 2014: Plugin system in drupal 8

Sample plugins

Page 47: Dev days Szeged 2014: Plugin system in drupal 8

getOptions() v2

Page 48: Dev days Szeged 2014: Plugin system in drupal 8

Debug output

Page 49: Dev days Szeged 2014: Plugin system in drupal 8

Car module structure (part 3)

Page 50: Dev days Szeged 2014: Plugin system in drupal 8

Let’s recap

•  We know how to write a basic plugin manager

•  We know how to handle annotations

•  We know how to get all the plugin definitions

Page 51: Dev days Szeged 2014: Plugin system in drupal 8

Disadvantage

Each car requires a plugin

Page 52: Dev days Szeged 2014: Plugin system in drupal 8

Derivative

•  Allows you to create multiple plugin definitions through a single plugin class.

Page 53: Dev days Szeged 2014: Plugin system in drupal 8

Derivative example!

•  Create a yml file containing cars!

•  Create a derivative plugin!

•  Create a definition for each car in the yml file!

Page 54: Dev days Szeged 2014: Plugin system in drupal 8

cars-example.yml

Page 55: Dev days Szeged 2014: Plugin system in drupal 8

YamlCar.php

Page 56: Dev days Szeged 2014: Plugin system in drupal 8
Page 57: Dev days Szeged 2014: Plugin system in drupal 8

Step 2: done

Page 58: Dev days Szeged 2014: Plugin system in drupal 8
Page 59: Dev days Szeged 2014: Plugin system in drupal 8

Let’s recap

•  We know when to use derivatives

•  We are able to build one

Page 60: Dev days Szeged 2014: Plugin system in drupal 8

Step 3

The name and an image of the selected car should placed on the homepage.

Page 61: Dev days Szeged 2014: Plugin system in drupal 8

Steven’s plan

•  Add a function to the plugins that returns an image url

•  Create the frontpage

Page 62: Dev days Szeged 2014: Plugin system in drupal 8
Page 63: Dev days Szeged 2014: Plugin system in drupal 8
Page 64: Dev days Szeged 2014: Plugin system in drupal 8
Page 65: Dev days Szeged 2014: Plugin system in drupal 8
Page 66: Dev days Szeged 2014: Plugin system in drupal 8
Page 67: Dev days Szeged 2014: Plugin system in drupal 8

hook_menu is gone!

Page 68: Dev days Szeged 2014: Plugin system in drupal 8

car.routing.yml

Page 69: Dev days Szeged 2014: Plugin system in drupal 8
Page 70: Dev days Szeged 2014: Plugin system in drupal 8
Page 71: Dev days Szeged 2014: Plugin system in drupal 8
Page 72: Dev days Szeged 2014: Plugin system in drupal 8

Car module structure (part 4)

Page 73: Dev days Szeged 2014: Plugin system in drupal 8

Let’s recap

•  We figured out how to add a function to a plugin

•  We know how to create a plugin instance

•  We saw how we should create our routes

•  We learned how to build a page controller

Page 74: Dev days Szeged 2014: Plugin system in drupal 8

The end

Page 75: Dev days Szeged 2014: Plugin system in drupal 8

Questions?

Page 76: Dev days Szeged 2014: Plugin system in drupal 8

THANK YOU!