Basierend auf der Antwort von @ Flyingmana habe ich ein wenig gegraben und eine Lösung gefunden. Es scheint, für mich zu arbeiten.
Erst meine Lösung, dann ein paar Erklärungen.
Ich habe eine Datei test.phpim Stammverzeichnis meiner Magento-Instanz erstellt.
<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);
Dann habe ich eine Datei erstellt, TestApp.phpdie an derselben Stelle wie dieser Inhalt aufgerufen wird.
<?php
class TestApp
extends \Magento\Framework\App\Http
implements \Magento\Framework\AppInterface {
public function launch()
{
//dirty code goes here.
//the example below just prints a class name
echo get_class($this->_objectManager->create('\Magento\Catalog\Model\Category'));
//the method must end with this line
return $this->_response;
}
public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
{
return false;
}
}
Jetzt kann ich einfach test.phpden Browser aufrufen und alles, was in TestApp :: launch () steht, wird ausgeführt.
Nun, warum das so ist:
Die Methode createApplicationaus der Bootstrap-Klasse ist der wichtigste Teil. Es wird eine Instanz einer Anwendungsklasse erstellt. Die Methode createApplicationerwartet eine Implementierung der \Magento\Framework\AppInterface, die 2 Methoden enthält.
Also habe ich meine eigene Klasse erstellt TestApp, die diese Schnittstelle implementiert. Ich habe die Methode catchExceptionzurückgeben falseimmer , weil ich möchte , dass meine App nicht um Ausnahmen zu behandeln. Falls etwas nicht stimmt, drucken Sie es einfach auf dem Bildschirm aus.
Dann habe ich die Methode implementiert launch. Dieser wird von angerufen \Magento\Framework\App\Bootstrap::run. Diese runMethode führt fast das gleiche aus, unabhängig davon, welche Anwendung als Parameter übergeben wurde.
Das einzige, was von der Anwendung abhängt, ist diese Zeile:
$response = $application->launch();
Dies bedeutet, dass der Aufruf \Magento\Framework\App\Bootstrap::rundas Magento-Env auslöst (vielleicht machen Sie ein paar andere verrückte Sachen ... Ich habe noch nicht alles überprüft) und dann die launchMethode aus der Anwendung aufruft .
Aus diesem Grund müssen Sie Ihren gesamten Dirty-Code in diese Methode einfügen.
Dann werden die \Magento\Framework\App\Bootstrap::runAufrufe $response->sendResponse();where $responseist, was die launchMethode zurückgibt.
Deshalb return $this->_response;wird es gebraucht. Es wird nur eine leere Antwort zurückgegeben.
Ich habe meine App-Klasse erweitert, \Magento\Framework\App\Httpsodass ich bereits Anforderungs- und Antwortparameter (und andere) habe, aber Sie können Ihre Klasse dazu bringen, nichts zu erweitern. Dann müssen Sie den Konstruktor aus der \Magento\Framework\App\HttpKlasse kopieren . Fügen Sie ggf. weitere Parameter im Konstruktor hinzu.