Magento 2 Catch customer creation event on both frontend and admin

相关的事件有三个:

customer_register_success
adminhtml_customer_save_after
customer_save_after

customer_register_success 成功创建用户事件,只作用于前端,管理后台创建新的用户是不会触发这个事件的。

adminhtml_customer_save_after 只作用于管理后台客户详情页,每次保存都会触发,但是客户列表页的行内修改不会触发该事件。

customer_save_after 每次客户信息保存都会触发该事件。

所以我们怎么才能抓住前后台都有效的新用户创建事件呢?

方法一

利用 Magento\Customer\Model\AccountManagement,由于所有的新用户创建都要调用该类的 createAccount 方法。所以我们可以用 plugin 。

如果我们要拿到新创建的用户,那么可以参考下列代码:

<type name="Magento\Customer\Model\AccountManagement">
        <plugin name="vendor_name_plugin_name" type="vendor\module\Plugin\AccountManagement" sortOrder="1" />
</type>
public function afterCreateAccountWithPasswordHash(
        \Magento\Customer\Model\AccountManagement $subject,
        $customer
    ) {
        // Magento\Customer\Model\Data\Customer
        $email = $customer->getEmail();
        $name = $customer->getFirstname();
        $id = $customer->getId();
        // your code
        // important!
        return $customer;
    }

方法二

利用 Observer 得到的 Model 的 isObjectNew() 方法。该方法位于 \Magento\Framework\Model\AbstractModel

它的声明如下:

     /**
     * Check object state (true - if it is object without id on object just created)
     * This method can help detect if object just created in _afterSave method
     * problem is what in after save object has id and we can't detect what object was
     * created in this transaction
     *
     * @param bool|null $flag
     * @return bool
     */
    public function isObjectNew($flag = null)
    {
        if ($flag !== null) {
            $this->_isObjectNew = $flag;
        }
        if ($this->_isObjectNew !== null) {
            return $this->_isObjectNew;
        }
        return !(bool)$this->getId();
    }

但它只能用在 customer_save_before 中,所以如果我们需要在 customer_save_after 中得到该对象是不是新的对象,可以通过在 customer_save_before 中设置自己的值,然后在 after 的时候取。

比如:
beforeObserver

$customer = $observer->getEvent()->getCustomer();
if ($customer->isObjectNew()) {
    $customer->setCustomIsObjNew(true);
}

afterObserver

$customer = $observer->getEvent()->getCustomer();
if ($customer->getCustomIsObjNew()) {
    // your code
}

相关连接

https://magento.stackexchange.com/questions/210904/magento-2-catch-customer-creation-event-on-both-frontend-and-admin/210906#210906

发表评论

电子邮件地址不会被公开。 必填项已用*标注