Hat schon jemand einen eigenen Controller im neuen Plugin-System für 5.3 RC2 registriert?

Hallo Zusammen,

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

Moin @HeidelbergerPayment‍,

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! :slight_smile:

Ü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  Shopware

@Patrick Stahl schrieb:
Übrigens:
Du musst dich eigentlich garnicht …
Gruß,
Patrick  Shopware

gar nicht wird gar nicht zusammengeschrieben :slight_smile: Sorry, der musste sein :slight_smile:

1 „Gefällt mir“

Ab Shopware 5.2.7 werden die Controller automatisch registiert. Das brauchst du also nicht mehr zu tun -> https://developers.shopware.com/developers-guide/plugin-system/#controller-auto-registration

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.

Moin @arnebecker‍ ,

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?

Moin @HeidelbergerPayment‍,

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. :slight_smile:

Gruß,
Patrick  Shopware

Hallo [@Patrick Stahl](http://forum.shopware.com/profile/1869/Patrick Stahl „Patrick Stahl“)‍ ,

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 :wink: 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: …

Hallo,

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. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“

Hallo [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann “Michael Telgmann”)‍ ,

Das klärt dann schon mal warum ich vom neuen Plugin dann nichts mehr in der Tabelle finde Danke dafür! :wink:

 

Gruß Sascha

Du hast dem Controller einen Namespace gegeben, richtig?

Nehm den Namespace mal raus! :slight_smile:

1 „Gefällt mir“

Hallo [@Patrick Stahl](http://forum.shopware.com/profile/1869/Patrick Stahl „Patrick Stahl“)‍ ,

Sorry erstmal für die lange Wartezeit, Kunden hatten mal wieder ein paar Fragen … kennst das ja :wink:

Jop, klar hatte ich meinem Controller einen Namespace gegeben :wink: 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

Hallo Sascha,

in Controllern darfst du auch keinen Konstruktor einbauen. Das muss alles über Shopware laufen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“

Morgen [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“)‍ ,

Okay, Konstruktor nehme ich raus.

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.

 

Grüße Sascha

Moin Sascha,

leider ist die Benamung der Optionen, bzw der Tabellenspalten in s_core_paymentmeans, nicht ganz glücklich  Wink 
‚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
 

Viele Grüße aus Schöppingen

cool Michael Telgmann

@Patrick Stahl schrieb:

Ü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  Shopware

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. 

2 „Gefällt mir“

Hallo [@Patrick Stahl](http://forum.shopware.com/profile/1869/Patrick Stahl “Patrick Stahl”)‍ ,

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.

 

Grüße aus Heidelberg

Sascha

Hallo [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“)‍ ,

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.

Der ganze Code liegt auf https://github.com/heidelpay-sp/HeidelpayShopwarePayment falls du mal kurz Zeit hast

 

Grüße Sascha

Nur mal so am Rande:

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.

Viele Grüße
https://www.digitvision.de

4 „Gefällt mir“