2015-04-23 39 views
9

我想确保我在Laravel 5中正确使用了模型事件监听器,并且我没有搞砸任何事情(监听器vs处理程序?)。我的解决办法工作正常,但我不知道如果我按照Laravel 5的概念,并约定开发在Laravel 5中使用模型事件监听器

目标: 始终设置$发出─> STATUS_ID上一些当模型保存价值。

在app \供应商\ EventServiceProvider.php

<?php namespace App\Providers; 

... 

class EventServiceProvider extends ServiceProvider { 

    ... 

    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 

     Issue::saving('App\Handlers\Events\SetIssueStatus'); 
    } 

} 

在应用程序\处理程序\活动\ SetIssueStatus.php

<?php namespace App\Handlers\Events; 

... 

class SetIssueStatus { 

    ... 

    public function handle(Issue $issue) 
    { 
     if (something) 
     { 
      $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
     } 
     else 
     { 
      $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
     } 

     // issue_status() is One-to-One relations with IssueType (belongsTo) 
     $issue->issue_status()->associate($issueStatus); 
    } 

} 

谢谢您的时间。

+0

你只是想在一个模型上使用这个事件,或者你想在多个模型中使用它? –

+0

这个逻辑($ issue-> status_id)我只想用于Issue模型,但是将来我想为这个模型和其他模型添加更多的逻辑。 – zss61890

+0

对此没有正确或错误的答案;这取决于应用程序。因此,投票结束,因为它主要是基于意见的。 –

回答

15

正如你所说,你有一个工作版本,这是一个有效的版本,现在由你来决定它是否适合你。

只是为了澄清我并不是说这些是更好的解决方案,它们只是一种有效的不同方式。

既然你在做什么是针对特定问题的模型,或者至少它似乎并没有成为一个普通的事件,你可以将它设置在模型上直接

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 
use IssueStatus; 

class Issue extends Model { 


    protected static function boot() 
    { 
     parent::boot(); 

     static::saving(function($issue){ 
      if (something) 
      { 
       $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
      } 
      else 
      { 
       $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
      } 

      // issue_status() is One-to-One relations with IssueType (belongsTo) 
      $issue->issue_status()->associate($issueStatus); 

     }); 
    } 
} 

,但如果您的活动确实是一个通用的,你想在多个模型中使用它,你可以达到同样的目的。你只需要从模型中提取代码并使用特征(就像你使用软删除一样)

首先我们创建我们的特征(在这种情况下,我们在我们的应用的根上创建)并提取代码,我写了之前,从型号:

<?php namespace App 

use IssueStatus; 

trait IssueStatusSetter 
{ 
    protected static function boot() 
    { 
     parent::boot(); 

     static::saving(function($model){ 
      if (something) 
      { 
       $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); 
      } 
      else 
      { 
       $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); 
      } 

      // issue_status() is One-to-One relations with IssueType (belongsTo) 
      $model->issue_status()->associate($issueStatus); 

     }); 
    } 
} 

现在在哪里,你要使用它的模型,你只需要导入的特质,并宣布它的使用:

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 
use IssueStatusSetter; 

class Issue extends Model { 

    use IssueStatusSetter; 

} 

现在这最后的选项我发现你这是一个通用选项,你可以申请到每个模型只声明它的用途在你的模型的顶部。

+0

谢谢你这个例子和explonation。现在我明白这个行为只针对问题模型,所以没有理由将它提取到事件监听器。 – zss61890

+0

它工作在5.1?我试过,但静态::保存不听或不工作 – carlituxman