首先,我们为你展示如何通过模型观察者实现前面模式事件中的第一个例子。
在 app/Observers 文件夹中创建 WelcomeUserObserver.php 文件,并加入下面的代码:
namespace AppObservers;
class WelcomeUserObserver {
public function created($user){
Mail::send('emails.welcome', ['user' => $user], function($message) use ($user)
{
$message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Welcome to My Awesome App, '.$user->first_name.'!');
});
}
}
然后在 EventServiceProvider 的 boot() 方法中注册该观察者:
/**
* Register any other events for your application.
*
* @param IlluminateContractsEventsDispatcher $events
* @return void
*/
public function boot(DispatcherContract $events)
{
parent::boot($events);
User::observe(new WelcomeUserObserver);
}
这样就 OK 了!现在你的观察者已经与模型关联起来了。
下面我们假设另一种情况。图书管理员对代码提出了一些新的需求:
当添加一个新的作者的时候,每一个用户都收到一条通知
每次添加/删除作者的时候,都发送一封邮件
最后,每次删除一本书的时候,图书管理员都要知道数据库中有多少作者是没有与相关的图书的
好了,下面我们就开始吧。我们需要三个单独的类(请记住我们的单一职责原则):CustomerNewAuthorObserver、LibrarianAuthorObserver、AuthorsWithoutBooksObservers。
注意:你可以按自己喜欢的方式命名这些类,我们这里只是选择比较容易与所选行为关联起来的名称。
下面我们分别来创建三个类:
// file: app/Observers/CustomerNewAuthorObserver
namespace AppObservers;
class CustomerNewAuthorObserver {
public function created($author)
{
}
}
// file: app/Observers/LibrarianAuthorObserver
namespace AppObservers;
class LibrarianAuthorObserver {
public function created($author)
{
}
public function deleted($author)
{
}
}
// file: app/Observers/AuthorsWithoutBooksObservers
namespace AppObservers;
class AuthorsWithoutBooksObservers {
public function deleted($author)
{
}
}
好了,现在应该添加一些逻辑了,首先为 CustomerNewAuthorObserver 添加:
// file: app/Observers/CustomerNewAuthorObserver
namespace AppObservers;
class CustomerNewAuthorObserver {
public function created($author)
{
// getting all users...
$users = AppUser::all();
foreach($users as $user)
{
Mail::send('emails.created_author_customer', ['author' => $author], function($message) use ($user)
{
$message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('New Author Added!');
});
}
}
}
注意:我知道这是一种非常简单粗暴的方法,这里只是为了实现上面的目的。实际情况中可以使用邮件队列。
// file: app/Observers/LibrarianAuthorObserver
namespace AppObservers;
class LibrarianAuthorObserver {
public function created($author) {
Mail::send('emails.created_author_librarian', ['author' => $author], function($message) use ($author)
{
$message->to('[email protected]', 'The Librarian')->subject('New Author: ' . $author->first_name . ' ' . $author->last_name);
});
}
public function deleted($author) {
Mail::send('emails.deleted_author_librarian', ['author' => $author], function($message) use ($author)
{
$message->to('[email protected]', 'The Librarian')->subject('New Author: ' . $author->first_name . ' ' . $author->last_name);
});
}
}
最后:
// file: app/Observers/AuthorsWithoutBooksObservers
namespace AppObservers;
class AuthorsWithoutBooksObservers {
public function deleted($author) {
$authorsWithoutBooks = AppAuthor::has('books', '=', 0)->get();
if(count($authorsWithoutBooks) > 0){
Mail::send('emails.author_without_books_librarian', ['authorsWithoutBooks' => $authorsWithoutBooks], function($message)
{
$message->to('[email protected]', 'The Librarian')->subject('Authors without Books! A check is required!');
});
}
}
}
注意:就像前面提过的,我们假定你已经了解了 Laravel 发送邮件的基本知识,没有的话可以到官网学习下相关知识。
到这里并没有结束。你可以在大量的案例和场景中使用 Laravel 的模型事件和模型观察者。举个例子,假设你写博客,你希望每次发布一篇新文章或者更新一篇原有文章的时候,都更新一些站点地图,这时就可以用到观察者。再比如,当添加新书的时候,记录一些东西,也可以用到观察者。
创造与魔法 安卓版v1.0.0750
创造与魔法是一款开放世界手游,在游戏中玩家可探索这个奇妙的世
创造与魔法修改版 最新版v1.0.0750
创造与魔法无限点券版是款探索冒险游戏,该款游戏的操作还是蛮自
战争与文明官方版本 安卓版v1.7.16
战争与文明是一款由上海邮通科技有限公司开发的战争策略游戏,这
迷你世界0元领皮肤无限迷你币版 最新安卓版v1.43.0
迷你世界0元购买皮肤版是这款开放沙盒冒险建造游戏的特殊破解版
创造与魔法无限经验版 安卓版v1.0.0750
创造与魔法无限经验版是款可以改造环境,整个游戏的自由度还是蛮