[英]Issue with dependency injection in laravel
我剛剛了解了 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;
}
}
這是 class 激發我的特質。
<?php
namespace App\Http\Controllers;
use Mailgun\Mailgun;
use Illuminate\Http\Request;
use App\Http\Validators\ContactValidator;
use App\Models\General;
use App\Models\Post;
use App\Traits\SendMail;
class ContactController extends Controller
{
use SendMail;
public function __construct(){}
public function sendContactMail1(Request $request)
{
//$validatedData = $request->validate(ContactValidator::$sendContactMail1);
$mailData =
[
'phone'=> $request->input('phone')
];
$mail = $this->sendMail('emails.contacts.contact-mail-1', $mailData, 'Nuevo contacto en '.config('app.name'), 'gabogabans@gmail.com');
return response()->json([
'mail' => $mail,
]);
}
}
class 定義中定義的方法將優先於特征方法。 因此,如果您的 class 定義了構造函數,則不會應用特征的構造函數方法。
“從基礎 class 繼承的成員被由 Trait 插入的成員覆蓋。優先順序是來自當前 class 的成員覆蓋 Trait 方法,進而覆蓋繼承的方法。” PHP 手冊 - 特征 - 優先級
class RandomClass
{
use SendMail;
public function __construct()
{
}
}
將使用 class 中定義的構造函數,而不是特征中具有相同名稱的方法。
如果您願意,您可以通過讓sendMail
方法從容器中獲取您需要的 Mailgun class 實例來完全避免處理構造函數:
$mailgun = app(\Mailgun\Mailgun::class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.