正如您所说,您有一个工作版本并且它是有效的,现在由您来决定它是否适合您。
只是为了澄清,我并不是说这些是更好的解决方案,它们只是一种有效的不同方式。
由于您正在做的事情是特定于问题模型的,或者至少它看起来不是通用事件,因此您可以直接在模型上设置它
<?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;
}
现在,我向您展示了最后一个选项,它是一个通用选项,您只需在模型顶部声明它的使用即可将其应用于每个模型。