的三種方法,並通過四指@joko其他方法。可能還有更多,但讓我們關注4種方法。
讓我描述你一一:
1)覆蓋在模型上
在這種方法中使用的是OOPD方法重載的保存和刪除的方法。您正在重寫Laravel的內部方法save
,並通過在其上定義自己的save
方法來添加附加代碼。這應該避免,因爲Laravel不斷髮展,並且可能發生的事情是,如果重大變更完成,就像事情開始失敗一樣,假設將來使用任何其他方法替代save
方法來保存記錄。然後,您將不得不創建另一種方法來覆蓋該新方法。此處編寫代碼可能會增加您的模型類文件。你的模型可能會繼續處理他不應該處理的事情(例如:發送電子郵件)。 應避免使用此方法。
2)添加創建/更新/刪除回調的引導方法
在這裏,你是在模型的啓動方法定義代碼。只有在事件需要處理很少的代碼/事情時才應該使用此方法。這種方法的缺點是它使代碼更加複雜和混亂,因爲你可能像編寫函數一樣編寫所有的邏輯。假設你在創建之前和創建之後必須做些什麼。你的boot
方法會增長。
3)綁定在引導方法
該方法的觀察者是相當不錯的。你創建一個觀察者類來處理Laravel事件應該發生的事情。它使代碼更加清潔並易於維護。
示例:假設您必須在這些方法中編寫creating
,saving
,saved
,deleting
中的代碼。在這種情況下,方法1)和方法2)也不會好做法,因爲在
方法1:我們必須創建此4種方法,並覆蓋它們,以及支持他們Laravel的未來版本。在這種情況下,模型中的代碼也將增長,因爲重寫此方法
方法2:在這種情況下,您boot
方法也會增長,所以你型號的文件將成爲一個代碼的垃圾。
在方法1和2中,還記得它不是你的模型的職責來完成你要編寫的許多東西。就像創建用戶時發送電子郵件一樣。這些代碼最終可能會以created
方法寫入。
現在假設您有場景需要在created
事件上向用戶發送電子郵件,以及您需要在客戶CRM中創建用戶的登錄日誌用戶。那麼你將不得不用相同的方法編寫代碼。也許,你可能不會遵循單一責任原則。我們該怎麼辦?參見方法4.
4)Other method suggested by @joko
,我在方法4的最終建議的情況。您可以發送電子郵件給用戶,並在創建時將其登錄到客戶CRM中。然後你的方法會做2件事(發送電子郵件和登錄CRM)。它可能不遵循單一責任原則。如果更好,我們可以解耦他們兩個。然後來這個方法。
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'eloquent.saved: App\User' => 'App\Listeners\SendWelcomeEmailToUser'
'eloquent.saved: App\User' => 'App\Listeners\LogUserInCRM'
];
}
創建兩個listener classes:
class SendWelcomeEmailToUser
{
public function handle(User $user){
// Write code to send email
}
}
class LogUserInCRM
{
public function handle(User $user){
// Write code to log
}
}
通過這個就可以分離出代碼,使他們更乾淨。
我一般都喜歡這種方法,它的模式乾淨。它也讓你更好地認識事件發生時實際發生的事情。它成爲Event to Listener映射的單一點。
與Django中的Eloquent一樣:「在通過Eloquent執行批量刪除語句時,刪除和刪除的模型事件不會爲已刪除的模型觸發,這是因爲在執行delete語句時模型從未被實際檢索到。 「 –
@jakubwrona這三種方法都不支持大規模刪除?好。還有什麼我應該注意的嗎?效率有差異嗎?他們中的任何一個比其他人更強大/更不可能突破?或者這只是一個偏好問題?爲什麼有很多方法可以做同樣的事情? – mpen