{ Hello Magento 2 }

解决 Magento 2 应用问题,更注重深度挖掘。(ง •̀_•́)ง

0%

Magento 2 Catch customer creation event on both frontend and admin

相关的事件有三个:

1
2
3
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 。

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

1
2
3
<type name="Magento\Customer\Model\AccountManagement">
<plugin name="vendor_name_plugin_name" type="vendor\module\Plugin\AccountManagement" sortOrder="1" />
</type>
1
2
3
4
5
6
7
8
9
10
11
12
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

它的声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 /**
* 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 boolnull $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

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

afterObserver

1
2
3
4
$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