programing

라라벨:업데이트 시 열이 변경되었는지 관찰자에게 확인

cafebook 2023. 9. 20. 20:43
반응형

라라벨:업데이트 시 열이 변경되었는지 관찰자에게 확인

사용자가 업데이트되었는지 확인하기 위해 Observer를 사용하고 있습니다.

사용자가 있을 때마다updated저는 그의 것이 그의 것인지 확인하고 싶습니다.email변경되었습니다.

이런 일이 가능한가요?

class UserObserver
{


    /**
     * Listen to the User created event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updating(User $user)
    {
      // if($user->hasChangedEmailInThisUpdate()) ?
    }

}

편집: https://stackoverflow.com/a/54307753/2311074 에 대한 크레딧 제공getOriginal

~하듯이tadman이미 댓글에서 말한 방법은isDirty효과는 다음과 같습니다.

class UserObserver
{


    /**
     * Listen to the User updating event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updating(User $user)
    {
      if($user->isDirty('email')){
        // email has changed
        $new_email = $user->email; 
        $old_email = $user->getOriginal('email');
      }
    }

}

만일 당신이 알고 싶다면, 당신은 다음과 같은 것들의 차이점을.isDirty그리고.wasChanged, https://stackoverflow.com/a/49350664/2311074 를 참조하십시오.

데이터베이스에서 사용자를 다시 가져올 필요는 없습니다.다음이 작동해야 합니다.

public function updating(User $user)
{
  if($user->isDirty('email')){
    // email has changed
    $new_email = $user->email; 
    $old_email = $user->getOriginal('email'); 
  }
}

사용하는 대신updating이벤트, 당신은 사용해야 합니다.updated열 변화를 원본과 비교하기 위해 사건을 모형화합니다.아래 코드를 확인해주시기 바랍니다.

AppServiceProvider.php

<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        User::updated(function($user){
            $changes = array_diff($user->getOriginal(), $user->getAttributes());
            if(array_key_exists('email',$changes)){
                /* do your things. */
            }
        });
    }
}

설명:

  • 차액을 얻으면 사용해야 합니다.array_key_exists이메일 필드가 업데이트되었는지 여부를 확인합니다.

파티에 조금 늦었지만, 비슷한 솔루션을 찾고 있는 미래의 개발자들에게 도움이 될 수도 있습니다.

Laravel Attribute Observer 패키지를 사용하여 서비스 공급자를 오염시키거나 Observer를 다음으로 채울 것을 권장합니다.isDirty()그리고.wasChanged()보일러판

따라서 사용 사례는 다음과 같습니다.

class UserObserver
{


    /**
     * Handle changes to the "email" field of User on "updating" events.
     *
     * @param  \App\User  $user
     * @param string $newValue The current value of the field
     * @param string $oldValue The previous value of the field
     * @return void
     */
    public function onEmailUpdating(User $user, string $newValue, string $oldValue)
    {
      // Your logic goes here...
    }

}

Laravel Attribute Observer는 하나 이상의 모형에서 관찰해야 할 특성이 많은 경우 특히 유용합니다.

면책 사항:저는 라라벨 속성 관찰자의 저자입니다.개발 시간이 조금이라도 절약된다면 커피를 사주는 것도 고려해보세요.

언급URL : https://stackoverflow.com/questions/48793257/laravel-check-with-observer-if-column-was-changed-on-update

반응형