L5.5 模型观察者怎么不执行?

大概想实现的就是用户积分发生变化的时候给用户发送通知

一共是3个文件:用户积分模型,观察者,修改 AppServiceProvider.php 里注册,(管理后台使用积分模型)更改用户积分的时候,没有反应,没有报错,也没执行观察者内的逻辑,我自己手动添加日志,也没有进入。

观察者代码

namespace App\Observers;

use App\Models\Point;
use Illuminate\Support\Facades\DB;

class PointObserver
{
    private $client_id = '';
    private $encryption_key = '';

    private function send_msg(Point $point)
    {
        //TODO 执行发送逻辑    
        addlog('执行发送逻辑');
    }

    function created(Point $point) {
        addlog('进入 created');
        $this->send_wechat_tmpl_msg($point);
    }

    function saved(Point $point) {
        addlog('进入 saved');
        $this->send_wechat_tmpl_msg($point);
    }

    function updated(Point $point) {
        addlog('进入 updated');
        $this->send_wechat_tmpl_msg($point);
    }

    function deleted(Point $point) {
        addlog('进入 deleted');
        $this->send_wechat_tmpl_msg($point);
    }

AppServiceProvider.php 里在boot 内注册:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Models\Point;
use App\Observers\PointObserver;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot() {
        Point::observe(PointObserver::class);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

请教是不是缺少了什么步骤顺便请教怎么调试

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 23
leochien

Point Model 是 Eloquent Model 嗎

2年前 评论

@leochien 对额,你看代码,我都引用那个Point 模型了

2年前 评论
leochien

@大师兄 可以提供 Point Model 嗎目前沒看出什麼異狀

2年前 评论

@leochien 感谢你的耐心,积分模型代码如下:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Point extends Model
{
    protected $table='member_point';
    protected $primaryKey='id';
    public $timestamps=false;

    //显示用户积分列表
    public function client_points($id)
    {
        $list = $this->where('member_id',$id)->get()->toArray();
        return $list;  //加载模板
    }

    //用户积分列表过滤
    public function points_filter($data)
    {
        foreach( $data as $k => $v){
            if(!isset($v))
                unset( $data[$k] );
        }
        if(isset($data['start_time'])){
            $data[] = ['created_at','>',$data['start_time']];
        }
        if(isset($data['end_time'])){
            $data[] =  ['created_at','<',$data['end_time']];
        }
        unset( $data['start_time'] );
        unset( $data['end_time'] );
        $list = $this
            ->where($data)
            ->get()
            ->toArray();

        return $list;
    }

}
2年前 评论

是不是通过 Eloquent 执行批量操作了?

2年前 评论

@Amos1st 没有,积分后台其实就只有管理手动给一个用户增加的操作,批量删除、更新都没有的。

2年前 评论

@大师兄 可以贴一下point的操作部分的代码么

2年前 评论

@大师兄 不是模型的部分呀,没有改动point的控制器部分么

2年前 评论

@Amos1st 不好意思,理解错了,代码有的,就是管理员后台手动给用户添加积分

            $points = new Point();
            $res = $request->input();
            $points->insert($res);
2年前 评论

@大师兄 试试用create吧,insert是可以批量操作的

2年前 评论

@Amos1st 非常感谢,应该就是你说的这个问题,我现在试一下。

2年前 评论

@大师兄 不客气,可以解决就好 :smile:

2年前 评论

好像还是不能,现在按照手册,改用save方法

            $points = new Point;

            $points->member_id = $request->input('member_id');
            $points->point_change = $request->input('point_change');
            $points->content = $request->input('content');
            $points->remark = $request->input('remark');
            $points->edit_admin = session()->get('admin')->username;

            $result = $points->save();

            if (!$result) {
                abort(500, '保存失败');
            }

这样还是没有进入观察者,改造成数组然后用了create方法也是一样。

2年前 评论
Point::create([
    ...
   'content'=>$request->input('content'),
    ...
]);

这样也不行是吧?

2年前 评论

解决了吗?我也遇到了

1年前 评论

你试试将观察者代码中只保留
function created(Point $point) {
addlog('进入 created');
$this->send_wechat_tmpl_msg($point);
}
其他方法删掉

1年前 评论

重新执行 composer dumpautoload, 有可能是你的Model 是新建的,classmapping class 还未找到……

1年前 评论

我目前是5.8的laravel,使用的时候需要在boot方法中继承父类的boot方法
你可以试试看

static function boot()
    {
        parent::boot();
        //启用模型观察 *UserObserver*
        self::observe(UserObserver::class);
    }
1年前 评论

@kangfq 兄弟 lumen5.8 在此终于解决!

1年前 评论

@amazingzl 建议还是使用服务提供者统一观察所有模型,这样管理也方便

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!