Laravel 8 SendVerificationEmail 事件似乎没有触发
Laravel 8 SendVerificationEmail Event Seemingly Not Firing
我已按照 docs 中列出的说明进行电子邮件验证。我的用户模型实现了 MustVerifyEmail 接口,并且我在创建用户后在我的控制器中触发事件。我还验证了我可以通过 Tinker 发送随机电子邮件,它在 Mailhog 中有效并通过。
我在我的 UserController 中创建了一个应该触发事件的测试路由,但它似乎没有被触发:
public function test()
{
Log::debug('testing email');
$user = User::find(1);
Log::debug($user);
event(new Registered($user));
Log::debug('event should have fired');
}
在EventServiceProvider.php中:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
在我的用户模型中:
namespace App\Models;
use Laravel\Sanctum\HasApiTokens;
use Laravel\Jetstream\HasProfilePhoto;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable implements MustVerifyEmail
{
...
它正在按预期写入日志,但没有电子邮件。我认为我没有遗漏文档中的任何步骤,而且我不确定如何进行故障排除。我如何调试事件,或者我在实施中遗漏了什么?
问得好,很高兴看到你已经采取的步骤和你提供的信息,很多人可以从中学习!
回到问题,我有一些建议你可以check/try。
检查您要向其发送邮件的用户是否尚未经过验证,SendEmailVerificationNotification
中的检查有此检查,这也让我感到困惑,为什么我没有正在收到邮件。并确保遵循文档中的这些步骤:https://laravel.com/docs/master/verification#the-email-verification-handler
if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
$event->user->sendEmailVerificationNotification();
}
仔细检查您的日志,检查是否有任何 errors/exceptions 可以为您提供更多信息
因为你已经改变了你的供应商EventServiceProvider
,尝试运行宁composer dump-autoload
,它将重建需要类的列表包含在您的申请中。
您可以像您说的那样发送邮件,但是为了确定,请检查您的 .env
文件中的 QUEUE_CONNECTION
是否设置为 sync
,如果不,你应该 运行 php artisan queue:work
(不要忘记 --queue= 选项!)用于数据库驱动程序和 php artisan horizon
(如果安装)用于 redis 驱动程序,否则事件可能是排队但不能 运行。对于调试,sync
驱动程序是最简单的。
我刚刚用一个新的 Laravel 应用程序尝试了您的步骤,一切正常(在执行上述步骤后,因为它在我的系统上也不起作用哈哈)
希望这份清单能帮助您解决问题,如果您有任何问题,请告诉我! :)
我已按照 docs 中列出的说明进行电子邮件验证。我的用户模型实现了 MustVerifyEmail 接口,并且我在创建用户后在我的控制器中触发事件。我还验证了我可以通过 Tinker 发送随机电子邮件,它在 Mailhog 中有效并通过。
我在我的 UserController 中创建了一个应该触发事件的测试路由,但它似乎没有被触发:
public function test()
{
Log::debug('testing email');
$user = User::find(1);
Log::debug($user);
event(new Registered($user));
Log::debug('event should have fired');
}
在EventServiceProvider.php中:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
在我的用户模型中:
namespace App\Models;
use Laravel\Sanctum\HasApiTokens;
use Laravel\Jetstream\HasProfilePhoto;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable implements MustVerifyEmail
{
...
它正在按预期写入日志,但没有电子邮件。我认为我没有遗漏文档中的任何步骤,而且我不确定如何进行故障排除。我如何调试事件,或者我在实施中遗漏了什么?
问得好,很高兴看到你已经采取的步骤和你提供的信息,很多人可以从中学习!
回到问题,我有一些建议你可以check/try。
检查您要向其发送邮件的用户是否尚未经过验证,
SendEmailVerificationNotification
中的检查有此检查,这也让我感到困惑,为什么我没有正在收到邮件。并确保遵循文档中的这些步骤:https://laravel.com/docs/master/verification#the-email-verification-handlerif ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) { $event->user->sendEmailVerificationNotification(); }
仔细检查您的日志,检查是否有任何 errors/exceptions 可以为您提供更多信息
因为你已经改变了你的供应商
EventServiceProvider
,尝试运行宁composer dump-autoload
,它将重建需要类的列表包含在您的申请中。您可以像您说的那样发送邮件,但是为了确定,请检查您的
.env
文件中的QUEUE_CONNECTION
是否设置为sync
,如果不,你应该 运行php artisan queue:work
(不要忘记 --queue= 选项!)用于数据库驱动程序和php artisan horizon
(如果安装)用于 redis 驱动程序,否则事件可能是排队但不能 运行。对于调试,sync
驱动程序是最简单的。
我刚刚用一个新的 Laravel 应用程序尝试了您的步骤,一切正常(在执行上述步骤后,因为它在我的系统上也不起作用哈哈)
希望这份清单能帮助您解决问题,如果您有任何问题,请告诉我! :)