Ich versuche seit ein paar Tagen einen eigenen Controller im neuen Plugin-System in einem 5.3 RC2 zu registrieren, bekomme aber immer nur den PHP-Fehler:
Fatal error : Uncaught TypeError: Argument 1 passed to MeinPlugin\Mein Plugin::registerMeinController() must be an instance of Enlight_Controller_EventArgs, instance of Enlight_Event_EventArgs given
In der Plugin-Bootstrap ist folgender Code:
public static function getSubscribedEvents()
{
return array(
"Enlight_Controller_Dispatcher_ControllerPath_Frontend_HeidelPayPalAction" => "registerMeinController",
);
}
public function registerMeinController(Enlight_Controller_EventArgs $args)
{
return __DIR__. '/Controllers/Frontend/MeinControllerAction.php';
}
public function registerMeinController(Enlight_Controller_ActionEventArgs $args)
{
static $subscriber;
if (!isset($subscriber)) {
require_once __DIR__. '/Subscriber/MeinControllerAction.php';
$subscriber = new \MeinPlugin\Subscriber\Shopware_Controllers_Frontend_MeinControllerAction($this);
}
$subscriber->loadMeinControllerController($args);
}
Unabhängig welchen der beiden Parameter ich in die „registerMeinController()“ übergebe ich bekomme immer den selben Fehler… und natürlich läuft immer nur eine der beiden „registerMeinController()“ Funktionen.
Im Controller dann folgender Code unter „MeinPlugin/Controllers/Frontend/MeinControllerAction.php“
namespace MeinPlugin\Controllers\Frontend;
use Shopware\Plugin;
use Enlight_Controller_EventArgs;
use Enlight_Controller_ActionEventArgs;
//class MeinControllerAction
//class Shopware_Controllers_Frontend_MeinControllerAction
//class Shopware_Controllers_Frontend_MeinControllerAction extends \Shopware\Plugin
//class Shopware_Controllers_Frontend_MeinControllerAction extends \Shopware\Enlight_Controller_Action
//class MeinControllerAction extends Enlight_Controller_Action
class Shopware_Controllers_Frontend_MeinControllerAction extends \Enlight_Controller_Action
{
function __construct()
{
die("__construct aufgerufen");
}
public function onPostDispatch()
{
die("onPostDispatch aufgerufen");
}
public function indexAction()
{
die("indexAction aufgerufen");
}
}
Der Controller sollte anspringen wenn ich im Checkout auf der Checkout-Confirm bin und dort auf „Kostenpflichtig bestellen“ geklickt habe
der Fehler sagt ja erstmal, dass du Enlight_Event_EventArgs nutzen sollst.
Jetzt frage ich mich: Was passiert denn, wenn du genau diesen Parameter-Typen angibst?
Dann kann ja theoretisch nicht mehr die selbe Fehlermeldung kommen.
Kommentier’ am Besten mal einfach die zweite Kopie von registerMeinController aus, nutze den angegeben Parameter und dann schreib’ mir mal, was du dadurch für einen neuen Fehler bekommst!
Übrigens:
Du musst dich eigentlich gar nicht mehr selbst darum kümmern deinen Controller zu registrieren - wenn du den Controller korrekt anlegst, im richtigen Ordner* und mit richtigem Naming, wird dieser automatisch geladen.
*ein Frontend-Controller gehört bspw. in den Ordner „deinPlugin/Controllers/Frontend“, dann könnte er auch automatisch geladen werden
Aber zu deinem Problem: Dein Typehint bei deinen beiden Methoden lautet auf Enlight_Controller_EventArgs und Enlight_Controller_ActionEventArgs. Diese beiden Klassen sind von Enlight_Event_EventArgs abgeleitet. Shopware übergibt dem Event an der Stelle aber nur eine Klasse vom Typ Enlight_Event_EventArgs. Diese Klasse ist weniger spezifisch. Er kann also nicht genau ermitteln welche deiner beiden Methoden er aufrufen soll.
Erstmal vielen Dank für eure Antworten. Wenn ich der „registerMeinController()“ das „Enlight_Controller_EventArgs“-Objekt reingebe kommt folgender Fehler dabei raus:
Fatal error : Uncaught TypeError: Argument 1 passed to MeinPlugin\MeinPlugin::registerMeinController() must be an instance of Enlight_Controller_EventArgs, instance of Enlight_Event_EventArgs given
Deswegen bin ich auch etwas verwirrt leider ;)
Mein Controller liegt ja auch in dem dafür vorgesehenen Verzeichnis „MeinPlugin/Controllers/Frontend/MeinController.php“. Ich hatte aus dem Alten Plugin-System noch im Kopf, dass die registrierten Controller in der Tabelle „s_core_subscribes“ eingetragen werden. Das ist wohl unter dem neuen Plugin-System auch nicht mehr so nehme ich an?
um direkt mal an deine letzte Frage anzuknüpfen.
In der Tabelle s_core_subscribes werden ausschließlich Events gespeichert.
Die Registrierung eigener Controller findet jedoch über Events statt - nur, um dich da einmal kurz abzuholen.
Das Ganze funktioniert auch mit dem neuen Plugin-System noch einwandfrei, ist aber nicht länger zwingend nötig.
Dann zum eigentlichen Thema:
Sorry, da habe ich ausversehen das Falsche kopiert.
Du musst Enlight_Event_EventArgs nutzen und nicht Enlight_Controller_EventArgs.
Das müsste auf alle Fälle funktionieren.
Heisst also ich sollte zumindest meine Events in der Tabelle s_core_subscribes sehen wenn ich sie in der „getSubscribedEvents()“ registriere? … gesehen hab ich noch keine und mir heut schon 2 mal die Brille geputzt Meine „Enlight_Controller_Action_PostDispatch“ => „onPostDispatch“ - Registrierung funktioniert zwar wunderbar aber taucht auch nicht in der Tabelle auf. Deswegen meine Frage dazu.
Zum eigentlichen Problem und der nächsten Fehlermeldung:
Fatal error : Uncaught ReflectionException: Class Shopware_Controllers_Frontend_MeinControllerAction does not exist in /var/www/html/sascha/sw_5300_rc1/engine/Library/Enlight/Hook/ProxyFactory.php:164 Stack trace: …
im neuen Plugin-System wird für die Event-Registrierung folgendes Interface genutzt. shopware/SubscriberInterface.php at 5.2 · shopware/shopware · GitHub
Dadurch werden die Events zur Laufzeit dynamisch registriert. Das bedeutet aber gleichzeitig auch, dass sie eben nicht mehr in die DB Tabelle geschrieben werden.
Sorry erstmal für die lange Wartezeit, Kunden hatten mal wieder ein paar Fragen … kennst das ja
Jop, klar hatte ich meinem Controller einen Namespace gegeben kaum ist der draussen und eine __construct drin läuft er auch rein. nur die „indexAction()“ kommt noch nicht zum Zug.
Fatal error : Uncaught Enlight_Exception: Method „Shopware_Proxies_ShopwareControllersFrontendMeinPluginActionProxy::dispatch“ not found failure
Da fehlen noch ein paar „_“ in der Fehlermeldung würde ich mal sagen
Gehe ich denn noch recht in der Annahme, dass wenn ich wie im Beispiel unter https://developers.shopware.com/developers-guide/plugin-system/#add-a-new-payment-method beschrieben eine Payment-Methode registriert habe, ich dann innerhalb des in der PaymentMethode in den $options genannten Controller über die indexAction() (innerhalb des Controllers) den ersten Einstiegspunkt in den Controller habe wenn ich auf den „Kostenpflichtig bestellen“ Button klicke? Natürlich so fern ich keine andere Action angegeben habe wohin es gehen soll.
leider ist die Benamung der Optionen, bzw der Tabellenspalten in s_core_paymentmeans, nicht ganz glücklich
‚action‘ beschreibt hier in der Tat den Namen des Controllers. In deinem Fall also ‚MeinControllerAction‘. Da die indexAction die default Action ist, die immer aufgerufen wird, wenn nichts anderes angegeben ist, wird diese tatsächlich auch dann ausgeführt. Dies geschieht über die paymentAction im Frontend/Checkout Controller: shopware/Checkout.php at 5.2 · shopware/shopware · GitHub
Die Reihenfolge ist dann also wie folgt „Kostenpflichtig bestellen“ -> paymentAction -> dein Payment Controller
Übrigens:
Du musst dich eigentlich gar nicht mehr selbst darum kümmern deinen Controller zu registrieren - wenn du den Controller korrekt anlegst, im richtigen Ordner* und mit richtigem Naming, wird dieser automatisch geladen.
*ein Frontend-Controller gehört bspw. in den Ordner „deinPlugin/Controllers/Frontend“, dann könnte er auch automatisch geladen werden
Gruß,
Patrick
Hier möchte ich nochmal der Vollständigkeit halber ergänzen, dass das zwar für aktuelle Versionen korrekt ist, aber erst seit SW5.2.7 so ist. Wenn ihr das Plugin ab 5.2.0 veröffentlichen wollt müsst ihr den Controller selbst registrieren.
Ja danke für den Hinweis. Unsere Planungen sind aktuell so, dass wir für bis 5.2.x das alte Plugin noch laufen haben und ein neues Plugin dann für 5.3.x. Wir werden dann sehen wie updatefreudig die Masse unserer Kunden ist und hoffen auf einen nicht zu langen parallellen Pflegezeitraum.
Sorry, dass ich noch mal stören muss aber auch ohne einen eigenen Konstruktur in meinem Controller bekomme ich beim Aufruf folgendes:
Fatal error : Uncaught TypeError: Argument 1 passed to Enlight_Event_EventArgs::__construct() must be of the type array, object given, called in …/sw_5300_rc1/engine/Library/Enlight/Controller/Dispatcher/Default.php
Die indexAction() wird ebenfalls noch nicht angesprochen.
Mir ist klar, dass man sich nicht mit allen Shopsystemen (Shopware, Magento, Gambio etc pp), für die man Schnittstellen zur Verfügung stellen möchte, bei Inhouse Lösungen auskennen kann - aber sollte man sich in so einem Fall - insbesondere bei sicherheitsrelevanten Plugins (Zahlungsdienstleister!) - nicht an einen Profi wenden und die Umsetzung ggf. einer Shopware Agentur überlassen?! Dieser Thread mit seinen 30 Antworten schreit nicht gerade nach Kompetenz. Zumal ihr reichlich spät mit der Anpassung an Shopware 5.3 beginnt und anscheinend noch nie damit gearbeitet habt.