イベントとリスナー
Chamiloは、コンポーネント間の疎結合な通信のためにSymfonyのイベントシステムを使用しています。
イベントリスナー
Chamiloでは2つのリスナーの場所を使用しています:
src/CoreBundle/EventListener/— Symfonyカーネル/HTTPリスナー(リクエスト、レスポンス、例外、ログイン/ログアウト、コース/セッションアクセスなど)。例:CidReqListener、CourseAccessListener、LoginSuccessHandler、LogoutListener、ExceptionListener、ResourceDoctrineListener。src/CoreBundle/Entity/Listener/— 特定のエンティティに紐づけられたDoctrineエンティティリスナー。例:ResourceNodeListener、CourseListener、SessionListener、LanguageListener、UserListener、MessageListener。
反応する必要がある内容に合わせて場所を選んでください:HTTPパイプラインイベントはEventListener/に、エンティティライフサイクルフックはEntity/Listener/に配置します。
イベントサブスクライバー
src/CoreBundle/EventSubscriber/に配置されています:
イベントサブスクライバーは複数のイベントをリッスンできます:
セキュリティサブスクライバー — ログイン/ログアウトイベントを処理し、ログイン試行を追跡します
APIサブスクライバー — APIリクエストの前後処理を行います
Doctrineサブスクライバー — エンティティライフサイクルイベントに反応します
Doctrineライフサイクルイベント
エンティティはデータベースレベルのイベントに#[ORM\HasLifecycleCallbacks]を使用します:
カスタムリスナーの作成
カスタム動作を追加するには:
適切なバンドル内にリスナー/サブスクライバークラスを作成します
サービス設定でイベントリスナーまたはサブスクライバーとしてタグ付けします
ハンドラーメソッドを実装します
主要なイベント
kernel.request
すべてのHTTPリクエスト時
kernel.response
HTTPレスポンス送信前
security.interactive_login
ユーザーがログインした時
doctrine.prePersist
エンティティが初めて保存される前
doctrine.postUpdate
エンティティが更新された後
Chamilo固有のイベント
これらのイベントはChamilo独自のコードによってディスパッチされ、プラグインの主要な統合ポイントとなります。定数はChamilo\CoreBundle\Event\Eventsに定義されています。
Events::COURSE_CREATED
chamilo.event.course_created
コースが作成された後
Events::COURSE_ACCESS_CHECK
chamilo.course_access_check
ユーザーがコースにアクセスする前
Events::COURSE_USER_SUBSCRIPTION_CHECK
chamilo.event.course_user_subscription_check
ユーザーがコースに登録する前
Events::SESSION_RESUBSCRIPTION
chamilo.event.session_resubscription
ユーザーがセッションに再登録を試みた時
Events::LOGIN_CREDENTIALS_CHECKED
chamilo.event.login_credentials_checked
ログイン認証情報が検証された後
Events::LOGIN_CONDITION_CHECKED
chamilo.event.login_condition_checked
追加のログイン条件がチェックされた後
Events::DOCUMENT_ACTION
chamilo.event.document_action
ドキュメントツールのツールバーがレンダリングされた時
Events::DOCUMENT_ITEM_ACTION
chamilo.event.document_item_action
ファイルごとのアクションボタンがレンダリングされた時
Events::DOCUMENT_ITEM_VIEW
chamilo.event.document_item_view
ドキュメントが閲覧のために開かれた時
Events::EXERCISE_REPORT_ACTION
chamilo.event.exercise_report_action
演習レポートページがアクションリンクをレンダリングした時
Events::EXERCISE_ENDED
chamilo.event.exercise_ended
学習者が演習を提出した後
Events::EXERCISE_QUESTION_ANSWERED
chamilo.event.question_answered
各質問に回答した後
Events::LP_CREATED
chamilo.event.learning_path_created
学習パスが作成された後
Events::LP_ITEM_VIEWED
chamilo.event.learning_path_item_viewed
学習者がLPアイテムを開いた時
Events::LP_ENDED
chamilo.event.learning_path_ended
学習者が学習パスを完了した後
Events::ADMIN_BLOCK_DISPLAYED
chamilo.event.admin_block_displayed
管理者ダッシュボードがブロックリストを構築した時
Events::USER_CREATED
chamilo.event.user_created
ユーザーアカウントが作成された後
Events::USER_UPDATED
chamilo.event.user_updated
ユーザーアカウントが更新された後
Events::USER_DELETED
chamilo.event.user_deleted
ユーザーアカウントが削除された後
Events::PORTFOLIO_ITEM_ADDED
chamilo.event.portfolio_item_added
ポートフォリオアイテムが作成された後
Events::NOTIFICATION_CONTENT_FORMATTED
chamilo_hook_event.notification_content
通知本文がフォーマットされた時
プラグインの例:ドキュメントビューアにボタンを追加する
このセクションでは、プラグインがイベントサブスクライバーを使用して、既存のChamiloページにボタンを挿入する方法を説明します。コアコードの変更は必要ありません。
シナリオ
MyViewer というプラグインは、コースファイルマネージャー内のすべてのドキュメントの横に「MyViewer で開く」ボタンを追加したいと考えています。関連するイベントは Events::DOCUMENT_ITEM_VIEW であり、Chamilo がドキュメントを表示しようとする際にディスパッチされ、CDocument エンティティと変更可能なリンクのリストを保持しています。
プラグインのディレクトリ構造
メインプラグインクラス (src/MyViewerPlugin.php)
src/MyViewerPlugin.php)Plugin ベースクラスは、isEnabled()、get($settingKey)、およびコースツールや設定をインストールするためのヘルパーを提供します。シングルトンパターン (static $instance) は、Chamilo の標準的な慣例であり、プラグインクラスが Symfony コンテナの外部 (レガシー PHP ページ内) でもインスタンス化されるためです。
イベントサブスクライバー (src/EventSubscriber/MyViewerEventSubscriber.php)
src/EventSubscriber/MyViewerEventSubscriber.php)addLink() は、Chamilo のドキュメント表示テンプレートが組み込みの「ダウンロード」や「プレビュー」アクションと一緒にレンダリングする配列に HTML を追加します。サブスクライバーは Chamilo のコアファイルを変更することはありません。
登録
手動でのサービス登録は必要ありません。Chamilo の config/services.yaml は Symfony の autoconfigure フラグをグローバルに有効にしており、EventSubscriberInterface を実装するクラスを自動的に kernel.event_subscriber としてタグ付けします。プラグインディレクトリが読み込まれている限り (Composer's classmap または PSR-4 autoload 経由で)、Symfony は次のキャッシュクリア時にサブスクライバーを認識します。
イベントデータの流れ
複数のプラグインが同じイベントに独立してサブスクライブでき、それぞれが他のプラグインを知ることなく共有データに追加します。実行順序は Symfony の優先度システムに従います。順序が重要な場合は、getSubscribedEvents() のハンドラータプルの2番目の要素として優先度整数を渡します。
最終更新
役に立ちましたか?