【问题标题】:How to dispatch an event in laravel 8?如何在 laravel 8 中调度事件?
【发布时间】:2021-11-20 00:51:32
【问题描述】:

我在我的应用程序中手动实现用户注册,但我无法理解 laravel 8 文档的这一部分

如果您在应用程序中手动实现注册而不是使用入门工具包,则应确保在用户注册成功后调度 Illuminate\Auth\Events\Registered 事件:

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

我尝试了不同的方法,但最后我无法理解这一点,并且没有发送电子邮件 这是我的注册码 公共函数 storeUser(Request $request){

        $validated = $request->validate([
            'first_name' => 'required',
            'last_name' => 'required',
            'email'  => 'required|email:rfc,dns',
            'password' => ['required','confirmed', Password::min(8)],
            'phone_number' => 'required'
            
        ]);
        
        $registeredDetails = User::create([
            'first_name' => $request->first_name,
            'last_name' => $request->last_name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'phone_number' => $request->phone_number
        ]);
        
        
}

我的问题是我应该在哪里发送文档所说的这个事件?

这是我的 UserControler 的顶部

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Auth\Events\Registered;

这是 env 中的邮件代码

MAIL_MAILER=smtp
MAIL_HOST=kokayazanzibar.com
MAIL_PORT=465
MAIL_USERNAME=demo@kokayazanzibar.com
MAIL_PASSWORD=ienteredmypasswordhere
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=demo@kokayazanzibar.com
MAIL_FROM_NAME="${APP_NAME}"

这里是 EventServiceProvider

    class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

【问题讨论】:

    标签: laravel-8 email-verification


    【解决方案1】:

    在您的应用程序中创建用户后,您将分派它。

    在你的情况下:

    $validated = $request->validate([
        'first_name' => 'required',
        'last_name' => 'required',
        'email'  => 'required|email:rfc,dns',
        'password' => ['required','confirmed', Password::min(8)],
        'phone_number' => 'required'        
    ]);
            
    $registeredDetails = User::create([
        'first_name' => $request->first_name,
        'last_name' => $request->last_name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
        'phone_number' => $request->phone_number
    ]);
        
    event(new Registered($registeredDetails));
    

    【讨论】:

    • 我实际上尝试了这个并且电子邮件没有发送所以我怀疑这可能不是触发发送电子邮件事件的正确方法
    • @alphillips 您是否设置了监听器来发送电子邮件?
    • 除了文档中所说的“一旦这个接口被添加到你的模型中,新注册的用户将自动收到一封包含电子邮件验证链接的电子邮件。作为通过检查应用程序的 App\Providers\EventServiceProvider 可以看到,Laravel 已经包含一个 SendEmailVerificationNotification 侦听器,该侦听器附加到 Illuminate\Auth\Events\Registered 事件。这个事件侦听器会将电子邮件验证链接发送给用户。"
    • @alphillips 没有。这是正确的事件。你有那个设置吗?并且您的 env 文件中的邮件配置是否正确
    • 我刚刚编辑了我的帖子并将其包含在内,请您再看一下吗?
    【解决方案2】:

    我没有在我的用户模型上实现接口。 原来是

    class User extends Authenticatable 
    {
    

    我认为我说得很好,但我错过了这个实现,应该是这样的

    class User extends Authenticatable implements MustVerifyEmail
        {
    

    现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2020-05-08
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多