laravel在null上调用成员函数welcome()

时间:2015-09-27 13:35:09

标签: php email laravel-5.1

我想发送邮件,所以我编写了一个邮件类,这样我就可以传递用户数据来发送邮件。 这是我的代码类Mailer.php

|DataDirectory|\bin\Debug\Calculations.mdf

扩展Mailer类的我的类:

<?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('test@test.com', 'Test');
    });
}
}

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

class UserMailer extends Mailer{

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

我想将此发送给用户ID 1.我的代码出了什么问题? THX

1 个答案:

答案 0 :(得分:0)

问题是$this->mailer属性为null。你希望它可以自动注入框架的IoC机制,但事实并非如此。

为了使某些类通过类型提示自动注入(如在构造函数中),必须在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,请确保不要使用命名空间。