chelout / laravel-relationship-events
Laravel 缺失关系事件
v3.0.0
2024-03-15 10:32 UTC
Requires
- php: ^8.2
- illuminate/container: ^11.0
- illuminate/database: ^11.0
- illuminate/events: ^11.0
- illuminate/support: ^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^10.5|^11.0
- dev-master
- v3.0.0
- v2.0.0
- v1.5.0
- 1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- v0.6.3
- v0.6.2
- v0.6.1
- v0.6
- v0.5.1
- v0.5
- v0.4
- v0.3.3
- v0.3.2
- v0.3.1
- v0.3
- 0.2
- 0.1
- dev-laravel-11
- dev-shift-112732
- dev-php8-1
- dev-develop
- dev-laravel-7
- dev-feature/laravel-6
- dev-feature/travisci
- dev-feature/tests-coverage
- dev-feature/tests
- dev-feature/pass-relation-to-dispatchable-event
- dev-feature/observables
- dev-feature/doc
This package is auto-updated.
Last update: 2024-09-15 11:33:06 UTC
README
Laravel 缺失关系事件
安装
- 使用 composer 安装包
稳定分支
composer require chelout/laravel-relationship-events
开发分支
composer require chelout/laravel-relationship-events:dev-master
- 在您的模型中使用必要的特质。
可用的特质
- HasOneEvents
- HasBelongsToEvents
- HasManyEvents
- HasBelongsToManyEvents
- HasMorphOneEvents
- HasMorphToEvents
- HasMorphManyEvents
- HasMorphToManyEvents
- HasMorphedByManyEvents
use Chelout\RelationshipEvents\Concerns\HasOneEvents; use Illuminate\Database\Eloquent\Model; class User extends Model { use HasOneEvents; public static function boot() { parent::boot(); /** * One To One Relationship Events */ static::hasOneSaved(function ($parent, $related) { dump('hasOneSaved', $parent, $related); }); static::hasOneUpdated(function ($parent, $related) { dump('hasOneUpdated', $parent, $related); }); } }
use Chelout\RelationshipEvents\Concerns\HasMorphToManyEvents; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasMorphToManyEvents; public static function boot() { parent::boot(); /** * Many To Many Polymorphic Relations Events. */ static::morphToManyAttached(function ($relation, $parent, $ids, $attributes) { dump('morphToManyAttached', $relation, $parent, $ids, $attributes); }); static::morphToManyDetached(function ($relation, $parent, $ids) { dump('morphToManyDetached', $relation, $parent, $ids); }); } public function tags() { return $this->morphToMany(Tag::class, 'taggable'); } }
- 可派发的关联事件。可以通过 $dispatchesEvents 属性触发事件类,并添加
HasDispatchableEvents
特质
use Chelout\RelationshipEvents\Concerns\HasOneEvents; use Chelout\RelationshipEvents\Traits\HasDispatchableEvents; use Illuminate\Database\Eloquent\Model; class User extends Model { use HasDispatchableEvents; use HasOneEvents; protected $dispatchesEvents = [ 'hasOneSaved' => HasOneSaved::class, ]; }
关系
观察者
从 v0.4 版本开始,可以在 Laravel 观察者类 中使用关系事件。用法非常简单。以 User
和 Profile
类为例,从 一对一关系 开始,将 HasRelationshipObservables
特质添加到 User
类中。定义观察者类
namespace App\Observer; class UserObserver { /** * Handle the User "hasOneCreating" event. * * @param \App\Models\User $user * @param \Illuminate\Database\Eloquent\Model $related * * @return void */ public function hasOneCreating(User $user, Model $related) { Log::info("Creating profile for user {$related->name}."); } /** * Handle the User "hasOneCreated" event. * * @param \App\Models\User $user * @param \Illuminate\Database\Eloquent\Model $related * * @return void */ public function hasOneCreated(User $user, Model $related) { Log::info("Profile for user {$related->name} has been created."); } }
别忘了在您的 AppServiceProvider
的 boot
方法中注册观察者
namespace App\Providers; use App\Models\User; use App\Observers\UserObserver; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { // ... public function boot() { User::observe(UserObserver::class); } // ... }
现在只需为用户创建配置文件
// ... $user = factory(User::class)->create([ 'name' => 'John Smith', ]); // Create profile and assosiate it with user // This will fire two events hasOneCreating, hasOneCreated $user->profile()->create([ 'phone' => '8-800-123-45-67', 'email' => 'user@example.com', 'address' => 'One Infinite Loop Cupertino, CA 95014', ]); // ...
待办事项
- 测试,测试,测试