我从一个包中扩展了一个控制器,这样我就可以编辑它,并避免在使用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和自定义模板)。
事件正在启动,并且两个函数都被调用,所以当用户被激活时,我会收到一封重复的电子邮件(在这种情况下就是事件)。我只想调用自定义类上的构造函数,而另一个需要忽略。
这可能吗?
编辑:正如评论中所建议的,我对事件进行了评论::听取了原始构建的内容,解决了问题,只发送了一封电子邮件。当然,这并不能解决我一更新它就会被取消注释的问题。
添加return false;在…的结尾CustomUserRegisterService@sendActivationEmailToClient也不起作用,只是在构造函数中对事件进行了注释。
只要您不调用CustomUserRegisterService类中的parent::__construct(),UserRegisterService __construction就不会被执行。但是您必须在CustomUserRegisterService类__constructor中的UserRegisterService中实现"不相关的东西"。
class A {
public function __construct($v = "")
{
echo "A's constructor";
}
}
class B extends A{
public function __construct()
{
//parent::__construct();
echo "B's constructor";
}
}
$b = new B();
输出:B的构造函数
例如
好的,这里有一个想法,但首先请检查您是否正在代码中的某个地方实例化UserRegisterService。如果是这样的话,那么你必须使它成为singleton。在UserRegisterService类Event::listent中,它表示何时触发"service.activated",并运行UserRegisterService的sendActivationEmailToClient。因此,每当它触发"service.activated"时,系统都会实例化UserRegisterService的对象,然后运行sendActivationEmailToClient函数。现在的问题是,当系统创建UserRegisterService实例时,它会运行构造函数。这意味着它将另一个侦听器添加到事件池中。IMO您要做的是让用户laravel不会多次加载(实例化)UserRegisterService或CustomUserRegisterService。
例如:
//AClass.php in model folder
class AClass
{
public function __construct($v = "")
{
echo "A's constructor <br />";
Event::listen('a.run', 'A@hi');
}
public static function hi()
{
echo "Its me, A's event <br />";
}
}
//BClass.php in model folder
class BClass extends AClass
{
public function __construct()
{
//parent::__construct();
echo "B's constructor <br />";
Event::listen('a.run', 'BClass@hi');
}
public static function hi()
{
echo "Its me, B's event <br />";
}
}
//in app/routes.php or in your service provider
App::singleton('ObjB', function(){
return new BClass();
});
APP::bind('BClass', function(){
return App::make('ObjB');
});
//test the events
Route::get('/', function(){
$b = App::make('ObjB');
echo "1st event trigger ------------ <br/>";
Event::fire('a.run');
echo "2nd event trigger ------------ <br/>";
Event::fire('a.run');
echo "3rd event trigger ------------ <br/>";
Event::fire('a.run');
});
我希望这对你有帮助。我正在laravel 4.2中测试这个,它对我有效。让我知道你的结果。感谢