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.php
w 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.php
tej 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.php
w przeglądarce i wszystko, co jest umieszczone w TestApp :: launch () zostanie wykonane.
Dlaczego to działa:
Najważniejsza jest metoda createApplication
z klasy bootstrap. Tworzy instancję klasy aplikacji. Metoda createApplication
oczekuje implementacji \Magento\Framework\AppInterface
zawierającej 2 metody.
Więc stworzyłem własną klasę, TestApp
która implementuje ten interfejs. Zrobiłem sposób catchException
powrócić false
zawsze, 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 run
metoda 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::run
zainicjuje env Magento (może zrobię trochę innych szalonych rzeczy ... jeszcze nie wszystko sprawdziłem), a następnie wywoła launch
metodę z aplikacji.
Dlatego musisz umieścić cały brudny kod w tej metodzie.
Następnie \Magento\Framework\App\Bootstrap::run
rozmowy $response->sendResponse();
gdzie $response
jest to, co launch
zwraca metoda.
Dlatego return $this->_response;
jest potrzebny. Zwraca tylko pustą odpowiedź.
Sprawiłem, że moja klasa aplikacji została rozszerzona, \Magento\Framework\App\Http
wię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\Http
klasy. W razie potrzeby dodaj więcej parametrów do konstruktora.