本文目录导读:

在 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
注意事项
- 生命周期:观察者注册通常在框架启动时完成
- 性能:避免在观察者中做复杂操作
- 循环调用:注意避免观察者内的递归调用
- 事件优先级:确保注册顺序符合业务需求
选择注册方式时,建议根据框架的官方文档和项目结构来决定最合适的方式。