首先,我們為你展示如何通過模型觀察者實現前面模式事件中的第一個例子。
在 app/Observers檔案夾中建立 WelcomeUserObserver.php檔案,並加入下面的代碼:
$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 \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); User::observe(new WelcomeUserObserver); }
這樣就 OK 了!現在你的觀察者已經與模型關聯起來了。
下面我們假設另一種情況。圖書管理員對代碼提出了一些新的需求:
- 當添加一個新的作者的時候,每一個使用者都收到一條通知
- 每次添加/刪除作者的時候,都發送一封郵件
- 最後,每次刪除一本書的時候,圖書管理員都要知道資料庫中有多少作者是沒有與相關的圖書的
好了,下面我們就開始吧。我們需要三個單獨的類(請記住我們的 單一職責原則): CustomerNewAuthorObserver、 LibrarianAuthorObserver、 AuthorsWithoutBooksObservers。
注意:你可以按自己喜歡的方式命名這些類,我們這裡只是選擇比較容易與所選行為關聯起來的名稱。
下面我們分別來建立三個類:
好了,現在應該添加一些邏輯了,首先為 CustomerNewAuthorObserver添加:
$author], function($message) use ($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('New Author Added!'); }); } } } 注意:我知道這是一種非常簡單粗暴的方法,這裡只是為了實現上面的目的。實際情況中可以使用 郵件隊列。
$author], function($message) use ($author) { $message->to('librarian@awesomelibrary.com', '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('librarian@awesomelibrary.com', 'The Librarian')->subject('New Author: ' . $author->first_name . ' ' . $author->last_name); }); } } 最後:
get(); if(count($authorsWithoutBooks) > 0){ Mail::send('emails.author_without_books_librarian', ['authorsWithoutBooks' => $authorsWithoutBooks], function($message) { $message->to('librarian@awesomelibrary.com', 'The Librarian')->subject('Authors without Books! A check is required!'); }); } } } 注意:就像前面提過的,我們假定你已經瞭解了 Laravel 發送郵件的基本知識,沒有的話可以到官網學習下相關知識。
到這裡並沒有結束。你可以在大量的案例和情境中使用 Laravel 的模型事件和模型觀察者。舉個例子,假設你寫部落格,你希望每次發布一篇新文章或者更新一篇原有文章的時候,都更新一些網站地圖,這時就可以用到觀察者。再比如,當添加新書的時候,記錄一些東西,也可以用到觀察者。
該篇屬於專題:《 Laravel 的 Events(事件) 及 Observers(觀察者)》
- 下一篇:《 Laravel 的 Events 及 Observers(六) — 總結》
- 上一篇:《 Laravel 的 Events 及 Observers(四) — 模型觀察者》