Opierając się na odpowiedzi @ Flyingmana, zrobiłem małe kopanie i wymyśliłem rozwiązanie. Wydaje mi się, że dla mnie działa.
Najpierw moje rozwiązanie, a potem kilka wyjaśnień.
Utworzyłem plik o nazwie test.phpw katalogu głównym mojej instancji magento.
<?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);
Następnie utworzyłem plik o TestApp.phptej samej nazwie o tym samym miejscu.
<?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;
}
}
Teraz mogę po prostu wywołać test.phpw przeglądarce i wszystko, co jest umieszczone w TestApp :: launch () zostanie wykonane.
Dlaczego to działa:
Najważniejsza jest metoda createApplicationz klasy bootstrap. Tworzy instancję klasy aplikacji. Metoda createApplicationoczekuje implementacji \Magento\Framework\AppInterfacezawierającej 2 metody.
Więc stworzyłem własną klasę, TestAppktóra implementuje ten interfejs. Zrobiłem sposób catchExceptionpowrócić falsezawsze, bo nie chcę mojej aplikacji do obsługi wyjątków. Jeśli coś jest nie tak, po prostu wydrukuj to na ekranie.
Następnie wdrożyłem metodę launch. ten jest nazywany przez \Magento\Framework\App\Bootstrap::run. Ta runmetoda robi prawie to samo, bez względu na to, co aplikacja przekazała jako parametr.
Jedyne, co zależy od aplikacji, to ta linia:
$response = $application->launch();
Oznacza to, że wywołanie \Magento\Framework\App\Bootstrap::runzainicjuje env Magento (może zrobię trochę innych szalonych rzeczy ... jeszcze nie wszystko sprawdziłem), a następnie wywoła launchmetodę z aplikacji.
Dlatego musisz umieścić cały brudny kod w tej metodzie.
Następnie \Magento\Framework\App\Bootstrap::runrozmowy $response->sendResponse();gdzie $responsejest to, co launchzwraca metoda.
Dlatego return $this->_response;jest potrzebny. Zwraca tylko pustą odpowiedź.
Sprawiłem, że moja klasa aplikacji została rozszerzona, \Magento\Framework\App\Httpwięc będę już mieć parametry żądania i odpowiedzi (i inne), ale możesz sprawić, że twoja klasa nic nie rozszerzy. Następnie musisz skopiować konstruktor z \Magento\Framework\App\Httpklasy. W razie potrzeby dodaj więcej parametrów do konstruktora.