Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CustomerPlugin.php
Go to the documentation of this file.
1 <?php
7 
10 use Magento\Newsletter\Model\SubscriberFactory;
13 use Magento\Customer\Api\Data\CustomerExtensionInterface;
14 
16 {
22  private $subscriberFactory;
23 
27  private $extensionFactory;
28 
32  private $subscriberResource;
33 
37  private $customerSubscriptionStatus = [];
38 
46  public function __construct(
47  SubscriberFactory $subscriberFactory,
48  ExtensionAttributesFactory $extensionFactory,
49  Subscriber $subscriberResource
50  ) {
51  $this->subscriberFactory = $subscriberFactory;
52  $this->extensionFactory = $extensionFactory;
53  $this->subscriberResource = $subscriberResource;
54  }
55 
67  public function afterSave(CustomerRepository $subject, CustomerInterface $result, CustomerInterface $customer)
68  {
69  $resultId = $result->getId();
71  $subscriber = $this->subscriberFactory->create();
72 
73  $subscriber->updateSubscription($resultId);
74  // update the result only if the original customer instance had different value.
75  $initialExtensionAttributes = $result->getExtensionAttributes();
76  if ($initialExtensionAttributes === null) {
78  $initialExtensionAttributes = $this->extensionFactory->create(CustomerInterface::class);
79  $result->setExtensionAttributes($initialExtensionAttributes);
80  }
81 
82  $newExtensionAttributes = $customer->getExtensionAttributes();
83  if ($newExtensionAttributes
84  && $initialExtensionAttributes->getIsSubscribed() !== $newExtensionAttributes->getIsSubscribed()
85  ) {
86  if ($newExtensionAttributes->getIsSubscribed()) {
87  $subscriber->subscribeCustomerById($resultId);
88  } else {
89  $subscriber->unsubscribeCustomerById($resultId);
90  }
91  }
92 
93  $isSubscribed = $subscriber->isSubscribed();
94  $this->customerSubscriptionStatus[$resultId] = $isSubscribed;
95  $initialExtensionAttributes->setIsSubscribed($isSubscribed);
96 
97  return $result;
98  }
99 
108  public function aroundDeleteById(
109  CustomerRepository $subject,
110  callable $deleteCustomerById,
112  ) {
113  $customer = $subject->getById($customerId);
114  $result = $deleteCustomerById($customerId);
116  $subscriber = $this->subscriberFactory->create();
117  $subscriber->loadByEmail($customer->getEmail());
118  if ($subscriber->getId()) {
119  $subscriber->delete();
120  }
121  return $result;
122  }
123 
133  public function afterDelete(CustomerRepository $subject, $result, CustomerInterface $customer)
134  {
135  $subscriber = $this->subscriberFactory->create();
136  $subscriber->loadByEmail($customer->getEmail());
137  if ($subscriber->getId()) {
138  $subscriber->delete();
139  }
140  return $result;
141  }
142 
151  public function afterGetById(CustomerRepository $subject, CustomerInterface $customer)
152  {
153  $extensionAttributes = $customer->getExtensionAttributes();
154 
155  if ($extensionAttributes === null) {
157  $extensionAttributes = $this->extensionFactory->create(CustomerInterface::class);
158  $customer->setExtensionAttributes($extensionAttributes);
159  }
160  if ($extensionAttributes->getIsSubscribed() === null) {
161  $isSubscribed = $this->isSubscribed($customer);
162  $extensionAttributes->setIsSubscribed($isSubscribed);
163  }
164 
165  return $customer;
166  }
167 
174  private function isSubscribed(CustomerInterface $customer)
175  {
176  $customerId = $customer->getId();
177  if (!isset($this->customerSubscriptionStatus[$customerId])) {
178  $subscriber = $this->subscriberResource->loadByCustomerData($customer);
179  $this->customerSubscriptionStatus[$customerId] = isset($subscriber['subscriber_status'])
180  && $subscriber['subscriber_status'] == 1;
181  }
182 
183  return $this->customerSubscriptionStatus[$customerId];
184  }
185 }
$customer
Definition: customers.php:11
__construct(SubscriberFactory $subscriberFactory, ExtensionAttributesFactory $extensionFactory, Subscriber $subscriberResource)
$extensionAttributes
Definition: payment.php:22
$subscriber
Definition: subscribers.php:20
afterDelete(CustomerRepository $subject, $result, CustomerInterface $customer)