Laravel에서 모델 이벤트를 사용하는 방법에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-12-22 21:42:01
앞으로
1644명이 탐색했습니다.

Laravel에서 모델 이벤트를 사용하는 방법에 대해 이야기해 보겠습니다.

Eloquent 모델로 작업할 때 모델 수명주기를 통해 전달되는 이벤트를 활용하는 것이 일반적입니다. 이를 수행하는 방법에는 여러 가지가 있으며, 이 튜토리얼에서는 이러한 방법을 다루고 각 방법의 장단점을 설명하겠습니다. [관련 추천 : laravel 동영상 튜토리얼]

직접 비교할 수 있도록 각 방법에 대해 동일한 예제를 사용하겠습니다. 이 예에서는 모델 자체를 생성하는 동안 모델의 UUID 속성을 UUID에 할당합니다.

첫 번째 접근 방식은 모델의 정적 부트스트랩 방법을 사용하여 동작을 등록합니다. 이를 통해 모델에서 직접 작업하고 모델이 생성될 때 이를 생성할 수 있습니다.

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    public static function boot(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}
로그인 후 복사

이 접근 방식은 UUID 추가와 같은 모델 이벤트에 대한 작고 직접적인 반응에 적합합니다. 이해하기 쉽고 모델에서 무슨 일이 일어나고 있는지 정확하게 볼 수 있기 때문입니다. 이 접근 방식의 가장 큰 문제는 코드 중복입니다. UUID를 할당해야 하는 모델이 여러 개 있는 경우 동일한 작업을 반복적으로 수행하게 됩니다.

이는 기능을 사용하는 두 번째 접근 방식으로 이어집니다. Laravel에서 boot로 시작하고 특성 이름으로 끝나는 특성에 대한 메서드를 생성하면 모델이 특성을 상속하고 자동으로 시작할 수 있습니다. 예는 다음과 같습니다. boot 开头并以 trait 名称结尾的方法,你的模型可以继承 trait 并自动启动它们。这是一个例子:

declare(strict_types=1);

namespace App\Models\Concerns;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

trait HasUuid
{
    public static function bootHasUuid(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}
로그인 후 복사

使用特征允许你将此行为添加到需要它且易于实现的每个模型中。我最大的缺点是,当多个特征想要利用同一个模型事件时,堆叠这些行为可能会导致问题。他们开始争夺优先权,很快就会变得一团糟。

这将我们引向下一个选项,模型观察者。模型观察者是一种基于类的方法来响应模型事件,其中方法对应于被触发的特定事件。

declare(strict_types=1);

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class OfficeObserver
{
    public function creating(Model $model): void
    {
        $model->uuid = Str::uuid();
    }
}
로그인 후 복사

这个类需要在某个地方注册,在服务提供者或模型本身(这是我推荐的地方)。在模型中注册这个观察者可以在模型级别上看到改变雄辩行为的副作用。将其隐藏在服务提供商中的问题在于,除非每个人都知道它的存在,否则很难知道。这种方法的最大缺点是它的可见性。在我看来,正确使用这种方法非常棒。

解决此问题的另一种方法是利用 Eloquent 模型本身的$dispatchesEvents 属性。这是每个 Eloquent 模型上的一个属性,它允许你列出要侦听的事件以及为这些事件调用的类。

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    protected $dispatchesEvents = [
        'creating' => SetModelUuid::class,
    ];
}
로그인 후 복사

SetModelUuid

declare(strict_types=1);

namespace App\Models\Events;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class SetModelUuid
{
    public function __construct(Model $model)
    {
        $model->uuid = Str::uuid();
    }
}
로그인 후 복사

특성을 사용하면 이 동작을 필요로 하는 모든 모델에 추가할 수 있으며 구현도 쉽습니다. 가장 큰 단점은 여러 기능이 동일한 모델 이벤트를 활용하려고 할 때 이러한 동작을 쌓으면 문제가 발생할 수 있다는 것입니다. 그들은 우선순위를 위해 싸우기 시작하고 그것은 빠르게 혼란스러워집니다.

다음 옵션인 모델 관찰자로 연결됩니다. 모델 관찰자는 모델 이벤트에 응답하는 클래스 기반 방법이며, 여기서 메서드는 트리거된 특정 이벤트에 해당합니다.

declare(strict_types=1);

namespace App\Models\Pipelines;

use App\Models\Office

class OfficeCreatingPipeline
{
    public function __construct(Office $model)
    {
        app(Pipeline::class)
            ->send($model)
            ->through([
                ApplyUuidProperty::class,
                TapCreatedBy::class,
            ]);
    }
}
로그인 후 복사
이 클래스는 서비스 제공업체나 모델 자체 중 하나에 등록해야 합니다(제가 추천하는 곳은 여기입니다). 이 관찰자를 모델에 등록하면 모델 수준에서 설득력 있는 행동을 변경하는 데 따른 부작용을 확인할 수 있습니다. 서비스 제공자에게 이를 숨길 때의 문제는 모든 사람이 그것이 존재한다는 것을 알지 않는 한 알기 어렵다는 것입니다. 이 접근 방식의 가장 큰 단점은 가시성입니다. 제 생각에는 이 방법을 올바르게 사용하면 아주 좋습니다.

이 문제를 해결하는 또 다른 방법은 Eloquent 모델 자체의 $dispatchesEvents 속성을 ​​활용하는 것입니다. 이는 청취할 이벤트와 해당 이벤트를 호출할 클래스를 나열할 수 있는 모든 Eloquent 모델의 속성입니다.

rrreee

SetModelUuid는 Eloquent 모델의 수명 주기 동안 인스턴스화되며, 이는 모델에 동작과 속성을 추가할 수 있는 기회입니다.

rrreee

이 접근 방식은 모델에 가시성이 많고 이 클래스를 모델 간에 쉽게 공유할 수 있기 때문에 가장 명확하고 이해하기 쉬운 접근 방식 중 하나입니다. 직면하게 될 가장 큰 질문은 모델 이벤트에서 여러 작업을 트리거해야 하는지 여부입니다.

어쨌든 솔직히 이렇게 하는 데 정답은 없습니다. 위의 방법 중 하나를 선택할 수 있으며 모두 작동하지만 귀하와 특정 사용 사례에 적합한 방법을 선택해야 합니다. 이 특정 기능에 대한 더 많은 옵션을 보고 싶습니다.

예를 들어 모델 이벤트에서 모델에 여러 속성을 추가해야 하는 경우 관찰자를 선택하는 것이 좋습니다. 그러나 이것이 최선의 선택입니까? 이 모델에 대한 사용자 정의 파이프라인을 실행하기 위해 디스패치 이벤트 속성을 사용하면 어떻게 될까요?

rrreee
보시다시피 파이프라인을 사용하여 이벤트 모델링을 위한 여러 동작을 추가할 수 있습니다. 아직 테스트되지 않았으므로 가능한지 100% 알 수는 없지만 개념적으로는 모델 이벤트에 반응하는 구성 가능한 방식을 열 수 있습니다.

Laravel 프로젝트에서는 모델 이벤트를 어떻게 처리하나요? 트위터로 알려주세요!

🎜원본 주소: https://laravel-news.com/working-with-laravel-model-events🎜🎜번역 주소: https://learnku.com/laravel/t/71183🎜🎜🎜프로그래밍 관련 더 보기 지식이 있으시면 🎜프로그래밍 비디오🎜를 방문해 주세요! ! 🎜

위 내용은 Laravel에서 모델 이벤트를 사용하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿