@msankhala @MutantMahesh @msankhala
Prerequisites
Disclaimer
<?php
/**
* Implements hook_ctools_plugin_directory().
*/
function MY_MODULE_ctools_plugin_directory($owner, $plugin_type) {
if ($owner == 'panels' && $plugin_type == 'YOUR-PLUGIN-TYPE') {
return "plugins/$plugin_type";
}
}
// YOUR-PLUGIN-TYPE
1. content_type
2. access(visibility rules)
3. context
4. relationships
5. arguments D7 declare your own ctools plugin
D7 ctools content type plugin
D7 ctools access plugin
http://www.php-fig.org/faqs
http://www.php-fig.org/psr/psr-4/
Acme\Foo\ namespace is anchored in src/ then PSR-0 will look for Acme\Foo\Bar class in src/Acme/Foo/Bar.php
http://www.php-fig.org/faqs
http://www.php-fig.org/psr/psr-4/
<?php
/**
* @file
* Contains \Drupal\search\Plugin\Block\SearchBlock.
*/
namespace Drupal\search\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Block\BlockBase;
/**
* Provides a 'Search form' block.
*
* @Block(
* id = "search_form_block",
* admin_label = @Translation("Search form"),
* category = @Translation("Forms")
* )
*/
class SearchBlock extends BlockBase {
}
<?php
/**
* Simple Demo class to show php reflection class.
*/
class DCampHyderabad {
public $location;
function __construct() {
$this->location = 'IIIT';
}
function getLocation() {
return $this->location;
}
}
$ref = new \ReflectionClass('DCampHyderabad');
echo $ref->getDocComment() . PHP_EOL . PHP_EOL;
print_r($ref->getMethods());
PHP Reflection API example:
// Output:
/**
* Simple Demo class to show php reflection class.
*/
Array
(
[0] => ReflectionMethod Object
(
[name] => __construct
[class] => DCampHyderabad
)
[1] => ReflectionMethod Object
(
[name] => getLocation
[class] => DCampHyderabad
)
)Its 'D' in SOLID rule / Inversion of Control
class ShoppingCart {
protected $mailer;
function __construct()
{
$this->mailer = new Mailer();
}
}
class ShoppingCart {
protected $mailer;
function __construct($mailer)
{
$this->foo = $mailer;
}
}
$mailer = new Mailer();
$cart = new ShoppingCart($mailer);Service container are responsible for instantiating classes with all its dependency.
# core/modules/search/search.services.yml
search.search_page_repository:
class: Drupal\search\SearchPageRepository
arguments: ['@config.factory', '@entity.manager']/* Service Container */
$instance = \Drupal::service('search.search_page_repository');Plugin Manager
Discovery
Factory
Mapper
$pluginManager->getDefination();
// $this->discovery->getDefination();
$pluginManager->createInstance(plugin_id, configuration);
// $this->factory->createInstance(plugin_id, configuration);
$pluginManager->getInstance(options);
// $this->mapper->getInstance(options);MyPluginManager::discovery = new AnnotatedClassDiscovery(‘Plugin/Block’, $namespaces,
'Drupal\block\Annotation\Block');
Annotated Plugin Discovery
Hook Based Plugins Discovery
MyPluginManager::discovery = new HookDiscovery($this->moduleHandler, 'block_info');
YAML Based Plugin Discovery
MyPluginManager::discovery = new YamlDiscovery('blocks',
$module_handler->getModuleDirectories());Static Plugin Discovery
MyPluginManager::discovery = new StaticDiscovery();
return new $plugin_class($configuration, $plugin_id, $plugin_definition);
The Default Factory
The Container Factory
return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id,
$plugin_definition);Unraveling the Drupal 8 Plugin System
https://drupalize.me/blog/201409/unravelling-drupal-8-plugin-system
Plugin API overview
https://www.drupal.org/docs/8/api/plugin-api/plugin-api-overview
Drupal 8 Plugin System - Helior Colorado
https://www.youtube.com/watch?v=2o5uY-iOoMo
Peter Wolanin: Drupal 8, where did the code go? From info hook to plugin
Find me on Twitter @MutantMahesh