D8 Plugins Creación - pierregermain/MyDrupal GitHub Wiki

Hay muchas formas de crear plugins, vamos a ver cómo crear plugins basados en Annotations.

Plugins basados en Annotations

Podemos usar la consola para generar un plugin basado en annotations

$ drupal generate:plugin:type:annotation

 // Welcome to the Drupal Plugin Type Annotation generator
 Enter the module name [admin_toolbar]:
 > mymodule


 Plugin type class name [ExamplePlugin]:
 > MyPlugin

 Plugin type machine name [my_plugin]:
 > 

 Plugin type label [My plugin]:
 > 

Generated or updated files
 Generation path: /home/pierbert/public_html/be/be3/web
 1 - modules/custom/mymodule/src/Annotation/MyPlugin.php
 2 - modules/custom/mymodule/src/Plugin/MyPluginBase.php
 3 - modules/custom/mymodule/src/Plugin/MyPluginInterface.php
 4 - modules/custom/mymodule/src/Plugin/MyPluginManager.php
 5 - modules/custom/mymodule/mymodule.services.yml


Pasos:

1. Definir el gestor (Plugin Manager)

  • Drupal console crea automáticamente este fichero
  • Esta clase le dice a Drupal cómo se va a descubir el plugin. Por defecto sera por Annotations.
  • Fichero: modules/custom/mymodule_plugins/src/FipsumPluginManager.php
<?php

namespace Drupal\mymodule_plugins;

use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\mymodule_plugins\Annotation\Fipsum;

/**
 * Provides the plugin manager for Fipsum plugins.
 */
class FipsumPluginManager extends DefaultPluginManager {

  public function __construct(\Traversable $namespaces,
                              CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
    $subdir = 'Plugin/Fipsum';
    $plugin_interface = FipsumInterface::class;
    $plugin_definition_annotation_name = Fipsum::class;
    parent::__construct($subdir, $namespaces, $module_handler,
      $plugin_interface, $plugin_definition_annotation_name);
    $this->alterInfo('mymodule_plugins_fipsum_info');
    $this->setCacheBackend($cache_backend, 'mymodule_plugins_fipsum_info');
  }

}

2. Registrar el servicio

  • Drupal console crea automáticamente este fichero
  • Fichero: mymodule.services.yml
services:
  plugin.manager.fipsum:
    class: Drupal\mymodule_plugins\FipsumPluginManager
    parent: default_plugin_manager

3. Annotations

  • Drupal console crea automáticamente este fichero
  • Fichero: src/Annotation/Fipsum.php
  • Definimos propiedad @Annotation con sus atributos necesarios
<?php

namespace Drupal\mymodule_plugins\Annotation;

use Drupal\Component\Annotation\Plugin;

/**
 * Defines a Fipsum annotation object.
 *
 * @see \Drupal\mymodule_plugins\FipsumPluginManager
 * @see plugin_api
 *
 * @Annotation
 */
class Fipsum extends Plugin {

  /**
   * The plugin ID.
   *
   * @var string
   */
  public $id;

  /**
   * The description of the plugin.
   *
   * @var \Drupal\Core\Annotation\Translation
   *
   * @ingroup plugin_translatable
   */
  public $description;

}

4. Definir el Interfaz del tipo de plugin

  • Drupal console crea automáticamente este fichero sin setters ni getters.
  • Fichero: /src/Plugin/MypluginInterface.php
  • Definimos los métodos necesarios que debe usar cada plugin
<?php

namespace Drupal\mymodule_plugins;

/**
 * Interface for all Fipsum type plugins.
 */
interface FipsumInterface {

  public function description();

  public function generate($length);

}

5. Definir la clase base

  • Drupal console crea automáticamente este fichero sin métodos.
  • extiende PluginBase e implementa la interfaz definida anteriormente
  • Fichero: /src/FipsumBase.php
<?php

namespace Drupal\mymodule_plugins;

use Drupal\Component\Plugin\PluginBase;

abstract class FipsumBase extends PluginBase implements
  FipsumInterface {

  public function description() {
    return $this->pluginDefinition['description'];
  }

  abstract public function generate($length);

}

6 Crear plugins que extiendan la clase base

  • Drupal console no crea automáticamente estos ficheros.
  • Directorio contenedor: src/Plugin/Fipsum/

Plugin 1: MymoduleIpsum.php

<?php

namespace Drupal\mymodule_plugins\Plugin\Fipsum;

use Drupal\mymodule_plugins\FipsumBase;

/**
 * Provides an mymoduleIpsum text.
 *
 * @Fipsum(
 * id = "mymodule_ipsum",
 * description = @Translation("mymodule Ipsum text")
 * )
 */
class mymoduleIpsum extends FipsumBase {

  public function generate($length = 100) {
    $content = preg_replace('#<[^>]+>#', ' ',
      file_get_contents('https://www.mymodule.com/master-drupal-8'));
    $content = preg_replace('/\s+/', ' ', $content);
    $content = preg_replace('/[0-9\,\(\)]+/', '', $content);
    $content_array = explode(' ', $content);
    shuffle($content_array);
    return 'mymodule ipsum ' . substr(implode(' ',
        $content_array), 0, $length) . '.';
  }

}

Plugin 2: LoremIpsum.php

<?php

namespace Drupal\mymodule_plugins\Plugin\Fipsum;

use Drupal\mymodule_plugins\FipsumBase;

/**
 * Provides a LoremIpsum text.
 *
 * @Fipsum(
 * id = "lorem_ipsum",
 * description = @Translation("Lorem Ipsum text")
 * )
 */
class LoremIpsum extends FipsumBase {

  public function generate($length = 100) {
    return
      substr(file_get_contents('http://loripsum.net/api/1/verylong/plain
text'), 0, $length) . '.';
  }

}

7 Probar el plugin creado

Usar servicio sin POO

 \Drupal::service('plugin.manager.fipsum')->createInstance('loren_ipsum')->generate(600),

Fichero routing

mymodule_plugins.fipsum:
  path: '/mymodule/plugins/fipsum'
  defaults:
    _controller: '\Drupal\mymodule_plugins\Controller\mymodulePluginsController::fipsum'
    _title: 'Fipsum Test Page'
  requirements:
    _permission: 'access content'

Controlador

<?php
/**
 * @file
 * Contains
 * \Drupal\mymodule_plugins\Controller\mymodulePluginsController.
 */

namespace Drupal\mymodule_plugins\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\mymodule_plugins\FipsumPluginManager;
use Symfony\Component\DependencyInjection\ContainerInterface;

class mymodulePluginsController extends ControllerBase {

  protected $fipsum;

  public function __construct(FipsumPluginManager $fipsum) {
    $this->fipsum = $fipsum;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('plugin.manager.fipsum')
    );
  }

  public function fipsum() {
    $lorem_ipsum = $this->fipsum->createInstance('lorem_ipsum');
    $build['fipsum_lorem_ipsum_title'] = [
      '#markup' => '<h2>' . $lorem_ipsum->description() . '</h2>',
    ];
    $build['fipsum_lorem_ipsum_text'] = [
      '#markup' => '<p>' . $lorem_ipsum->generate(300) . '</p>',
    ];
    $mymodule_ipsum = $this->fipsum->createInstance('mymodule_ipsum');
    $build['fipsum_mymodule_ipsum_title'] = [
      '#markup' => '<h2>' . $mymodule_ipsum->description() . '</h2>',
    ];
    $build['fipsum_mymodule_ipsum_text'] = [
      '#markup' => '<p>' . $mymodule_ipsum->generate(600) . '</p>',
    ];
    return $build;
  }

}
⚠️ **GitHub.com Fallback** ⚠️