XOOPS Σύστημα εκδηλώσεων
2.5.x: Προφορτώσεις 4.0.x: PSR-14
Επισκόπηση
Ενότητα με τίτλο «Επισκόπηση»Το σύστημα συμβάντων XOOPS επιτρέπει τη χαλαρή σύζευξη μεταξύ των μονάδων μέσω ενός σχεδίου παρατηρητή. Τα στοιχεία μπορούν να εκπέμπουν συμβάντα στα οποία μπορούν να ακούσουν και να ανταποκριθούν άλλα μέρη του συστήματος.
Τύποι συμβάντων
Ενότητα με τίτλο «Τύποι συμβάντων»# Βασικά συμβάντα
Ενότητα με τίτλο «# Βασικά συμβάντα»| Εκδήλωση | Σημείο ενεργοποίησης |
|---|---|
core.header.start | Πριν από την επεξεργασία της κεφαλίδας |
core.header.end | Μετά την επεξεργασία της κεφαλίδας |
core.footer.start | Πριν από την απόδοση του υποσέλιδου |
core.footer.end | Μετά την απόδοση του υποσέλιδου |
core.exception | Όταν συμβαίνει εξαίρεση |
# Εκδηλώσεις κύκλου ζωής ενότητας
Ενότητα με τίτλο «# Εκδηλώσεις κύκλου ζωής ενότητας»| Εκδήλωση | Σημείο ενεργοποίησης |
|---|---|
module.install | Μετά την εγκατάσταση της μονάδας |
module.update | Μετά την ενημέρωση της ενότητας |
module.uninstall | Πριν την αφαίρεση της μονάδας |
module.activate | Όταν ενεργοποιηθεί η μονάδα |
module.deactivate | Όταν η μονάδα είναι απενεργοποιημένη |
# Συμβάντα χρήστη
Ενότητα με τίτλο «# Συμβάντα χρήστη»| Εκδήλωση | Σημείο ενεργοποίησης |
|---|---|
user.login | Μετά την επιτυχή σύνδεση |
user.logout | Μετά την αποσύνδεση |
user.register | Μετά την εγγραφή |
user.delete | Πριν από τη διαγραφή χρήστη |
Σύστημα προφόρτωσης (παλαιού τύπου)
Ενότητα με τίτλο «Σύστημα προφόρτωσης (παλαιού τύπου)»# Δημιουργία προφόρτωσης
Ενότητα με τίτλο «# Δημιουργία προφόρτωσης»<?phpnamespace XoopsModules\MyModule;
use Xmf\Module\Helper\AbstractHelper;
final class Preload extends AbstractHelper{ public function eventCoreHeaderStart(array $args): void { // Runs on every page before header }
public function eventCoreFooterStart(array $args): void { // Runs before footer renders }
public function eventUserLogin(array $args): void { $userId = $args['userid']; // Handle login event }
public function eventCoreException(array $args): void { $exception = $args['exception']; // Log or handle exception }}# Ονομασία μεθόδου συμβάντος
Ενότητα με τίτλο «# Ονομασία μεθόδου συμβάντος»event{Category}{Action}
Examples:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Διανομέας συμβάντων (XOOPS 4.0)
Ενότητα με τίτλο «PSR-14 Διανομέας συμβάντων (XOOPS 4.0)»# Τάξη εκδήλωσης
Ενότητα με τίτλο «# Τάξη εκδήλωσης»<?php
declare(strict_types=1);
namespace XoopsModules\MyModule\Event;
final class ArticleCreatedEvent{ public function __construct( public readonly int $articleId, public readonly int $authorId, public readonly string $title, public readonly \DateTimeImmutable $createdAt ) {}}# Αποστολή συμβάντων
Ενότητα με τίτλο «# Αποστολή συμβάντων»use Psr\EventDispatcher\EventDispatcherInterface;
final class ArticleService{ public function __construct( private readonly ArticleRepository $repository, private readonly EventDispatcherInterface $dispatcher ) {}
public function create(CreateArticleDTO $dto): Article { $article = Article::create($dto); $this->repository->save($article);
// Dispatch event $this->dispatcher->dispatch(new ArticleCreatedEvent( articleId: $article->getId(), authorId: $article->getAuthorId(), title: $article->getTitle(), createdAt: new \DateTimeImmutable() ));
return $article; }}# Ακρόαση εκδηλώσεων
Ενότητα με τίτλο «# Ακρόαση εκδηλώσεων»<?php
declare(strict_types=1);
namespace XoopsModules\MyModule\Listener;
use XoopsModules\MyModule\Event\ArticleCreatedEvent;
final class SendNotificationOnArticleCreated{ public function __construct( private readonly NotificationService $notifications ) {}
public function __invoke(ArticleCreatedEvent $event): void { $this->notifications->notifySubscribers( 'new_article', [ 'article_id' => $event->articleId, 'title' => $event->title, ] ); }}# Εγγραφή ακροατών
Ενότητα με τίτλο «# Εγγραφή ακροατών»return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Συμβάντα με δυνατότητα διακοπής
Ενότητα με τίτλο «Συμβάντα με δυνατότητα διακοπής»use Psr\EventDispatcher\StoppableEventInterface;
final class ArticlePublishingEvent implements StoppableEventInterface{ private bool $propagationStopped = false; private ?string $rejectionReason = null;
public function __construct( public readonly Article $article ) {}
public function isPropagationStopped(): bool { return $this->propagationStopped; }
public function reject(string $reason): void { $this->propagationStopped = true; $this->rejectionReason = $reason; }
public function getRejectionReason(): ?string { return $this->rejectionReason; }}
// Listener can stop propagationfinal class ContentModerationListener{ public function __invoke(ArticlePublishingEvent $event): void { if ($this->containsProhibitedContent($event->article)) { $event->reject('Content violates community guidelines'); } }}Βέλτιστες πρακτικές
Ενότητα με τίτλο «Βέλτιστες πρακτικές»- Αμετάβλητα συμβάντα - Τα συμβάντα πρέπει να είναι μόνο για ανάγνωση
- Συγκεκριμένα συμβάντα - Δημιουργήστε συγκεκριμένα συμβάντα, όχι γενικά
- Async When Possible - Χρησιμοποιήστε ουρές για αργές λειτουργίες
- Χωρίς παρενέργειες στην αποστολή - Η αποστολή πρέπει να είναι γρήγορη
- Συμβάντα εγγράφου - Καταχωρίστε τα διαθέσιμα συμβάντα για χρήστες της ενότητας
Σχετική τεκμηρίωση
Ενότητα με τίτλο «Σχετική τεκμηρίωση»- Module-Development - Ανάπτυξη ενότητας
- Event-System-Guide - PSR-14 οδηγός
- Hoks-Events - Άγκιστρα παλαιού τύπου
- Events-and-Hoks - Παραδείγματα συμβάντων