[英]How to Control Events from firing in Laravel
I have an Event that fires off a Welcome email whenever someone registers a new account on my website. 每当有人在我的网站上注册新帐户时,我都会触发一个“欢迎”电子邮件事件。
My problem is, I needed to create a "Create User" page on my admin section. 我的问题是,我需要在管理部分中创建“创建用户”页面。 Now every time I create a user from the admin section the email still fires off an email welcoming the new user. 现在,每次我在admin部分创建用户时,电子邮件仍会触发一封欢迎新用户的电子邮件。
This would be fine, but I need that email to say something else. 可以,但是我需要那封电子邮件才能说其他话。
I don't want the Welcome email to fire when creating a user from the admin panel. 从管理面板创建用户时,我不希望触发欢迎电子邮件。
How can I control this Event from sending the email? 如何通过发送电子邮件控制此事件?
Code pretty much goes in this order: 代码几乎按以下顺序进行:
1. Event code: NewUser.php 1.事件代码: NewUser.php
namespace App\Events;
... irrelevant classes
use Illuminate\Foundation\Events\Dispatchable;
use App\User;
class NewUser
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
2. Listener: SendWelcomeEmail.php 2.侦听器: SendWelcomeEmail.php
namespace App\Listeners;
use App\Events\NewUser;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Mail;
use App\Mail\NewUserWelcome;
class SendWelcomeEmail
{
public function __construct()
{
//
}
public function handle(NewUser $event)
{
Mail::to($event->user->email)->send(new NewUserWelcome($event->user));
}
}
3. Mail: NewUserWelcome.php 3.邮件: NewUserWelcome.php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;
class NewUserWelcome extends Mailable
{
use Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function build()
{
return $this->subject('Welcome To The Website')->markdown('emails.user.newuserwelcome');
}
}
4. Markdown email would be next. 4.降价电子邮件将是下一个。
@component('mail::message')
# Greetings bla bla bla
5. EventServiceProvider: is making the call like this: 5. EventServiceProvider:正在像这样进行调用:
protected $listen = [
'App\Events\NewUser' => [
'App\Listeners\SendWelcomeEmail',
],
];
6. User model I have the following relevant code: 6.用户模型我有以下相关代码:
class User extends Authenticatable {
use Notifiable;
protected $dispatchesEvents = [
'created' => Events\NewUser::class
];
In my ADMIN SAVE USER FUNCTION | 在我的ADMIN SAVE USER FUNCTION中 | UserController This is what I'm using to SAVE the New User From Admin Panel : (No Event classes) UserController 这是我用来从管理面板保存新用户的内容 :(无事件类)
use Illuminate\Http\Request;
use App\User;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function adminUserStore(Request $request){
$newsupporter = User::create([
'name'=> $request->name,
'email' => $request->email,
'password' => Hash::make($quickpass),
]);
return back()->with('success','The user has been created and a password reset email has been sent to them.');
}
Any help would be appreciated, I've been battling this one for quite some time. 任何帮助将不胜感激,我已经为此战斗了很长时间。
You can try by adding a new nullable column for your user model, which would check if the user was added by admin or someone else; 您可以尝试为用户模型添加一个新的可为空的列,该列将检查用户是由admin还是由其他人添加的;
$newsupporter = User::create([
'name'=> $request->name,
'email' => $request->email,
'password' => Hash::make($quickpass),
'added_by' => 'admin',
]);
And then create a check and send email only when the user was not added my admin, 然后创建支票并仅在未添加用户我的管理员时发送电子邮件,
public function handle(NewUser $event)
{
if(!$event->user->added_by == 'admin'){
Mail::to($event->user->email)->send(new NewUserWelcome($event->user));
}
}
Personally I would introduce two events instead of the one. 我个人将介绍两个事件,而不是一个。 Something along the lines of AccountCreatedByUser
and AccountCreatedByAdmin
. 与AccountCreatedByUser
和AccountCreatedByAdmin
。 These events can then be handled by separate listeners, which will send separate e-mails. 然后,这些事件可以由单独的侦听器处理,该侦听器将发送单独的电子邮件。 This will mean you'll have to fire these events manually instead of depending on the built-in created
event. 这意味着您将不得不手动触发这些事件,而不是依赖于内置的已created
事件。 This can be done like so: event(new AccountCreatedByUser($user));
可以这样操作: event(new AccountCreatedByUser($user));
Documentation for firing events manually can be found here 手动触发事件的文档可在此处找到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.