Основываясь на ответе @ 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класса. Возможно, добавьте больше параметров в конструктор, если вам это нужно.