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.php
au 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.php
dans le navigateur et tout ce qui est placé dans TestApp :: launch () sera exécuté.
Maintenant, pourquoi cela fonctionne-t-il:
La méthode createApplication
de la classe bootstrap est la partie la plus importante. Il crée une instance d'une classe d'application. La méthode createApplication
attend une implémentation de la \Magento\Framework\AppInterface
qui contient 2 méthodes.
J'ai donc créé ma propre classe dans TestApp
laquelle implémente cette interface. J'ai toujours catchException
renvoyé la méthode false
car 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 run
mé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::run
initiera l'envoie de Magento (peut-être fera-t-il d'autres choses folles ... je n'ai pas encore tout vérifié) puis appelle la launch
mé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::run
appels $response->sendResponse();
où $response
est ce que la launch
mé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\Http
donc 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\Http
classe. Peut-être ajouter plus de paramètres dans le constructeur si vous en avez besoin.