Laravel中依赖注入的问题

问题描述 投票:0回答:1

我刚刚了解了laravel的服务容器和依赖项注入,为了进行尝试,我创建了一个MailgunServiceProvider来实例化mailgun客户端,我还拥有一个名为SendMail的特征,它可以作为Mailgun的包装器。

但是$ mailgun变量返回null,我收到以下消息:

message Call to a member function messages() on null
exception   Symfony\Component\Debug\Exception\FatalThrowableError
file    C:\xampp\htdocs\dogmedia.com\app\Traits\SendMail.php
line    24

MailgunServiceProvider

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Mailgun\HttpClientConfigurator;
use Mailgun\Mailgun;



class MailgunServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(Mailgun::class, function()
        {
            return Mailgun::create(config('mail.mailgun.secret'), 'https://api.eu.mailgun.net');
        });
    }
}

还有我的特质:

<?php
namespace App\Traits;

use Mailgun\Mailgun;


trait SendMail
{

    protected $mailgun;

    public function __construct(Mailgun $mailgun)
    {
        $this->mailgun = $mailgun;
    }


    public function sendMail($view, $mailData, $subject, $to)
    {
        //dd($this->mailgun); this returns null

        $html = view($view, compact('mailData'))->render();

        $result = $this->mailgun->messages()->send(config('mail.mailgun.domain'), [
            'from' => config('mail.from.name').' <'.config('mail.from.address').'>',
            'to' => $to,
            'subject' => $subject,
            'html' => $html,
        ]);

        return $result;
    }


}
php laravel mailgun
1个回答
0
投票

类定义中定义的方法将优先于trait方法。因此,如果您的类定义了构造函数,那么特征的构造函数方法将不会应用。

“基类的继承成员被Trait插入的成员覆盖。优先顺序是当前类的成员覆盖Trait方法,而后者又覆盖继承的方法。” PHP Manual - Traits - Precedence

© www.soinside.com 2019 - 2024. All rights reserved.