2015-09-27 87 views
1

我想发送邮件,所以我编了一个邮件类,所以我可以通过用户数据发送给他的邮件。 这里是我的代码类Mailer.phplaravel呼吁成员函数欢迎()null

<?php 
use Mail; 
abstract class Mailer{ 
public function sendTo($user, $subject,$view, $data = []) 
{ 
    Mail::send($view, $data, function($message) 
    { 
     $message->to($user->email, $user->firstname) 
      ->subject($subject) 
      ->from('[email protected]', 'Test'); 
    }); 
} 
} 

我的类,扩展了梅勒类:

class UserMailer extends Mailer{ 

public function welcome(User $user){ 
    $view = 'emails.welcome'; 
    $data = []; 
    $subject = 'test subject'; 
    return $this->sendTo($user, $subject, $view, $data); 
} 

我想从任何控制器调用这个类,所以我可以传递用户数据要发送邮件,但我总是得到这个错误呼叫到空的成员函数的欢迎():也许我做错了什么:

use App\UserMailer as Mailer ; 

class TestController extends Controller 
{ 
protected $mailer; 
public function __construct(Mailer $mailer) 
{ 
    $this->mailer; 
} 
public function testMailer() 
{ 
    $this->mailer->welcome()->sendTo(1); 
    return 'done'; 
} 

我想给这对用户ID 1.什么是错我的代码? thx

回答

0

问题是,$this->mailer属性为空。您预计它会自动注入框架的IoC机制,但事实并非如此。

为了让某些类通过typehinting自动注入(如在构造函数中),您必须在IoC容器中注册该类。赞(在你/app/Providers/AppServiceProvider.php):

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     ... 

     $this->app->bind(\App\Contracts\Mailer::class, \App\MyMailerImplementation::class); 

     ... 
    } 

} 

确保定义\App\Contracts\Mailer合同第一(只为你的邮件程序接口),并且疗法力你Mailer类实现继承,并通过类似实现该接口:

use App\Contracts\Mailer as MailerContract; 

class MyMailerImplementation implements MailerContract { 
    ... 
} 

注意:您只能使用Mailer而不是MyMailerImplementation,只要确保不要混淆命名空间。