Vin*_*nce 1 php observers laravel laravel-9
我有一个关于如何根据我传递的参数使观察者的方法静音的问题。我有一个参数link_social,如果它设置为 false,我希望观察者不触发该created()函数。
$role = $request->role == 'creator' ? 'creator' : 'sponsor';
if($request->link_social == true){
$user = Auth::user()->$role()->create([
'name' => $request->safe()->name,
'about' => $request->safe()->about,
'account_plan_id' => $accountPlan->id,
]);
} else{
$user = Auth::user()->$role()->create([
'name' => $request->safe()->name,
'about' => $request->safe()->about,
'account_plan_id' => $accountPlan->id,
])->saveQuietly();
}
Run Code Online (Sandbox Code Playgroud)
该User模型有一个关系方法creator,观察者来自该模型,名为CreatorObserver
但我得到了这个
"message": "Call to undefined method App\\Models\\Creator::saveQuitely()"
保存(编辑)时出错,但仍然会触发created()创建者观察者中的事件,该观察者正在将记录保存在另一个表中。
我正在尝试做类似的事情$user->role->create()->saveQuitely()
创造者观察者
class CreatorObserver
{
/**
* Handle the Creator "created" event.
*
* @param \App\Models\Creator $creator
* @return void
*/
public function created(Creator $creator)
{
if ($creator->user->social_identifier['platform'] === PlatformType::Google->value) {
$youtube = new YoutubeService($creator->user->social_identifier);
SocialPlatform::createFor($creator, $youtube);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用户模型
public function sponsor()
{
return $this->hasOne(Sponsor::class);
}
public function creator()
{
return $this->hasOne(Creator::class);
}
Run Code Online (Sandbox Code Playgroud)
创造者模型
class Creator extends Model
{
use HasFactory;
protected $guarded = [];
public function user()
{
return $this->belongsTo(User::class);
}
public function socialPlatforms()
{
return $this->hasMany(SocialPlatform::class);
}
}
Run Code Online (Sandbox Code Playgroud)
saveQuietly/ createQuietly 不应在 create 之后链接,因为 create 函数将调度由观察者创建函数处理的创建事件。为了防止模型分派事件,可以通过以下两种方式之一完成:使用 createQuietly
$user = Auth::user()->$role()->createQuietly([
'name' => $request->safe()->name,
'about' => $request->safe()->about,
'account_plan_id' => $accountPlan->id,
]);
Run Code Online (Sandbox Code Playgroud)
或使用模型 withoutEvents 函数
$user = Model::withoutEvents(function () use ($request, $role, $accountPlan) {
return Auth::user()->$role()->create([
'name' => $request->safe()->name,
'about' => $request->safe()->about,
'account_plan_id' => $accountPlan->id,
]);
});
Run Code Online (Sandbox Code Playgroud)
使用基本模型作为创建的模型可以是 Creator 或 Sponsor 如果模型类已知,我们可以将 Model::withoutEvents 替换为 YourModelName::withoutEvents
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |