Dans magento 1, je pouvais créer un fichier dans lequel je n'avais besoin que d'instancier la Mage_Core_Model_App
classe, puis ajouter mon code "sale" à des fins de test.
Quelque chose comme ça test.php
:
<?php
//some settings
error_reporting(E_ALL | E_STRICT);
define('MAGENTO_ROOT', getcwd());
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
//instantiate the app model
Mage::app();
//my toy code in here.
Ensuite, j'ai pu appeler test.php
le navigateur et voir ce que je fais.
Comment puis-je faire la même chose pour Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Devrais-je créer mon propre modèle d'application?Réponses:
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.Ensuite, j'ai créé un fichier appelé
TestApp.php
au même endroit avec ce contenu.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éthodecreateApplication
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 toujourscatchException
renvoyé la méthodefalse
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
. Cetterun
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:
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 lalaunch
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 lalaunch
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.la source
TestApp
classe aurait pu être définie dans le mêmetest.php
fichier, mais je ne veux pas la rendre aussi sale :)parent::launch();
la première ligne delaunch()
méthode car elle me donnait l'erreur "Zone code not set"Pour les tests rapides / courts / sales, j'ai utilisé quelque chose comme ceci:
la source
Basé sur la réponse de @ Marius, je suis arrivé à cela.
Cela fonctionne à la fois via la ligne de commande et le navigateur, ce que je trouve utile.
Voici un exemple de script pour supprimer une catégorie par programme.
scripts/abstract.php
scripts/delete-category.php
Puis je le lance comme
php scripts/delete-category.php
la source
Magento\Framework\Exception\LocalizedException: Area code is not set
. Comment puis-je le définir? J'ai besoin du fronend.Comme demandé, un très bref exemple de la façon dont vous pourriez écrire un test (sans le placer dans votre structure d’extension de dossier). Hélas, tout cela est en ligne de commande et non pour la consommation via un navigateur.
Créer le fichier
dev/tests/unit/quicktest.php
avec
puis à partir du répertoire
dev/tests/unit/
runphpunit quicktest.php
qui exécutera votre code. Tout cela fonctionne puisque le fichierdev/tests/unit/phpunit.xml.dist
est chargé automatiquement et prépare l'environnement.Dans de nombreux cas, vous devrez peut-être fournir des entrées au constructeur des classes. Veuillez consulter les tests existants ci-dessous
dev/tests/unit/testsuite/
pour obtenir d'autres exemples de ce que cela pourrait être, y compris des objets moqueurs.la source
Voici un meilleur moyen que de vous connecter au système de test: Utilisez l'interface de ligne de commande de Magento 2.
Cela signifie que vous devrez intégrer votre code sandbox dans un module réel (ou en créer un à cet effet), mais vous devriez le faire de toute façon.
Une fois votre module configuré , ajouter une commande est assez facile. Tout ce dont vous avez besoin, c'est de la classe et de l'inspecteur d'enregistrement
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Exemple dérivé de https://github.com/magento/magento2-samples/tree/master/sample-module-command - consultez-le pour un module complet intégrant cette fonctionnalité. Il y a des exemples moins triviaux inclus.
Par convention, votre classe de commande doit toujours être dans
{module}/Console/Command
et se terminer parCommand.php
.Une fois que vous avez ajouté ces deux bits de code (et rincée cache de Magento, etc.), exécutez votre commande par son nom en SSH:
php bin/magento example:greeting
.Vous pouvez utiliser l'injection de dépendance dans ce contexte pour pouvoir exécuter le code de votre choix
execute()
.Cette interface est basée sur le composant Console de Symfony . Vous disposez ainsi d'un accès complet à toutes ces fonctionnalités, notamment les options / arguments , les tableaux et les barres de progression très simples .
Si vous rencontrez des problèmes lors de la configuration de votre commande ou de vos options, vous pouvez généralement exécuter la commande "list" pour obtenir une meilleure visibilité de ce qui ne va pas:
php bin/magento list
Prendre plaisir.
la source
La partie importante est la
\Magento\Framework\App\Bootstrap::create
mais comme la
Bootstrap::init()
méthode est privée, et qu'il se passe beaucoup de choses importantes, des méthodes publiques l'appelant sont nécessaires.Cest sur un côté le
createApplication()
et suivant larun()
méthode, mais aussigetDirList()
etgetObjectManager()
méthode, les deux ont besoin aucun argument.Donc, une application n'est pas nécessaire, mais le gestionnaire d'erreurs n'est pas initialisé.
la source
Peut-être hors sujet, mais j'utilise toujours le fichier du contrôleur d'index de Contacts dans Magento 1 pour tester des choses (méthode IndexAction). C'est aussi simple que d'aller à exemple.com/contacts. Vous devez juste vous assurer de ne pas appliquer ces modifications;)
Je suis sûr que vous pouvez faire quelque chose de similaire dans Magento 2. Cela vous évite de créer un nouveau fichier avec le code d'amorçage.
la source
Cette réponse est une légère modification de la réponse ci-dessus de Marius.
Parce que dans Magento 2.1, l'erreur se produisait comme
Area code not set
lors de l'utilisation de ce code.So the intension of this answer is to fix that error on Magento 2.1
Ce que vous devez faire pour corriger cette erreur est de définir la zone dans votre fichier
test.php file
. (voir le fichier modifié ci-dessous).Et le
TestApp.php
fichier restera le même.la source
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Vous pouvez diriger le script sur la racine magento en ajoutant le code ci-dessous et l'initialisation sera incluse. [Créez test.php sur le dossier racine magento et incluez le code ci-dessous]
J'espère que cela vous sera utile.
la source
Vous pouvez exécuter le script direct à partir de la racine de Magento 2 en utilisant le code ci-dessous. Créez un nouveau fichier dans le répertoire racine de Magento 2 et ajoutez ce code, puis ajoutez votre script dans le fichier.
la source
Voici ce que j'ai fait pour introduire Initialisation Magento dans mon script personnalisé en dehors du répertoire magento.
C'est la méthode recommandée selon la documentation de Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
la source