D8 Plugins Creación - pierregermain/MyDrupal GitHub Wiki
Hay muchas formas de crear plugins, vamos a ver cómo crear 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:
- 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');
}
}
- Drupal console crea automáticamente este fichero
- Fichero:
mymodule.services.yml
services:
plugin.manager.fipsum:
class: Drupal\mymodule_plugins\FipsumPluginManager
parent: default_plugin_manager
- 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;
}
- 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);
}
- 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);
}
- 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) . '.';
}
}
\Drupal::service('plugin.manager.fipsum')->createInstance('loren_ipsum')->generate(600),
mymodule_plugins.fipsum:
path: '/mymodule/plugins/fipsum'
defaults:
_controller: '\Drupal\mymodule_plugins\Controller\mymodulePluginsController::fipsum'
_title: 'Fipsum Test Page'
requirements:
_permission: 'access content'
<?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;
}
}