Виходячи з відповіді @ 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
запускатиме Magento env (можливо, ще якісь божевільні речі ... Я ще не все перевірив), а потім викликає launch
метод із програми.
Ось чому потрібно помістити весь брудний код всередину цього методу.
Тоді \Magento\Framework\App\Bootstrap::run
виклики , $response->sendResponse();
де $response
це те , що launch
метод повертає.
Ось чому return $this->_response;
це потрібно. Це просто повертає порожню відповідь.
Я зробив свій клас додатків розширеним, \Magento\Framework\App\Http
тому у мене вже будуть параметри запиту та відповіді (та інші), але ви можете змусити ваш клас нічого не продовжувати. Потім потрібно скопіювати конструктор з \Magento\Framework\App\Http
класу. Можливо, додайте більше параметрів у конструктор, якщо вам це потрібно.