Php Laravel-从扩展类重写父构造函数
我正在从包中扩展控制器,以便在使用composer进行更新时编辑它并避免丢失更改。到目前为止,一切正常,但我有一个问题与构造函数 我原来的班级有:Php Laravel-从扩展类重写父构造函数,php,laravel,laravel-4,Php,Laravel,Laravel 4,我正在从包中扩展控制器,以便在使用composer进行更新时编辑它并避免丢失更改。到目前为止,一切正常,但我有一个问题与构造函数 我原来的班级有: class UserRegisterService { public function __construct(UserSignupValidator $v = null) { //unrelated stuff here Event::listen('service.activated',
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和自定义模板)
事件正在触发,并且两个函数都被调用,因此当用户被激活时,我会收到一封重复的电子邮件(在本例中就是这个事件)。我只希望调用自定义类上的构造函数,而需要忽略另一个构造函数
这可能吗
编辑:根据评论中的建议,我对事件::listen进行了评论,这解决了问题,只发送了一封电子邮件。但当然,这并不能解决一个问题,即一旦我更新它就会被取消注释
添加返回假;在…的结尾CustomUserRegisterService@sendActivationEmailToClient也不起作用,只是在构造函数中注释了事件才起作用。只要不调用CustomUserRegisterService类中的父::\uu构造(),UserRegisterService\uu构造将不会执行。但是您必须在CustomUserRegisterService类的构造函数中实现UserRegisterService中的“无关内容”
A类{
公共功能结构($v=”“)
{
呼应“A的构造函数”;
}
}
B类扩展了A类{
公共函数构造()
{
//父项::_构造();
回声“B的构造器”;
}
}
$b=新的b()代码>我没有在CustomUserRegisterService中调用父构造函数,“不相关的东西”是变量,它们都在两个构造函数中。如果我理解正确,父构造函数不应该被执行?也许我在类的其余部分遗漏了其他内容,但我想说的是,事件正在启动两个函数swell,如果CustomUserRegisterService没有调用父构造函数,那么应该是其他内容。试着评论父类Event::listen,看看它是否仍在向您发送两封电子邮件。我在原始Event::listen中对事件进行了评论,但我只收到了一封电子邮件,所以我感到困惑。这两个构造函数都在这里执行。返回错误;damiani建议的也不起作用。假设您在子类中不是被调用的父类::\u构造函数
,则不应触发父类的侦听器。父类UserRegisterService
是否可能正在代码中的其他地方实例化?您确定是父侦听器触发,而不是子侦听器触发两次吗?(删除其中一个以进行检查。)最后,您可以从侦听器返回false
,以停止事件传播(尽管最好弄清楚它发生的原因并解决它)。电子邮件是不同的(拥有自定义控制器的全部意义就在于此),因此我知道其中一个来自旧控制器,也许它不是来自构造函数,我将进一步测试和注释,感谢您在父构造函数中的输入,将事件侦听器更改为包含throw new Exception()的闭包代码>,然后回过头查看堆栈跟踪以查看触发事件的位置。我对父构造函数所做的任何更改都将在编写器更新后删除。这是主要的问题。不,这只是为了调试。通过这种方式,您可以准确地看到父构造函数中的侦听器是从何处调用的,并隔离是否在代码中的某个地方创建了父类UserRegisterService
的实例。