final class EntityPublishedInterfaceLinkProvider in JSON:API Hypermedia 8
Class EntityPublishedInterfaceLinkProvider.
This example shows how a link provider can provide easy-to-follow links that further decouple a client implementation from the backend. In this case, the client no longer needs to hard-code the correct field name to update on a per-resource-type basis, nor does it need to perform complicated business logic to check if the resource is already published or not—the presence of the link conveys that information. Finally, if the backend later decides that some user role is no allowed to publish content, the client does not need to be updated to account for that change (the link will just disappear).
@JsonapiHypermediaLinkProvider( id = "jsonapi_hypermedia.entity_published", deriver = "Drupal\jsonapi_hypermedia\Plugin\Derivative\EntityPublishedInterfaceLinkProviderDeriver", )
@internal
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\jsonapi_hypermedia\Plugin\LinkProviderBase implements LinkProviderInterface
- class \Drupal\jsonapi_hypermedia\Plugin\jsonapi_hypermedia\LinkProvider\EntityPublishedInterfaceLinkProvider implements ContainerFactoryPluginInterface uses ResourceObjectEntityLoaderTrait
- class \Drupal\jsonapi_hypermedia\Plugin\LinkProviderBase implements LinkProviderInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of EntityPublishedInterfaceLinkProvider
File
- examples/
Plugin/ jsonapi_hypermedia/ LinkProvider/ EntityPublishedInterfaceLinkProvider.php, line 33
Namespace
Drupal\jsonapi_hypermedia\Plugin\jsonapi_hypermedia\LinkProviderView source
final class EntityPublishedInterfaceLinkProvider extends LinkProviderBase implements ContainerFactoryPluginInterface {
use ResourceObjectEntityLoaderTrait;
/**
* The published status internal field name.
*
* @var string
*/
protected $statusFieldName;
/**
* {@inheritdoc}
*/
protected function __construct(array $configuration, string $plugin_id, mixed $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
assert(!empty($configuration['status_field_name']) && is_string($configuration['status_field_name']), "The status_field_name configuration value is required.");
$this->statusFieldName = $configuration['status_field_name'];
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$provider = new static($configuration, $plugin_id, $plugin_definition);
$provider
->setEntityRepository($container
->get('entity.repository'));
return $provider;
}
/**
* {@inheritdoc}
*/
public function getLink($resource_object) {
assert($resource_object instanceof ResourceObject);
$resource_type = $resource_object
->getResourceType();
$entity = $this
->loadEntityFromResourceObject($resource_object);
assert($entity instanceof EntityPublishedInterface);
$plugin_definition = $this
->getPluginDefinition();
$published = $entity
->isPublished();
$publish_operation = $plugin_definition['link_key'] === 'publish';
$access_result = AccessResult::allowedIf($publish_operation !== $published)
->andIf($entity
->access('update', NULL, TRUE))
->andIf($entity->{$this->statusFieldName}
->access('edit', NULL, TRUE))
->addCacheableDependency($entity);
$link_attributes = [
'data' => [
'type' => $resource_object
->getTypeName(),
'id' => $resource_object
->getId(),
'attributes' => [
$resource_type
->getPublicName($this->statusFieldName) => (int) (!$published),
],
],
];
return AccessRestrictedLink::createLink($access_result, CacheableMetadata::createFromObject($resource_object), $resource_object
->toUrl(), $this
->getLinkRelationType(), $link_attributes);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
EntityPublishedInterfaceLinkProvider:: |
protected | property | The published status internal field name. | |
EntityPublishedInterfaceLinkProvider:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
EntityPublishedInterfaceLinkProvider:: |
public | function |
Adds, alters or removes hyperlinks from a link collection. Overrides LinkProviderInterface:: |
|
EntityPublishedInterfaceLinkProvider:: |
protected | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: |
|
LinkProviderBase:: |
public | function |
Gets the link object key for the provided link. Overrides LinkProviderInterface:: |
|
LinkProviderBase:: |
public | function |
Gets the link relation type for the provided link. Overrides LinkProviderInterface:: |
1 |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
ResourceObjectEntityLoaderTrait:: |
protected | property | The entity repository. | |
ResourceObjectEntityLoaderTrait:: |
public | function | Gets the entity represented by the given resource object. | |
ResourceObjectEntityLoaderTrait:: |
protected | function | Sets the entity repository. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |