本文目录导读:

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