Основываясь на ответе @ Flyingmana, я немного покопался и нашел решение. Это похоже на работу для меня.
Сначала моё решение, потом несколько объяснений.
Я создал файл с именем test.php
в корне моего экземпляра 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);
Затем я создал файл, который называется TestApp.php
там же с этим контентом.
<?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;
}
}
Теперь я могу просто позвонить test.php
в браузер и все, что помещено в TestApp :: launch (), будет выполнено.
Теперь, почему это работает:
метод createApplication
из класса начальной загрузки является наиболее важной частью. Создает экземпляр класса приложения. Метод createApplication
ожидает реализации, \Magento\Framework\AppInterface
которая содержит 2 метода.
Поэтому я создал свой собственный класс, TestApp
который реализует этот интерфейс. Я всегда catchException
возвращал метод, false
потому что не хочу, чтобы мое приложение обрабатывало исключения. Если что-то не так, просто распечатайте это на экране.
Затем я реализовал метод launch
. этот называется \Magento\Framework\App\Bootstrap::run
. Этот run
метод делает почти то же самое, независимо от того, какое приложение передается в качестве параметра.
Единственное, что зависит от приложения, это строка:
$response = $application->launch();
Это означает, что вызов \Magento\Framework\App\Bootstrap::run
вызовет среду en Magento (может быть, сделаю что-то еще сумасшедшее ... я еще не все проверил), а затем вызовет launch
метод из приложения.
Вот почему вы должны поместить весь свой грязный код в этот метод.
Затем \Magento\Framework\App\Bootstrap::run
вызовы $response->sendResponse();
where $response
- это то, что launch
возвращает метод.
Вот почему return $this->_response;
это необходимо. Он просто возвращает пустой ответ.
Я сделал свой класс приложения расширенным, \Magento\Framework\App\Http
чтобы у меня уже были параметры запроса и ответа (и другие), но вы не можете заставить свой класс ничего не расширять. Затем вам нужно скопировать конструктор из \Magento\Framework\App\Http
класса. Возможно, добавьте больше параметров в конструктор, если вам это нужно.