Laravel 5.2 - 用户注册后发送欢迎电子邮件

时间:2017-06-05 01:14:54

标签: php laravel email events listener

我想在用户注册后发送一些电子邮件。 但是,它做得很好。我的SMTP邮件中没有收到电子邮件。我正在使用mailtrap.io。

我已经设置了一个带有NewUserRegistered监听器的Registered事件。

在我的NewUserRegistered Controller \ Auth \ AuthController 中,如下所示:

    <?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Log;
use Validator;
use Mail;

class AuthController extends Controller {
    /*
            |--------------------------------------------------------------------------
            | Registration & Login Controller
            |--------------------------------------------------------------------------
            |
            | This controller handles the registration of new users, as well as the
            | authentication of existing users. By default, this controller uses
            | a simple trait to add these behaviors. Why don't you explore it?
            |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct() {
        $this->middleware($this->guestMiddleware(), [
            'except' => 'logout'
        ]);



        }



    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data) {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'matric' => 'required|max:5',
            'faculty' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
            'address' => 'required',
            'phone' => 'required',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data) {


        return User::create([
            'name' => $data['name'],
            'matric' => $data['matric'],
            'faculty' => $data['faculty'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'address' => $data['address'],
            'phone' => $data['phone'],
        ]);

        event(new Registered($user));

    //sreturn User;
    }
}

在我已注册的活动中,如下所示:

    <?php

namespace App\Events;

use App\Events\Registered;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class Registered extends Event
{
    use SerializesModels;
    /**
     * @var
     */
    public $user;

    /**
     * Create a new event instance.
     *
     * @param $user
     */
    public function __construct($user)
    {
        //
        $this->user = $user;
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return [];
    }
}

在我的NewUserRegistered 听众中,如下所示:

    <?php


    namespace App\Listeners;

    use App\Events\Registered;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Mailer;
    use Mail;

    class NewUserRegistered
    {
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }


    /**
     * Handle the event.
     *
     * @param  Registered  $event
     * @return void
     */
    public function welcome(Registered $event)
  {
     $data = [
       'user' => $event->user,
          'from' => 'hello@test.dev',
          'subject' => 'Welcome to test'
    ];


        $this->mailer->send('emails.auth.verify', $data, function($message) {
            $message->to($data['user']->email, $data['user']->matric)
                    ->subject($data['subject']);
        });
    }
}

2 个答案:

答案 0 :(得分:2)

您的活动永远不会触发,因为您在创建用户后会返回该用户。尝试时,您的代码应该抛出错误。将您的代码更改为此。

use App\Events\Registered;

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'matric' => $data['matric'],
        'faculty' => $data['faculty'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'address' => $data['address'],
        'phone' => $data['phone'],
    ]);

    event(new Registered($user));

    return $user;
}

另外请务必注册您的事件监听器。

答案 1 :(得分:1)

您的解决方案可能存在以下几个潜在问题:

  • Controller \ Auth \ AuthController 中,您尚未将Registered事件导入命名空间。尝试将use App\Events\Registered;添加到顶部。
  • NewUserRegistered 中,您已定义了#welcome方法,但Laravel事件侦听器需要#handle方法。 See the Laravel docs on Events了解更多信息。

除此之外,您可能会遇到Mailtrap凭据问题。

相关问题