Aufruf einer Controller-Methode aus einem Subscriber heraus;

Hallo liebe Shopware-Community,

 

ich stehe momentan vor dem Problem, dass ich aus einem meiner Subscriber (welcher eine Methode eines Shopware-Controllers via ::replace ersetzt) eine andere, protected Methode des zugehörigen Shopware-Controllers aufrufen muss. Schauen wir uns mal etwas Code zur Klarheit an.

  1. Der Subscriber ersetzt folgende Methode:

    public static function getSubscribedEvents() {
    return [
    ‘Shopware_Controllers_Frontend_Register::saveRegisterAction::replace’ => ‘replaceSaveRegisterAction’,
    ]
    }

  2. Der grobe Aufbau dieser Methode ist wie folgt (Schnippsel):

    public function replaceSaveRegisterAction(\Enlight_Hook_HookArgs $arguments) {
    $this->controller = $arguments->getSubject();
    $request = $this->controller->Request();
    $view = $this->controller->View();
    /** etc.pp. /
    $customerForm = $this->createCustomerForm($data[‘register’][‘personal’]);
    /
    * und noch weiterer Code … */
    }

 

  1. So. Jetzt kommt die eigentliche Stelle in der Methode

    private function createCustomerForm(array $data) {
    $customer = new Customer();

    /** Hier ist das, was ich erreichen will - klappt so aber nicht */
    $form = $this->controller->executeParent(‘createForm’, [PersonalFormType::class, $customer]);
    $form->submit($data);

    return $form;
    }

 

In dieser Methode möchte ich also die Methode createForm(…) des “eigentlichen” Controllers Shopware_Controllers_Frontend_Register (genauer gesagt liegt diese Methode sogar noch eine Ebene höher in der Klasse Enlight_Controller_Action , von welcher der Shopware-Controller ableitet) aufrufen. Ist so etwas in einem Hook überhaupt möglich? So wie ich das während des Debuggings gesehen habe, könnte ich via executeParent(…) nur die direkt ersetzte Methode saveRegisterAction aufrufen.

 

Wenn Ihr noch mehr Infos braucht, einfach Bescheid sagen. Vielen Dank schonmal.

Geht leider nicht. protected ist nun mal … protected.

Bleibt nicht viel anderes übrig als die gewünschte Methode in deinem Subscriber zu duplizieren (ist ja zum Glück nur ein Einzeiler). Und je nach Lust und Laune einen Pull-Request im Git-Repository von Shopware absetzen und das Ding auf public stellen lassen; so für die Zukunft. Da sind die eigentlich immer recht kulant.

1 Like