Basé sur la réponse de @ Flyingmana, j'ai creusé un peu et trouvé une solution. Cela semble fonctionner pour moi.
D'abord ma solution, puis quelques explications.
J'ai créé un fichier appelé test.phpà la racine de mon instance de 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);
Ensuite, j'ai créé un fichier appelé TestApp.phpau même endroit avec ce contenu.
<?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;
}
}
Maintenant, je peux simplement appeler test.phpdans le navigateur et tout ce qui est placé dans TestApp :: launch () sera exécuté.
Maintenant, pourquoi cela fonctionne-t-il:
La méthode createApplicationde la classe bootstrap est la partie la plus importante. Il crée une instance d'une classe d'application. La méthode createApplicationattend une implémentation de la \Magento\Framework\AppInterfacequi contient 2 méthodes.
J'ai donc créé ma propre classe dans TestApplaquelle implémente cette interface. J'ai toujours catchExceptionrenvoyé la méthode falsecar je ne veux pas que mon application gère les exceptions. Si quelque chose ne va pas, imprimez-le simplement à l'écran.
Ensuite, j'ai implémenté la méthode launch. celui-ci s'appelle par \Magento\Framework\App\Bootstrap::run. Cette runméthode fait presque la même chose, quelle que soit l'application transmise en tant que paramètre.
La seule chose qui dépend de l'application est cette ligne:
$response = $application->launch();
Cela signifie que l'appel \Magento\Framework\App\Bootstrap::runinitiera l'envoie de Magento (peut-être fera-t-il d'autres choses folles ... je n'ai pas encore tout vérifié) puis appelle la launchméthode à partir de l'application.
C'est pourquoi vous devez mettre tout votre code sale à l'intérieur de cette méthode.
Ensuite, les \Magento\Framework\App\Bootstrap::runappels $response->sendResponse();où $responseest ce que la launchméthode retourne.
C'est pourquoi return $this->_response;est nécessaire. Cela renvoie simplement une réponse vide.
J'ai fait étendre ma classe d'applications, \Magento\Framework\App\Httpdonc je vais déjà avoir des paramètres de requête et de réponse (et d'autres), mais vous pouvez faire en sorte que votre classe ne s'étende pas. Ensuite, vous devez copier le constructeur de la \Magento\Framework\App\Httpclasse. Peut-être ajouter plus de paramètres dans le constructeur si vous en avez besoin.