entity_change_notifier-8.x-1.0/src/Plugin/MessageDestination/DrupalLogger.php

src/Plugin/MessageDestination/DrupalLogger.php
<?php

namespace Drupal\entity_change_notifier\Plugin\MessageDestination;

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Logger\RfcLogLevel;
use Drupal\Core\Plugin\PluginFormInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * A DrupalLogger destination.
 *
 * This class supports any logger backend, such as the default Drupal database
 * log or Monolog. The plugin allows the channel and priority to be configured
 * as well.
 *
 * @MessageDestination(
 *   id = "drupal_logger",
 *   label = @Translation("Logger"),
 * )
 */
class DrupalLogger extends MessageDestinationBase implements PluginFormInterface {

  /**
   * The system logger.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * Constructs a DrupalLogger object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance
   *   containing:
   *     - channel: The logger channel name to write to.
   *     - level: The severity level for logged messages.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\entity_change_notifier\Plugin\MessageDestination\MessageGenerator $generator
   *   The class used to generate the message body.
   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
   *   The logger factory used to retrieve the configured logger channel from.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, MessageGenerator $generator, LoggerChannelFactoryInterface $logger_factory) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $generator);
    $this->logger = $logger_factory->get($this->getConfiguration()['channel']);
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      new MessageGenerator($container->get('jsonapi.link_manager')),
      $container->get('logger.factory')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'channel' => 'entity_change_notifier',
      'level' => RfcLogLevel::DEBUG,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function notify($action, EntityInterface $entity) {
    // @todo We should create an interface, and then have a LogMessage generator.
    $data = $this->generator->createMessage($action, $entity);
    foreach ($data as $key => $value) {
      $data['%' . $key] = $value;
    }

    if ($action != MessageDestinationInterface::ENTITY_DELETE) {
      $data['link'] = $this->t('<a href="@link">View</a>', ['@link' => $data['%uri']]);
    }

    $this->notifyDirect($data);
  }

  /**
   * {@inheritdoc}
   */
  public function notifyDirect(array $data) {
    try {
      $this->logger->log($this->configuration['level'], 'Entity %action on %entity_type %bundle %entity_id.', $data);
    }
    catch (\Exception $e) {
      throw new NotifyException($data, $e, $this->destinationEntityId, 'Unable to log the notification.', $e->getCode());
    }
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['note'] = [
      '#prefix' => '<p>',
      '#markup' => $this->t('All publishing actions are logged by default. In general, sites will not need to use this plugin except for testing the Entity Change Notifier module itself.'),
      '#suffix' => '</p>',
    ];

    $form['channel'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Logger channel'),
      '#description' => $this->t('The channel to log notifications to. Can be any string, but machine names like %module are recommended.', ['%module' => 'entity_change_notifier']),
      '#default_value' => $this->getConfiguration()['channel'],
    ];

    $form['level'] = [
      '#type' => 'select',
      '#title' => $this->t('Log level'),
      '#description' => $this->t('The level to log notifications as.'),
      '#options' => RfcLogLevel::getLevels(),
      '#default_value' => $this->getConfiguration()['level'],
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
    // No additional validation is required.
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration = $form_state->getValues();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc