You are here

class TransformerFactory in Facebook Instant Articles 3.x

Factory class for creating Transformer objects.

Using the factory will ensure that default transformer rules, and any added by other module authors are used. Also handling for logs.

Hierarchy

Expanded class hierarchy of TransformerFactory

3 files declare their use of TransformerFactory
FieldItemListNormalizer.php in src/Normalizer/FieldItemListNormalizer.php
SubtitleFormatter.php in src/Plugin/Field/FieldFormatter/SubtitleFormatter.php
TransformerFormatter.php in src/Plugin/Field/FieldFormatter/TransformerFormatter.php
1 string reference to 'TransformerFactory'
fb_instant_articles.services.yml in ./fb_instant_articles.services.yml
fb_instant_articles.services.yml
1 service uses TransformerFactory
fb_instant_articles.transformer_factory in ./fb_instant_articles.services.yml
Drupal\fb_instant_articles\TransformerFactory

File

src/TransformerFactory.php, line 17

Namespace

Drupal\fb_instant_articles
View source
class TransformerFactory {

  /**
   * Transformer rules manager service.
   *
   * @var \Drupal\fb_instant_articles\TransformerRulesManager
   */
  protected $transformerRulesManager;

  /**
   * Config factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Log output from transformer instances when asked.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * TransformerFactory constructor.
   *
   * @param \Drupal\fb_instant_articles\TransformerRulesManager $transformer_rules_manager
   *   Transformer rules manager service.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   Config factory service.
   * @param \Psr\Log\LoggerInterface $logger
   *   Logger for transformer messages.
   */
  public function __construct(TransformerRulesManager $transformer_rules_manager, ConfigFactoryInterface $config_factory, LoggerInterface $logger) {
    $this->transformerRulesManager = $transformer_rules_manager;
    $this->configFactory = $config_factory;
    $this->logger = $logger;
    $this
      ->setTransformerLogLevel();
  }

  /**
   * Create a new instance of Transformer.
   *
   * @return \Facebook\InstantArticles\Transformer\Transformer
   *   A new Transformer instance loaded with the rules from the transformer
   *   rules manager.
   *
   * @throws \ReflectionException
   */
  public function getTransformer() : Transformer {
    $transformer = new Transformer();

    // Override the default timezone according to the site wide timezone.
    $config_data_default_timezone = $this->configFactory
      ->get('system.date')
      ->get('timezone.default');
    $default_time_zone = !empty($config_data_default_timezone) ? $config_data_default_timezone : @date_default_timezone_get();
    $transformer
      ->setDefaultDateTimeZone(new \DateTimeZone($default_time_zone));
    $this
      ->addRules($transformer);
    return $transformer;
  }

  /**
   * Flush the  logs for the given Transformer instance if any.
   *
   * @todo This is kind of conflating the responsibility of this class. Consider
   *   breaking it out into it's own service.
   *
   * @param \Facebook\InstantArticles\Transformer\Transformer $transformer
   *   A Transformer instance that may or may not have log output.
   */
  public function flushTransformerLogs(Transformer $transformer) {
    $level_map = [
      TransformerLog::DEBUG => LogLevel::DEBUG,
      TransformerLog::ERROR => LogLevel::ERROR,
      TransformerLog::INFO => LogLevel::INFO,
    ];
    if ($logs = $transformer
      ->getLogs()) {
      foreach ($logs as $log) {
        $this->logger
          ->log($level_map[$log
          ->getLevel()], $log
          ->getMessage());
      }
    }
  }

  /**
   * Set the transformer log level according to the configured logging level.
   */
  protected function setTransformerLogLevel() {
    if ($log_level = $this->configFactory
      ->get('fb_instant_articles.settings')
      ->get('transformer_logging_level')) {
      TransformerLog::setLevel($log_level);
    }
    else {
      TransformerLog::setLevel(TransformerLog::ERROR);
    }
  }

  /**
   * Adds rules to the given transformer from the transformer rules manager.
   *
   * @param \Facebook\InstantArticles\Transformer\Transformer $transformer
   *   A transformer instance to add rules to.
   *
   * @throws \ReflectionException
   *   When something goes wrong calling the static createFrom method on
   *   Transformer Rules objects.
   *
   * @see \Facebook\InstantArticles\Transformer\Transformer::loadRules()
   */
  protected function addRules(Transformer $transformer) {
    foreach ($this->transformerRulesManager
      ->getRules() as $rule) {
      $class = $rule['class'];
      $factory_method = NULL;
      try {
        $factory_method = new \ReflectionMethod($class, 'createFrom');
      } catch (\ReflectionException $e) {
        try {
          $factory_method = new \ReflectionMethod('Facebook\\InstantArticles\\Transformer\\Rules\\' . $class, 'createFrom');
        } catch (\ReflectionException $e) {

          // @todo This error message could be more descriptive.
          $this->logger
            ->error('Could not create transformer rule from rule configuration, skipping.');
        }
      }
      if ($factory_method) {
        $transformer
          ->addRule($factory_method
          ->invoke(NULL, $rule));
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
TransformerFactory::$configFactory protected property Config factory.
TransformerFactory::$logger protected property Log output from transformer instances when asked.
TransformerFactory::$transformerRulesManager protected property Transformer rules manager service.
TransformerFactory::addRules protected function Adds rules to the given transformer from the transformer rules manager.
TransformerFactory::flushTransformerLogs public function Flush the logs for the given Transformer instance if any.
TransformerFactory::getTransformer public function Create a new instance of Transformer.
TransformerFactory::setTransformerLogLevel protected function Set the transformer log level according to the configured logging level.
TransformerFactory::__construct public function TransformerFactory constructor.