Laravel Model Events - I'm a bit confused about where they're meant to go

后端 未结 9 792
长发绾君心
长发绾君心 2020-12-07 13:15

So the way I see it is that a good Laravel application should be very model- and event-driven.

I have a Model called Article. I wish to send email alert

相关标签:
9条回答
  • 2020-12-07 13:55

    You've tagged this question as Laravel 5, so I would suggest not using model events as you'll end up with lots of extra code in your models which may make things difficult to manage in future. Instead, my recommendation would be to make use of the command bus and events.

    Here's the docs for those features:

    http://laravel.com/docs/5.0/bus

    http://laravel.com/docs/5.0/events

    My recommendation would be to use the following pattern.

    • You create a form which submits to your controller.
    • Your controller dispatches the data from the request generated to a command.
    • Your command does the heavy lifting - i.e. creates an entry in the database.
    • Your command then fires an event which can be picked up by an event handler.
    • Your event handler does something like send an email or update something else.

    There are a few reasons why I like this pattern: Conceptually your commands handle things that are happening right now and events handle things that have just happened. Also, you can easily put command and event handlers onto a queue to be processed later on - this is great for sending emails as you tend not to want to do that in real time as they slow the HTTP request down a fair bit. You can also have multiple event handlers for a single event which is great for separating concerns.

    It would be difficult to provide any actual code here as your question more about the concepts of Laravel, so I'd recommend viewing these videos so you get a good idea of how this pattern works:

    This one describes the command bus:

    https://laracasts.com/lessons/laravel-5-events

    This one describes how events work:

    https://laracasts.com/lessons/laravel-5-commands

    0 讨论(0)
  • 2020-12-07 14:01

    1) You may create an event listener for each new Model (ArticleEventSubscriber,CommentEventSubscriber) at boot method:

    EventServiceProvider.php

    public function boot(DispatcherContract $events)
    {
        parent::boot($events);
    
        $events->subscribe('App\Listeners\ArticleEventListener');
        $events->subscribe('App\Listeners\CommentEventListener');
    }
    

    or you may also use $subscribe property

    protected $subscribe = [
            'App\Listeners\ArticleEventListener',
            'App\Listeners\CommentEventListener',
        ];
    

    There are many ways to listen and handle events. Take a look to current master documentation for discovering more ways(like usings closures) to do so : Laravel Docs (master) and this other answer

    2) Model events are just events provided by default by Eloquent.

    https://github.com/illuminate/database/blob/491d58b5cc4149fa73cf93d499efb292cd11c88d/Eloquent/Model.php#L1171

    https://github.com/illuminate/database/blob/491d58b5cc4149fa73cf93d499efb292cd11c88d/Eloquent/Model.php#L1273

    0 讨论(0)
  • 2020-12-07 14:06

    I found this the cleanest way to do what you want.

    1.- Create an observer for the model (ArticleObserver)

    use App\Article;
    
    class ArticleObserver{
    
      public function __construct(Article $articles){
        $this->articles = $articles
      }
    
      public function created(Article $article){
        // Do anything you want to do, $article is the newly created article
      }
    
    }
    

    2.- Create a new ServiceProvider (ObserversServiceProvider), remember to add it to you config/app.php

    use App\Observers\ArticleObserver;
    use App\Article;
    use Illuminate\Support\ServiceProvider;
    
    class ObserversServiceProvider extends ServiceProvider
    {
    
      public function boot()
      {
        Article::observe($this->app->make(ArticleObserver::class));
      }
    
      public function register()
      {
        $this->app->bindShared(ArticleObserver::class, function()
            {
                return new ArticleObserver(new Article());
            });
      }
    
    }

    0 讨论(0)
提交回复
热议问题