1

我在这个位置创建了一个moodle/local/redirectafterlogin具有以下结构的插件:

redirectafterlogin/
├── db
│   ├── classes
│   │   └── observer.php
│   └── events
│       └── events.php
└── version.php

版本.php:

defined('MOODLE_INTERNAL') || die();

$plugin->version = 20170333;
$plugin->requires = 2015111000;
$plugin->component = 'local_redirectafterlogin';

事件.php:

defined('MOODLE_INTERNAL') || die();

    $observers = array(
        array(
            'eventname' => 'core\event\user_loggedin',
            'callback' => 'local_redirectafterlogin_observer::user_loggedin',
        ),
        array(
            'eventname' => 'core\event\user_loggedout',
            'callback' => 'local_redirectafterlogin_observer::user_loggedin',
        ),
    );

观察者.php:

class local_redirectafterlogin_observer
{
    public static function user_loggedin(core\event\base $event)
    {
        $event_data = $event->get_data();
        var_dump($event_data);
        die();
    }
}

缓存已经被清除了很多时间,版本号也被颠倒了,但从未调用过回调!

  1. 怎么回事,为什么没有触发回调?
  2. 如何调试事件(Moodle 中有没有办法查看已调度的事件)?
4

3 回答 3

3

这是结构错误!我把classes文件夹中包含observer.phpdb文件夹!如下移动classes插件根目录下的文件夹后,就ok了,观察者被触发了!

没问题的结构:

redirectafterlogin/
├── classes
│   └── observer.php
├── db
│   └── events.php
└── version.php
于 2017-04-03T07:13:37.580 回答
1

我不认为自动类加载将能够找到您的观察者类。

尝试添加到观察者类文件的顶部:

namespace local_redirectafterlogin;

然后将 events.php 更改为:

'callback' => 'local_redirectafterlogin\local_redirectafterlogin_observer'

(你也可以大大缩短类名,现在它是命名空间的)。确保增加版本号,以重新加载 events.php 文件。

但是,您可能需要重新考虑插件的命名,因为在事件处理程序中不允许重定向,因为这会导致很多问题。

于 2017-03-31T15:20:24.073 回答
0

我的经验是 var_dump 或 output do stdout 不会被触发。作为快速“调试”,我将 file_put_contents 用于临时日志文件

于 2017-03-31T15:12:43.307 回答