simple_paypal_field-8.x-1.1/src/EventSubscriber/SimplePayPalFieldEventSubscriber.php
src/EventSubscriber/SimplePayPalFieldEventSubscriber.php
<?php
namespace Drupal\simple_paypal_field\EventSubscriber;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\simple_paypal_field\Event\PaypalSmartButtonsEvent;
use Drupal\simple_paypal_field\Event\PayPalSmartButtonsEvents;
use Drupal\simple_paypal_field\PayPalFieldInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event subscriber for PayPal fields.
*/
class SimplePayPalFieldEventSubscriber implements EventSubscriberInterface {
use StringTranslationTrait;
/**
* Drupal Entity Type Manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Drupal logger.
*
* @var \Drupal\Core\Logger\LoggerChannelInterface
*/
protected $log;
/**
* Class constructor.
*/
public function __construct(EntityTypeManagerInterface $manager, LoggerChannelInterface $log) {
$this->entityTypeManager = $manager;
$this->log = $log;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[PayPalSmartButtonsEvents::APPROVE_ORDER] = ['updateField'];
return $events;
}
/**
* Update PayPal field value with data from PayPal.
*
* @param \Drupal\simple_paypal_field\Event\PaypalSmartButtonsEvent $event
* Event object.
*/
public function updateField(PaypalSmartButtonsEvent $event) {
$fieldInfo = $event->getField();
try {
if ($fieldInfo['entity_type'] && $fieldInfo['entity_id'] && $fieldInfo['bundle']) {
[$entity, $field] = $this->collectInstances($fieldInfo);
$field->setPaymentInfo($event->getDetails());
$entity->save();
}
}
catch (\Throwable $e) {
$this->log->error($e);
}
}
/**
* Loads an entity and field instances according to data if possible.
*
* @param array $fieldInfo
* Entity/Field information.
*
* @return array
* Entity and the field as list.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
* @throws \Drupal\Core\TypedData\Exception\MissingDataException
*/
protected function collectInstances(array $fieldInfo): array {
$entity = $this->entityTypeManager
->getStorage($fieldInfo['entity_type'])
->load($fieldInfo['entity_id']);
// @todo what about base fields?
if ($entity instanceof FieldableEntityInterface) {
if ($entity->hasField($fieldInfo['field'])) {
$field = $entity->get($fieldInfo['field'])->get($fieldInfo['field_id']);
if ($field instanceof PayPalFieldInterface) {
return [$entity, $field];
}
else {
throw new \InvalidArgumentException(
$this->t(
'The field @name is not PayPal field',
['@name' => $fieldInfo['field']]
)
);
}
}
else {
throw new \InvalidArgumentException(
$this->t(
'Entity has no field @name',
['@name' => $fieldInfo['field']]
)
);
}
}
else {
throw new \InvalidArgumentException(
$this->t(
'Entity @type @id not found',
[
'@type' => $fieldInfo['entity_type'],
'@id' => $fieldInfo['entity_id'],
]
)
);
}
}
}
