Home PHP Framework Laravel Let's talk about how to use model events in Laravel

Let's talk about how to use model events in Laravel

Dec 22, 2022 pm 09:42 PM
php laravel

Let's talk about how to use model events in Laravel

When working with Eloquent models, it is common to take advantage of events dispatched through the model lifecycle. There are a few different ways to do this, and in this tutorial I'll cover them and explain the pros and cons of each. [Related recommendations: laravel video tutorial]

I will use the same example for each method so that you can compare directly. This example assigns the model's UUID property to the UUID during creation of the model itself.

Our first approach uses the model's static bootstrap method to register the behavior. This allows us to work directly on the model and create it when the model is created .

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(),
        );
    }
}
Copy after login

This approach is great for small, direct reactions to model events, like adding UUIDs, because it's very easy to understand and you can see exactly what's happening on the model. The biggest problem with this approach is code duplication, if you have multiple models that need to be assigned UUIDs, you will be doing the same thing repeatedly.

This leads us nicely into the second approach, using a feature. In Laravel, if you create a method on a trait that starts with boot and ends with the trait name, your models can inherit the trait and automatically start them. Here is an example:

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(),
        );
    }
}
Copy after login

Using traits allows you to add this behavior to every model that requires it and is easy to implement. My biggest drawback is that stacking these behaviors can cause problems when multiple features want to take advantage of the same model event. They start fighting for priority and it quickly becomes a mess.

This leads us to the next option, model observers. A model observer is a class-based way to respond to model events, where the method corresponds to the specific event that was triggered.

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

This class needs to be registered somewhere, either with the service provider or the model itself (which is where I recommend it). Registering this observer in the model allows you to see the side effects of changing eloquent behavior at the model level. The problem with hiding it from the service provider is that it's hard to know unless everyone knows it exists. The biggest disadvantage of this approach is its visibility. In my opinion this method is great when used correctly.

Another way to solve this problem is to take advantage of the $dispatchesEvents property of the Eloquent model itself. This is a property on every Eloquent model that allows you to list events to listen to and the classes to call for those events.

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,
    ];
}
Copy after login

SetModelUuid will be instantiated during the life cycle of the Eloquent model, which is your opportunity to add behaviors and properties to the model.

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

This approach is one of the cleanest and easiest to understand because the model has a lot of visibility and you can easily share this class between models. The biggest question you'll face is whether you need to trigger multiple actions on model events.

Anyway, honestly, there is no right way to do this. You can choose any of the above methods and they will all work, but you should choose the method that works for you and your specific use case. I'd like to see more options for this specific feature.

For example, if you need to add multiple properties to a model on model events, observers are a good choice. However, is this the best option? What if we use the dispatch events attribute to run a custom pipeline for this model?

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

As you can see, we can start using pipelines to add multiple behaviors for event modeling. Now, this hasn't been tested, so I don't know 100% if it's possible - but as a concept, it could open up a composable way to react to model events.

How do you handle model events in your Laravel project? Tell us on Twitter!

Original address: https://laravel-news.com/working-with-laravel-model-events

Translation address: https://learnku.com/laravel/ t/71183

For more programming related knowledge, please visit: Programming Video! !

The above is the detailed content of Let's talk about how to use model events in Laravel. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Laravel Eloquent ORM in Bangla partial model search) Laravel Eloquent ORM in Bangla partial model search) Apr 08, 2025 pm 02:06 PM

LaravelEloquent Model Retrieval: Easily obtaining database data EloquentORM provides a concise and easy-to-understand way to operate the database. This article will introduce various Eloquent model search techniques in detail to help you obtain data from the database efficiently. 1. Get all records. Use the all() method to get all records in the database table: useApp\Models\Post;$posts=Post::all(); This will return a collection. You can access data using foreach loop or other collection methods: foreach($postsas$post){echo$post->

The Future of PHP: Adaptations and Innovations The Future of PHP: Adaptations and Innovations Apr 11, 2025 am 12:01 AM

The future of PHP will be achieved by adapting to new technology trends and introducing innovative features: 1) Adapting to cloud computing, containerization and microservice architectures, supporting Docker and Kubernetes; 2) introducing JIT compilers and enumeration types to improve performance and data processing efficiency; 3) Continuously optimize performance and promote best practices.

PHP vs. Python: Understanding the Differences PHP vs. Python: Understanding the Differences Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP's Current Status: A Look at Web Development Trends PHP's Current Status: A Look at Web Development Trends Apr 13, 2025 am 12:20 AM

PHP remains important in modern web development, especially in content management and e-commerce platforms. 1) PHP has a rich ecosystem and strong framework support, such as Laravel and Symfony. 2) Performance optimization can be achieved through OPcache and Nginx. 3) PHP8.0 introduces JIT compiler to improve performance. 4) Cloud-native applications are deployed through Docker and Kubernetes to improve flexibility and scalability.

Laravel's geospatial: Optimization of interactive maps and large amounts of data Laravel's geospatial: Optimization of interactive maps and large amounts of data Apr 08, 2025 pm 12:24 PM

Efficiently process 7 million records and create interactive maps with geospatial technology. This article explores how to efficiently process over 7 million records using Laravel and MySQL and convert them into interactive map visualizations. Initial challenge project requirements: Extract valuable insights using 7 million records in MySQL database. Many people first consider programming languages, but ignore the database itself: Can it meet the needs? Is data migration or structural adjustment required? Can MySQL withstand such a large data load? Preliminary analysis: Key filters and properties need to be identified. After analysis, it was found that only a few attributes were related to the solution. We verified the feasibility of the filter and set some restrictions to optimize the search. Map search based on city

Laravel and the Backend: Powering Web Application Logic Laravel and the Backend: Powering Web Application Logic Apr 11, 2025 am 11:29 AM

How does Laravel play a role in backend logic? It simplifies and enhances backend development through routing systems, EloquentORM, authentication and authorization, event and listeners, and performance optimization. 1. The routing system allows the definition of URL structure and request processing logic. 2.EloquentORM simplifies database interaction. 3. The authentication and authorization system is convenient for user management. 4. The event and listener implement loosely coupled code structure. 5. Performance optimization improves application efficiency through caching and queueing.

PHP: The Foundation of Many Websites PHP: The Foundation of Many Websites Apr 13, 2025 am 12:07 AM

The reasons why PHP is the preferred technology stack for many websites include its ease of use, strong community support, and widespread use. 1) Easy to learn and use, suitable for beginners. 2) Have a huge developer community and rich resources. 3) Widely used in WordPress, Drupal and other platforms. 4) Integrate tightly with web servers to simplify development deployment.

See all articles