【问题标题】:Moodle event observer not triggered in local plugin本地插件中未触发 Moodle 事件观察器
【发布时间】:2017-04-03 15:13:37
【问题描述】:

我在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';

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();
    }
}

缓存已被清除很多时间,版本号也被碰撞,但从未调用回调!

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

【问题讨论】:

    标签: moodle moodle-api


    【解决方案1】:

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

    结构没问题:

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

    【讨论】:

      【解决方案2】:

      我认为自动类加载将无法找到您的观察者类。

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

      namespace local_redirectafterlogin;
      

      然后将events.php改成:

      'callback' => 'local_redirectafterlogin\local_redirectafterlogin_observer'
      

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

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

      【讨论】:

      • 该插件的目的只是在一些额外的配置文件字段未填写时重定向到user/edit.php 页面。为什么说事件处理程序中不允许重定向?在我看来,core\event\user_loggedin 事件被调度来执行那种操作?不是吗?
      • 事件通常在某些处理过程中分派(例如,您可能有一个插件创建一个新用户,然后将他们注册到课程中 - 这将触发一个 'user_created' 事件,然后,稍后,“user_enrolment_created”事件;或者,创建多个用户帐户的脚本将生成多个事件)。事件也可以由多个处理程序处理。如果您允许事件处理程序在此处理过程中进行部分重定向,则该站点可能会处于非常损坏的状态。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2015-07-06
        • 2011-04-24
        • 2017-05-30
        • 2017-06-20
        • 1970-01-01
        • 2015-06-11
        相关资源
        最近更新 更多