Magento 2-Ereignisliste

Antworten:

18

Ich habe eine Liste von Magento 2-Ereignissen mit zusammengestellt

find . -type f -exec grep -n -H -A 2 -T "eventManager->dispatch(" {} \;

Die Liste ist in zwei Teile unterteilt, einen für statische Ereignisse und einen für Dynamik.

Von hier aus sind statische Ereignisse alle Ereignisse, die mit dem vollständigen Ereignisnamen wie folgt definiert sind:

$this->_eventManager->dispatch('some_event');

Dynamische Ereignisse sind alle Ereignisse, die mit dem dynamisch zur Laufzeit abgerufenen Ereignisnamen definiert sind:

$this->_eventManager->dispatch($this->_eventPrefix . '_load_before', $params);

Die Liste befindet sich zur besseren Lesbarkeit in einer Tabelle. Ich habe nach dem Match 2 Zeilen hinterlassen, um den Event-Kontext besser zu verstehen.

Dieselbe Liste kann auch im offiziellen Magento 2-Repo nach gesucht werden_eventManager->dispatch

mbalparda
quelle
Die Liste ist sehr hilfreich, scheint aber unvollständig. Das Ereignis, das sales_order_save_afterzum Beispiel für meine aktuelle Aufgabe ziemlich wichtig ist, fehlt und wenn Sie das Magento 2-Repo durchsuchen, werden Sie feststellen, dass es überhaupt kein Ereignis dafür gibt dispatch: github.com/magento/magento2/… Ich habe noch keine Ahnung wie diese Ereignisse ausgelöst werden, aber es wäre großartig, sie in die Liste aufzunehmen!
Jey DWork
Woher weißt du, dass der Ereignisname nicht existiert? Vielleicht suchen Sie nach einer Entsprechung in Magento 2 mit einem anderen Namen?
mbalparda
Ich bin mir nicht sicher, ob wir über dasselbe reden. Ich habe mich nur gefragt, warum das Ereignis sales_order_save_after(nur als ein Beispiel) nicht in der Liste (und der Suche) auftaucht und auch nicht wie ein dynamisches Ereignis aussieht. Und dann überlegte ich, ob und wie es möglich sein könnte, solche Ereignisse einzubeziehen, um eine vollständigere Liste zu erhalten. Und natürlich spreche ich nur von Magento 2, sales_order_save_aftereinem Magento 2-Event, soweit ich das beurteilen kann.
Jey DWork
14

Offensichtlich keine gute Praxis, aber ich biete einen Link, der die wichtigen Ereignisse in Magento2 erfüllt hat

http://cyrillschumacher.com/magento2-list-of-dispatched-events/

Natürlich ist die Ereignisliste unvollständig, als ob Sie mit Magento 1.x gearbeitet hätten, die Ereignisauslöselogik bleibt erhalten

  1. lib/internal/Magento/Framework/Model/AbstractModel.php Laden vor und nach Ereignissen eines Modells

    $this->_eventManager->dispatch($this->_eventPrefix . '_load_before', $params);
    $this->_eventManager->dispatch($this->_eventPrefix . '_load_after', $params);

    Speichern Sie vor und nach Ereignissen eines Modellobjekts

    $this->_eventManager->dispatch($this->_eventPrefix . '_save_before', $this->_getEventData());
    $this->_eventManager->dispatch($this->_eventPrefix . '_save_after', $this->_getEventData());

    Ein Objekt löschen

    $this->_eventManager->dispatch($this->_eventPrefix . '_delete_before', $this->_getEventData());
    $this->_eventManager->dispatch($this->_eventPrefix . '_delete_after', $this->_getEventData());

    Ein Objekt löschen

    $this->_eventManager->dispatch($this->_eventPrefix . '_clear', $this->_getEventData());
  2. Controller Versand

    lib / internal / Magento / Framework / App / Action / Action.php

    $this->_eventManager->dispatch(
        'controller_action_predispatch_' . $request->getFullActionName(),
        $eventParameters
    );
    
    eg // controller_action_predispatch_checkout_cart_index
    
    
    $this->_eventManager->dispatch(
        'controller_action_postdispatch_' . $request->getFullActionName(),
        $eventParameters
    );
    eg // controller_action_postdispatch_checkout_cart_index
  3. Ereignisse beim Rendern des Frontend-Layouts

    $this->_eventManager->dispatch(
        'controller_action_layout_render_before_' . $this->_request->getFullActionName()
    );
  4. Sammlungen von Modellen

    lib / internal / Magento / Framework / Model / ResourceModel / Db / Collection / AbstractCollection.php

    $this->_eventManager->dispatch($this->_eventPrefix . '_load_before', [$this->_eventObject => $this]);
    
    $this->_eventManager->dispatch($this->_eventPrefix . '_load_after', [$this->_eventObject => $this]);

Es gibt viele solcher Ereignisse und es ist eine Kombination aus explizit und implizit erzeugten Ereignissen in Magento2

huzefam
quelle
Gutes Zeug! Wir sollten unsere Antworten zusammenführen, um alles an einem Ort zu haben. Was denkst du?
mbalparda
Nun,
1

Die Antworten funktionieren vor allem gut, aber manchmal müssen Sie wissen, welche Ereignisse auf einer bestimmten Seite geladen werden und in welcher Reihenfolge sie ausgelöst werden.

Hier ist also der beste Weg (meiner Meinung nach, um dies zu wissen), xDebug zu verwenden und einen Haltepunkt in Zeile 56 der Klasse zu setzen Magento\Framework\Event\Manager(er befindet sich im libOrdner, nicht im appOrdner).

Sagen Sie in Ihrem Debugger einfach, dass die Variable ausgewertet und protokolliert$eventName werden soll, und dass alle Ereignisse in der Konsole angezeigt werden, während Sie die Seite laden.

Ich würde auch empfehlen, die "Suspend" -Option zu deaktivieren, da möglicherweise Hunderte von Ereignissen ausgelöst werden. Möglicherweise müssen Sie sie aktiviert lassen, damit der erste Haltepunkt erreicht wird, und dann können Sie sie entfernen.

Haltepunkt für Ereignisnamen Ich denke, dies ist der beste Weg, um alle Ereignisse beim Laden einer Seite auszulösen, da hier auch alle Ereignisse angezeigt werden, die von Controllern ausgelöst wurden. Jeder Controller löst Ereignisse am vor und nach dem mit zusammengesetzten Namen aus, die den FullActionName, den RouteName und den Standard-Post-Dispatch-Namen enthalten. Siehe die Framework\App\ActionKlasse unter der Methode dispatch () .

drew7721
quelle
0

Es ist schwierig , die Veranstaltung auf einer bestimmten Seite bekannt zu machen. Sie können diesen Code also verwenden, um die aufgerufenen Ereignisse zu verfolgen und das für Ihre Anforderungen am besten geeignete Ereignis zu verwenden

/vendor/magento/framework/Event/Manager.php

Fügen Sie diesen Code unter dem Ereignisnamen ein

$eventName = mb_strtolower($eventName);

// Code to log all events start
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$dirList = $objectManager->get('\Magento\Framework\App\Filesystem\DirectoryList');
$logPathName = $dirList->getPath('var') . '/log/events.log';
$eventLogFile = fopen($logPathName, 'a');
fwrite($eventLogFile, $eventName . ' => ' . implode(', ', array_keys($data)) . "\n");
fclose($eventLogFile);
// Code to log all events ends

Sie können die Check - Liste in<magentoroot>/var/log/events.log

Priyank
quelle
-1

Sie können unter dem Link der Ereignisse https://github.com/matinict/Magento-2-Events überprüfen

Ich leide, dass verschiedene Leute unterschiedliche Ereignisse teilen, aber keine Genauigkeit verloren meine Zeit. Endlich sind es nur Tricks, die Sie zu Ihrem Magento 2-Vendor-Check etc / event.xml geschickt haben

matinict
quelle