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.php
im 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.php
die 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.php
den Browser aufrufen und alles, was in TestApp :: launch () steht, wird ausgeführt.
Nun, warum das so ist:
Die Methode createApplication
aus der Bootstrap-Klasse ist der wichtigste Teil. Es wird eine Instanz einer Anwendungsklasse erstellt. Die Methode createApplication
erwartet 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 catchException
zurückgeben false
immer , 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 run
Methode 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::run
das Magento-Env auslöst (vielleicht machen Sie ein paar andere verrückte Sachen ... Ich habe noch nicht alles überprüft) und dann die launch
Methode 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::run
Aufrufe $response->sendResponse();
where $response
ist, was die launch
Methode 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\Http
sodass 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\Http
Klasse kopieren . Fügen Sie ggf. weitere Parameter im Konstruktor hinzu.