PHP 模型观察者怎么注册

wen PHP项目 1

本文目录导读:

PHP 模型观察者怎么注册

  1. Laravel 框架(最常用)
  2. ThinkPHP 6.0+ 框架
  3. 自定义 PHP 框架
  4. Laravel 高级注册方式
  5. 创建观察者类示例
  6. 使用命令行快速生成
  7. 注意事项

在 PHP 中注册模型观察者(Model Observers)主要有以下几种方式,具体取决于你使用的框架:

Laravel 框架(最常用)

AppServiceProvider 中注册

<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        // 单个模型注册
        User::observe(UserObserver::class);
        // 或者使用数组批量注册
        User::observe([
            UserObserver::class,
            AnotherObserver::class
        ]);
    }
}

通过事件自动发现(Laravel 8+)

composer.json 中配置:

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

然后在应用目录下自动发现,需要满足:

  • Observer 类放在 app/Observers 目录
  • 命名空间为 App\Observers
  • 模型文件对应关系

在模型类中直接调用

<?php
namespace App\Models;
use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::observe(UserObserver::class);
    }
}

ThinkPHP 6.0+ 框架

在服务中注册

<?php
namespace app\service;
use app\model\User;
use app\observer\UserObserver;
class UserService
{
    public function register()
    {
        User::observe(UserObserver::class);
    }
}

在模型中使用

<?php
namespace app\model;
use think\Model;
use app\observer\UserObserver;
class User extends Model
{
    protected static function onInit()
    {
        parent::onInit();
        self::observe(UserObserver::class);
    }
}

自定义 PHP 框架

手动注册机制

<?php
class Model
{
    protected $observers = [];
    public static function observe($observerClass)
    {
        static::$observers[] = new $observerClass();
    }
    public function fireEvent($event, $data)
    {
        foreach (static::$observers as $observer) {
            if (method_exists($observer, $event)) {
                $observer->$event($data);
            }
        }
    }
}
// 注册观察者
Model::observe(UserObserver::class);
// 触发事件
$model->fireEvent('created', $user);

Laravel 高级注册方式

使用 Boot 方法自动注册

<?php
namespace App\Providers\EventServiceProvider;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
    protected $observers = [
        User::class => [UserObserver::class],
        Post::class => [PostObserver::class],
        // ...
    ];
}

使用容器绑定

<?php
$this->app->booted(function () {
    User::observe(UserObserver::class);
});

创建观察者类示例

<?php
namespace App\Observers;
use App\Models\User;
class UserObserver
{
    public function created(User $user)
    {
        // 创建后处理
        Log::info('用户创建:' . $user->id);
    }
    public function updated(User $user)
    {
        // 更新后处理
    }
    public function deleted(User $user)
    {
        // 删除后处理
    }
    public function restored(User $user)
    {
        // 恢复后处理
    }
    public function retrieved(User $user)
    {
        // 查询后处理
    }
    public function saving(User $user) 
    {
        // 保存前处理
    }
    public function saved(User $user)
    {
        // 保存后处理
    }
}

使用命令行快速生成

Laravel

php artisan make:observer UserObserver --model=User

ThinkPHP

php think make:observer UserObserver

注意事项

  1. 生命周期:观察者注册通常在框架启动时完成
  2. 性能:避免在观察者中做复杂操作
  3. 循环调用:注意避免观察者内的递归调用
  4. 事件优先级:确保注册顺序符合业务需求

选择注册方式时,建议根据框架的官方文档和项目结构来决定最合适的方式。

抱歉,评论功能暂时关闭!