Question

I am trying to override customer model file below is the code of my di.xml

 <preference for = "Magento\Customer\Model\AccountManagement" type = "Vendor\Module\Model\Rewrite\Customer\AccountManagement" />

Below is code for my model file

 <?php
 namespace Vendor\Module\Model\Rewrite\Customer;

 use Magento\Customer\Api\Data\CustomerInterface;

class AccountManagement extends \Magento\Customer\Model\AccountManagement
{


public function createAccountWithPasswordHash(CustomerInterface $customer, $hash, $redirectUrl = '')
{
    // This logic allows an existing customer to be added to a different store.  No new account is created.
    // The plan is to move this logic into a new method called something like 'registerAccountWithStore'
    if ($customer->getId()) {
        $customer = $this->customerRepository->get($customer->getEmail());
        $websiteId = $customer->getWebsiteId();

        if ($this->isCustomerInStore($websiteId, $customer->getStoreId())) {
            throw new InputException(__('This customer already exists in this store.'));
        }
        // Existing password hash will be used from secured customer data registry when saving customer
    }

    // Make sure we have a storeId to associate this customer with.
    if (!$customer->getStoreId()) {
        if ($customer->getWebsiteId()) {
            $storeId = $this->storeManager->getWebsite($customer->getWebsiteId())->getDefaultStore()->getId();
        } else {
            $storeId = $this->storeManager->getStore()->getId();
        }
        $customer->setStoreId($storeId);
    }

    // Associate website_id with customer
    if (!$customer->getWebsiteId()) {
        $websiteId = $this->storeManager->getStore($customer->getStoreId())->getWebsiteId();
        $customer->setWebsiteId($websiteId);
    }

    // Update 'created_in' value with actual store name
    if ($customer->getId() === null) {
        $storeName = $this->storeManager->getStore($customer->getStoreId())->getName();
        $customer->setCreatedIn($storeName);
    }

    $customerAddresses = $customer->getAddresses() ?: [];
    $customer->setAddresses(null);
    try {
        // If customer exists existing hash will be used by Repository
        $customer = $this->customerRepository->save($customer, $hash);
    } catch (AlreadyExistsException $e) {
        throw new InputMismatchException(
            __('CHANGE THIS TEXT FROM DEFAULT TO CUSTOM ONE.')
        );
    } catch (LocalizedException $e) {
        throw $e;
    }
    try {
        foreach ($customerAddresses as $address) {
             if ($address->getId()) {
                $newAddress = clone $address;
                $newAddress->setId(null);
                $newAddress->setCustomerId($customer->getId());
                $this->addressRepository->save($newAddress);
             } else {
                $address->setCustomerId($customer->getId());
                $this->addressRepository->save($address);
            }
        }
    } catch (InputException $e) {
        $this->customerRepository->delete($customer);
        throw $e;
    }
    $customer = $this->customerRepository->getById($customer->getId());
    $newLinkToken = $this->mathRandom->getUniqueHash();
    $this->changeResetPasswordLinkToken($customer, $newLinkToken);
    //$this->sendEmailConfirmation($customer, $redirectUrl);

    return $customer;
    }  
 }

Above code is not working for me, thrwoing below error.

Notice: Undefined property: Vendor\Module\Model\Rewrite\Customer\AccountManagement\Interceptor::$storeManager in app/code/Vendor/Module/Model/Rewrite/Customer/AccountManagement.php on line 42

All i need to do is i should stop sending emails for new customer registrations. so i have commented out this line

  $this->sendEmailConfirmation($customer, $redirectUrl);

Please anyone suggest on this. Thanks in Advance.

Was it helpful?

Solution

If you want to stop sending emails only, then you can simply override the sendEmailConfirmation function and return false.

use Magento\Customer\Api\Data\CustomerInterface;

...
...

protected function sendEmailConfirmation(CustomerInterface $customer, $redirectUrl)
{
    return false;
}

OTHER TIPS

Please run below command and check:

rm -rf generated/*

php bin/magento c:c

php bin/magento c:f

This path Vendor\Module\Model\Rewrite\Customer\AccountManagement also fine no need to change

I think you haven't injected the proper dependency in your preference:

   <?php

   use Magento\Store\Model\StoreManagerInterface;

   class AccountManagement extends \Magento\Customer\Model\AccountManagement
   {
    /**
     * @var \Magento\Store\Model\StoreManagerInterface
    */
       private $storeManager;

     public function __construct(
        StoreManagerInterface $storeManager,
     ){
        $this->storeManager = $storeManager;
     }

Inject rest dependencys also like this

clear var/*, generated

Also perform setup:upgrade.

Are you getting any error ?

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top