Magento 2 - Не удалось сохранить пользовательские данные сущности


Я следовал этому сообщению , чтобы создать свою пользовательскую сущность. Теперь я зарегистрировал наблюдателя в событии "customer_register_success" и попытался сохранить дополнительные данные в своей пользовательской сущности. Это не работает, и я получаю следующее сообщение об ошибке:

Неустранимая ошибка: Вызов неопределенного метода Magento\Клиент\Api\Данные\Пользовательское расширение::сохранить()

Что не так?

Вот мой код наблюдателя:

public function __construct(
        \Psr\Log\LoggerInterface $logger, //log injection
        \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
        \Magento\Customer\Api\Data\CustomerExtensionFactory $customerExtensionFactory
) {

    $this->_logger = $logger;

    $this->_logger->debug('AfterCustomerSaveObserver_Constructor_Begin');

    $this->_customerRepository = $customerRepository;
    $this->_customerExtensionFactory = $customerExtensionFactory;

    $this->_logger->debug('AfterCustomerSaveObserver_Constructor_End');
}

public function execute(\Magento\Framework\Event\Observer $observer) {

    $this->_logger->debug('AfterCustomerSaveObserver_Execute_Begin');

    try { 

        //Get Customer object
        $event = $observer->getEvent();
        $customer = $event->getCustomer();      

        //Get Controller
        $controller = $event->getAccountController();

        //Get Additional Data from Controller
        $userName = $controller->getRequest()->getParam("user_name", "");

        //Create Customer Extension object
        $model = $this->_customerExtensionFactory->create(['customer_id' => $customer->getId()]);

        //Set User Name
        $model->setUserName($userName);

        //Save Customer Extension object
        $model->save();
    } 
    catch(\Exception $e)
    {
        $this->_logger->critical($e);
        $this->_logger->debug('exception');
    } 

    $this->_logger->debug('AfterCustomerSaveObserver_Execute_End');
}
Author: ClassMP, 2016-01-07

1 answers

CustomerExtension не является моделью и, следовательно, не имеет возможности сохранять себя, в основном это просто контейнер данных для атрибутов расширения для CustomerInterface. Вам нужно будет использовать CustomerRepository для сохранения данных.

При работе с атрибутами расширения вы, возможно, определили в extension_attributes.xml подробнее о DevDocs, вот некоторые из задействованных элементов:

// Get the entity Interface from the entity Repository
$entity = $this->entityRepositoryInterface->get($entityId);

// Get existing ExtensionAttributes or create one
$entityExtension = $entity->getExtensionAttributes();
if ($entityExtension == null) {
    $entityExtension = $this->entityExtensionFactory->create();
}

// Set a value on your attribute
$entityExtension->setMyAttribute($value);

// Set the ExtensionAttributes back to the entity
$entity->setExtensionAttributes($entityExtension);

// Save the entity using the repository
$this->entityRepository->save($entity);
 0
Author: mttjohnson, 2016-01-07 18:04:59