検索
ホームページPHPフレームワークLaravelLaravelでモデルイベントを使用する方法について話しましょう

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 を割り当てる必要があるモデルが複数ある場合、同じことを繰り返し行うことになります。

これにより、機能を使用する 2 番目のアプローチにうまくつながります。 Laravel では、boot で始まりトレイト名で終わるトレイトのメソッドを作成すると、モデルはトレイトを継承して自動的に開始できます。以下に例を示します。

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();
    }
}

このクラスは、サービス プロバイダーまたはモデル自体のどこかに登録する必要があります (これをお勧めします)。このオブザーバーをモデルに登録すると、雄弁な動作の変化による副作用をモデル レベルで確認できるようになります。サービスプロバイダーからそれを隠す場合の問題は、誰もがその存在を知らない限り、それを知るのが難しいことです。このアプローチの最大の欠点は、その可視性です。私の意見では、この方法は正しく使えば素晴らしいものです。

この問題を解決するもう 1 つの方法は、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 は、Eloquent モデルのライフ サイクル中にインスタンス化されます。これは、モデルに動作とプロパティを追加する機会となります。

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();
    }
}

このアプローチは、モデルの可視性が高く、このクラスをモデル間で簡単に共有できるため、最もクリーンで理解しやすいアプローチの 1 つです。直面する最大の疑問は、モデル イベントに対して複数のアクションをトリガーする必要があるかどうかです。

とにかく、正直に言って、これを行う正しい方法はありません。上記の方法のいずれかを選択でき、すべて機能しますが、自分と特定の使用例に適した方法を選択する必要があります。この特定の機能に関するオプションをもっと増やしてほしいと思います。

たとえば、モデル イベントでモデルに複数のプロパティを追加する必要がある場合は、オブザーバーが適しています。しかし、これが最善の選択肢でしょうか?このモデルのカスタム パイプラインを実行するためにディスパッチ イベント属性を使用するとどうなるでしょうか?

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,
            ]);
    }
}

ご覧のとおり、パイプラインの使用を開始して、イベント モデリング用の複数の動作を追加できます。これはまだテストされていないので、それが可能かどうかは 100% わかりませんが、概念としては、モデル イベントに反応する構成可能な方法を開く可能性があります。

Laravel プロジェクトでモデル イベントをどのように処理しますか? Twitterで教えてください!

元のアドレス: https://laravel-news.com/working-with-laravel-model-events

翻訳アドレス: https://learnku.com/laravel/ t/71183

プログラミング関連の知識については、プログラミング ビデオをご覧ください。 !

以上がLaravelでモデルイベントを使用する方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Laravel(PHP)vs。Python:異なるユースケースとアプリケーションLaravel(PHP)vs。Python:異なるユースケースとアプリケーションApr 18, 2025 am 12:16 AM

LaravelまたはPythonの選択は、プロジェクトの要件に依存します。1)Webアプリケーションをすばやく開発し、ORMと認証システムを使用する必要がある場合は、Laravelを選択します。 2)データ分析、機械学習、または科学的コンピューティングが含まれる場合は、Pythonを選択します。

LaravelとPython:適切なツールを見つけるLaravelとPython:適切なツールを見つけるApr 18, 2025 am 12:14 AM

LaravelはWebアプリケーションを迅速に構築するのに適しており、Pythonは柔軟性と汎用性を必要とするプロジェクトに適しています。 1)Laravelは、PHPエコシステムに適したORMやルーティングなどの豊富な機能を提供します。 2)Pythonは、簡潔な構文と強力なライブラリエコシステムで知られており、Web開発やデータサイエンスなどのフィールドに適しています。

LaravelとPHP:動的なWebサイトの作成LaravelとPHP:動的なWebサイトの作成Apr 18, 2025 am 12:12 AM

LaravelとPHPを使用して、動的なWebサイトを効率的に楽しく作成します。 1)LaravelはMVCアーキテクチャに従い、ブレードテンプレートエンジンはHTMLの書き込みを簡素化します。 2)ルーティングシステムと要求処理メカニズムにより、URL定義とユーザー入力処理が簡単になります。 3)Eloquentormはデータベース操作を簡素化します。 4)データベースの移行、CRUD操作、ブレードテンプレートの使用は、ブログシステムの例を介して実証されています。 5)Laravelは、強力なユーザー認証と承認機能を提供します。 6)デバッグスキルには、ロギングシステムと職人ツールの使用が含まれます。 7)パフォーマンスの最適化の提案には、怠zyなロードとキャッシュが含まれます。

Laravelとフルスタック:フロントとバックを一緒にLaravelとフルスタック:フロントとバックを一緒にApr 18, 2025 am 12:07 AM

Laravelは、ブレードテンプレートエンジン、Eloquentorm、Artisan Tools、Laravelmixを介してフルスタック開発を実現します。1。ブレードは、フロントエンド開発を簡素化します。 2. Eloquentはデータベース操作を簡素化します。 3。職人は開発効率を向上させます。 4。Laravelmixは、フロントエンドリソースを管理します。

Laravel:現代のWeb開発のためのフレームワークLaravel:現代のWeb開発のためのフレームワークApr 18, 2025 am 12:05 AM

Laravelは、MVCアーキテクチャモデルに従い、豊富なツールと機能を提供し、Web開発プロセスを簡素化する最新のPHPベースのフレームワークです。 1)データベースインタラクション用のEloquentorm、2)高速コード生成のための職人コマンドラインインターフェイス、3)効率的なビュー開発のためのブレードテンプレートエンジン、4)URL構造を定義するための強力なルーティングシステム、5)ユーザー管理のための認証システム、6)リアルタイム機能のためのイベントリスニングとブロードキャスト、7)パフォーマンスを維持するためのパフォーマンスを維持します。

Laravel(PHP)vs。Python:長所と短所を計量しますLaravel(PHP)vs。Python:長所と短所を計量しますApr 17, 2025 am 12:18 AM

LaravelはWebアプリケーションを迅速に構築するのに適していますが、Pythonはより広い範囲のアプリケーションシナリオに適しています。 1.Laravelは、Web開発を簡素化するために、Eloquentorm、Bladeテンプレートエンジン、職人ツールを提供します。 2。Pythonは、その動的なタイプ、リッチ標準ライブラリ、サードパーティのエコシステムで知られており、Web開発、データサイエンス、その他の分野に適しています。

Laravel vs. Python:フレームワークとライブラリの比較Laravel vs. Python:フレームワークとライブラリの比較Apr 17, 2025 am 12:16 AM

LaravelとPythonにはそれぞれ独自の利点があります。Laravelは、機能が豊富なWebアプリケーションを迅速に構築するのに適しており、Pythonはデータサイエンスと一般的なプログラミングの分野でうまく機能します。 1.Laravelは、最新のWebアプリケーションの構築に適したEloquentormおよびBladeテンプレートエンジンを提供します。 2。Pythonには豊富な標準的な図書館とサードパーティライブラリがあり、DjangoとFlaskのフレームワークはさまざまな開発ニーズを満たしています。

Laravelの目的:堅牢でエレガントなWebアプリケーションの構築Laravelの目的:堅牢でエレガントなWebアプリケーションの構築Apr 17, 2025 am 12:13 AM

Laravelは、コード構造を明確にし、開発プロセスをより芸術的にすることができるため、選択する価値があります。 1)LaravelはPHPに基づいており、MVCアーキテクチャに従い、Web開発を簡素化します。 2)Eloquentorm、Artisan Tools、Bladeテンプレートなどのコア機能は、開発の優雅さと堅牢性を高めます。 3)ルーティング、コントローラー、モデル、ビューを通じて、開発者はアプリケーションを効率的に構築できます。 4)キューやイベントモニタリングなどの高度な機能により、アプリケーションのパフォーマンスがさらに向上します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール