gpt4 book ai didi

php - 在 Laravel 5 中使用模型事件监听器

转载 作者:可可西里 更新时间:2023-10-31 22:44:03 25 4
gpt4 key购买 nike

我想确保我在 Laravel 5 中正确使用了模型事件监听器并且我没有搞砸任何事情(监听器与处理程序?)。我的解决方案工作正常,但我想知道我是否根据 Laravel 5 的概念和约定开发。

目标:保存模型时,始终将 $issue->status_id 设置为某个值。

在 app\Providers\EventServiceProvider.php 中

<?php namespace App\Providers;

...

class EventServiceProvider extends ServiceProvider {

...

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

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

}

在 app\Handlers\Events\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);
}

}

感谢您的宝贵时间。

最佳答案

正如您所说,您有一个可用的版本并且它是有效的,现在由您决定它是否适合您。

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

由于您正在做的事情是特定于 Issue 模型的,或者至少它似乎不是一个通用事件,您可以直接在您的模型上设置它

<?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;

}

现在我向您展示了最后一个选项,它是一个通用选项,您只需声明它在模型顶部使用即可应用于每个模型。

关于php - 在 Laravel 5 中使用模型事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com