Moodle 事件观察器未在本地插件中触发
Moodle event observer not triggered in local plugin
我在这个位置 moodle/local/redirectafterlogin
创建了一个插件,其结构如下:
redirectafterlogin/
├── db
│ ├── classes
│ │ └── observer.php
│ └── events
│ └── events.php
└── version.php
version.php:
defined('MOODLE_INTERNAL') || die();
$plugin->version = 20170333;
$plugin->requires = 2015111000;
$plugin->component = 'local_redirectafterlogin';
events.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',
),
);
observer.php:
class local_redirectafterlogin_observer
{
public static function user_loggedin(core\event\base $event)
{
$event_data = $event->get_data();
var_dump($event_data);
die();
}
}
缓存已经清除了很多时间,版本号也被修改了,但是回调从未被调用过!
- 怎么了,为什么没有触发回调?
- 我如何调试事件(Moodle 中有没有办法查看派发的事件)?
我的经验是 var_dump 或输出 do stdout 不会触发。作为快速 "debug" 我使用 file_put_contents 到临时日志文件
我认为自动 class 加载无法找到您的观察者 class。
尝试添加到观察者class文件的顶部:
namespace local_redirectafterlogin;
然后将events.php改为:
'callback' => 'local_redirectafterlogin\local_redirectafterlogin_observer'
(您还可以大大缩短 class 名称,现在它已命名空间)。确保你修改了版本号,以重新加载 events.php 文件。
不过,您可能需要重新考虑插件的命名,因为在事件处理程序中不允许重定向,因为这会导致很多问题。
结构错误!我把包含observer.php
的classes
文件夹放到了db
文件夹里!
如下移动插件根目录下的 classes
文件夹后,就可以了,观察者被触发了!
可以的结构:
redirectafterlogin/
├── classes
│ └── observer.php
├── db
│ └── events.php
└── version.php
我在这个位置 moodle/local/redirectafterlogin
创建了一个插件,其结构如下:
redirectafterlogin/
├── db
│ ├── classes
│ │ └── observer.php
│ └── events
│ └── events.php
└── version.php
version.php:
defined('MOODLE_INTERNAL') || die();
$plugin->version = 20170333;
$plugin->requires = 2015111000;
$plugin->component = 'local_redirectafterlogin';
events.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',
),
);
observer.php:
class local_redirectafterlogin_observer
{
public static function user_loggedin(core\event\base $event)
{
$event_data = $event->get_data();
var_dump($event_data);
die();
}
}
缓存已经清除了很多时间,版本号也被修改了,但是回调从未被调用过!
- 怎么了,为什么没有触发回调?
- 我如何调试事件(Moodle 中有没有办法查看派发的事件)?
我的经验是 var_dump 或输出 do stdout 不会触发。作为快速 "debug" 我使用 file_put_contents 到临时日志文件
我认为自动 class 加载无法找到您的观察者 class。
尝试添加到观察者class文件的顶部:
namespace local_redirectafterlogin;
然后将events.php改为:
'callback' => 'local_redirectafterlogin\local_redirectafterlogin_observer'
(您还可以大大缩短 class 名称,现在它已命名空间)。确保你修改了版本号,以重新加载 events.php 文件。
不过,您可能需要重新考虑插件的命名,因为在事件处理程序中不允许重定向,因为这会导致很多问题。
结构错误!我把包含observer.php
的classes
文件夹放到了db
文件夹里!
如下移动插件根目录下的 classes
文件夹后,就可以了,观察者被触发了!
可以的结构:
redirectafterlogin/
├── classes
│ └── observer.php
├── db
│ └── events.php
└── version.php