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');
}
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);