Как программно добавить клиента в Magento 2?

13

Мне нужно создать клиента программно в Magento 2, я не нашел много документации вокруг ... в основном мне нужно перевести следующий код в «Magento 2»:

$websiteId = Mage::app()->getWebsite()->getId();
$store = Mage::app()->getStore();

$customer = Mage::getModel("customer/customer");
$customer   ->setWebsiteId($websiteId)
            ->setStore($store)
            ->setFirstname('John')
            ->setLastname('Doe')
            ->setEmail('jd1@ex.com')
            ->setPassword('somepassword');

try{
    $customer->save();
}
Эдуардо
источник
Вы хотите сделать это в автономном сценарии, или у вас есть модель или что-то?
Мариус
@Marius, я работал над этим модулем и создал контроллер. Для этого контроллера мне нужно подготовить некоторые данные для сохранения, и идея состоит в том, чтобы вызвать модель клиента и сохранить эту информацию. Приведенный выше код может быть помещен в контроллер. Я хотел бы сделать то же самое, но для Magento 2. Я все еще немного запутался с новой структурой Magento 2 и застрял здесь сейчас ... Я знаю, что это как-то связано с инъекциями классов и объекты, но я не уверен, как это сделать ...
Эдуардо

Ответы:

20

Хорошо, через некоторое время я нашел решение на тот случай, если кому-то еще это нужно. Magento использует другой подход для создания объектов, традиционный способ создания объектов в Magento 1.x - это «Mage :: getModel (..)», это изменились в Magento 2. Теперь Magento использует менеджер объектов для создания экземпляров объектов, я не буду вдаваться в подробности о том, как это работает ... поэтому эквивалентный код для создания клиентов в Magento 2 будет выглядеть следующим образом:

<?php

namespace ModuleNamespace\Module_Name\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action
{
    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $storeManager;

    /**
     * @var \Magento\Customer\Model\CustomerFactory
     */
    protected $customerFactory;

    /**
     * @param \Magento\Framework\App\Action\Context      $context
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     * @param \Magento\Customer\Model\CustomerFactory    $customerFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Customer\Model\CustomerFactory $customerFactory
    ) {
        $this->storeManager     = $storeManager;
        $this->customerFactory  = $customerFactory;

        parent::__construct($context);
    }

    public function execute()
    {
        // Get Website ID
        $websiteId  = $this->storeManager->getWebsite()->getWebsiteId();

        // Instantiate object (this is the most important part)
        $customer   = $this->customerFactory->create();
        $customer->setWebsiteId($websiteId);

        // Preparing data for new customer
        $customer->setEmail("email@domain.com"); 
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");

        // Save data
        $customer->save();
        $customer->sendNewAccountEmail();
    }
}

Надеюсь, этот фрагмент кода поможет кому-то еще ..

Эдуардо
источник
6
Вы были очень близки Вы должны избегать непосредственного использования objectManager - это плохая форма. Правильный способ сделать это - использовать внедрение зависимостей, чтобы получить класс фабрики, и использовать его для создания экземпляра. Если фабричный класс не существует для данного класса, он будет сгенерирован автоматически. Я отредактировал ваш код, чтобы использовать это (добавил фабрику в конструктор и класс и вызвал create ()) и следовал стандартам кода PSR-2.
Райан Херр
Спасибо за исправление @RyanH. Я думал об использовании фабричных классов, но не знал, как это сделать, поэтому я использовал objectManager ... Я буду читать больше о стандартах кода PSR-2 для будущих проектов. Я использую код с вашими исправлениями сейчас, и все работает отлично. Спасибо
Эдуардо
@RyanH. Выполнено ; )
Эдуардо
Я могу видеть это в базах данных, но не для панели администратора. Что происходит?
Арни
1
@Arni; мое первое предположение, что вам нужно будет переиндексировать :)
Алекс Тиммер
4

Вот простой способ создать нового клиента с группой по умолчанию и текущим магазином.

use Magento\Framework\App\RequestFactory;
use Magento\Customer\Model\CustomerExtractor;
use Magento\Customer\Api\AccountManagementInterface;

class CreateCustomer extends \Magento\Framework\App\Action\Action
{
    /**
     * @var RequestFactory
     */
    protected $requestFactory;

    /**
     * @var CustomerExtractor
     */
    protected $customerExtractor;

    /**
     * @var AccountManagementInterface
     */
    protected $customerAccountManagement;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param RequestFactory $requestFactory
     * @param CustomerExtractor $customerExtractor
     * @param AccountManagementInterface $customerAccountManagement
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        RequestFactory $requestFactory,
        CustomerExtractor $customerExtractor,
        AccountManagementInterface $customerAccountManagement
    ) {
        $this->requestFactory = $requestFactory;
        $this->customerExtractor = $customerExtractor;
        $this->customerAccountManagement = $customerAccountManagement;
        parent::__construct($context);
    }

    /**
     * Retrieve sources
     *
     * @return array
     */
    public function execute()
    {
        $customerData = [
            'firstname' => 'First Name',
            'lastname' => 'Last Name',
            'email' => 'customer@email.com',
        ];

        $password = 'MyPass123'; //set null to auto-generate

        $request = $this->requestFactory->create();
        $request->setParams($customerData);

        try {
            $customer = $this->customerExtractor->extract('customer_account_create', $request);
            $customer = $this->customerAccountManagement->createAccount($customer, $password);
        } catch (\Exception $e) {
            //exception logic
        }
    }
}
Николас Миллер
источник
Что такое $ request здесь? Можем ли мы добавить собственные атрибуты?
Джафар Пинджар
Как установить пользовательские атрибуты?
Джафар Пинджар
0

Этот код запускается во внешнем файле или файле консоли CLI Magento

namespace Company\Module\Console;

use Braintree\Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Framework\App\Bootstrap;


class ImportProducts extends Command
{

    public function magentoStart()
    {
        $startMagento = $this->bootstrap();
        $state = $startMagento['objectManager']->get('Magento\Framework\App\State');
        $state->setAreaCode('frontend');
        return $startMagento['objectManager'];
    }

    protected function bootstrap()
    {
        require '/var/www/html/app/bootstrap.php';
        $bootstrap = Bootstrap::create(BP, $_SERVER);
        $objectManager = $bootstrap->getObjectManager();
        return array('bootstrap' => $bootstrap, 'objectManager' => $objectManager);
    }

    protected function createCustomers($item)
    {
        $objectManager      = $this->magentoStart();
        $storeManager       = $objectManager->create('Magento\Store\Model\StoreManagerInterface');
        $customerFactory    = $objectManager->create('Magento\Customer\Model\CustomerFactory');

        $websiteId  = $storeManager->getWebsite()->getWebsiteId();
        $customer   = $customerFactory->create();
        $customer->setWebsiteId($websiteId);
        $customer->setEmail("eu@mailinator.com");
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");
        $customer->save();
    }
}
Израиль Гвидо
источник
0

Все приведенные выше примеры будут работать, но стандартным способом всегда должно быть использование сервисных контрактов, а не конкретных классов.

Следовательно, нижеуказанные способы должны быть предпочтительными для создания клиента программно.

                /** @var \Magento\Customer\Api\Data\CustomerInterface $customer */
                $customer = $this->customerFactory->create();
                $customer->setStoreId($store->getStoreId());
                $customer->setWebsiteId($store->getWebsiteId());
                $customer->setEmail($email);
                $customer->setFirstname($firstName);
                $customer->setLastname($lastName);

                /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository*/
                $customerRepository->save($customer);
Милинд Сингх
источник