Laravel-从扩展类重写父构造函数


Laravel - Override parent constructor from extended class

我从一个包中扩展了一个控制器,这样我就可以编辑它,并避免在使用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中测试这个,它对我有效。让我知道你的结果。感谢