【发布时间】:2014-10-29 18:02:32
【问题描述】:
我正在从包中扩展控制器,以便在使用 composer 更新时可以对其进行编辑并避免丢失更改。到目前为止一切正常,但构造函数有问题。
我原来的班级有这个:
class UserRegisterService
{
public function __construct(UserSignupValidator $v = null)
{
//unrelated stuff here
Event::listen('service.activated',
'Jacopo\Authentication\Services\UserRegisterService@sendActivationEmailToClient');
}
}
扩展控制器是:
use Jacopo\Authentication\Services\UserRegisterService;
use Jacopo\Authentication\Validators\UserSignupValidator;
class CustomUserRegisterService extends UserRegisterService
{
public function __construct(UserSignupValidator $v = null)
{
//unrelated stuff here
Event::listen('service.activated',
'CustomUserRegisterService@sendActivationEmailToClient');
}
我有基本相同的东西,我扩展类的更改在 CustomUserRegisterService@sendActivationEmailToClient 内部(基本上我想使用 mandrill 和自定义模板发送与原始控制器不同的电子邮件)。
事件正在触发并且两个函数都被调用,所以当用户被激活时我收到一封重复的电子邮件(在这种情况下就是事件)。我只想调用我的自定义类的构造函数,而另一个需要忽略。
这可能吗?
编辑: 正如 cmets 中所建议的,我在原始构造中评论了 Event::listen 并解决了问题,只发送了一封电子邮件。但这当然不能解决我一更新就会取消注释的问题。
添加return false;在 CustomUserRegisterService@sendActivationEmailToClient 的末尾也不起作用,只在构造函数中注释了事件就可以了。
【问题讨论】:
-
假设您在子类中不是 callent
parent::__constructor,则不应解雇父级的侦听器。父类UserRegisterService是否有可能在您的代码中的其他地方被实例化?你确定是父监听器触发了,而不是子监听器触发了两次? (删除其中一个进行检查。)最后,您可以从侦听器中return false停止事件传播(尽管最好弄清楚它发生的原因并解决它)。 -
电子邮件是不同的(拥有自定义控制器的全部意义在于),所以我知道一个来自旧控制器,也许它不是来自构造函数,我会进一步测试并评论,感谢您的意见
-
在您的父构造函数中,将事件侦听器更改为包含
throw new Exception();的闭包,然后查看堆栈跟踪以查看触发事件的位置。 -
我对父构造函数所做的任何更改都将在我更新作曲家后被删除。这是这个问题的主要问题。
-
不,这只是为了调试。这样您就可以准确地看到父构造函数中的侦听器是从哪里调用的,并隔离是否可能在您的代码中某处创建了父类
UserRegisterService的实例。