In Magento 1 konnte ich eine Datei erstellen, in der ich nur die Mage_Core_Model_App
Klasse instanziieren musste , und dann meinen "schmutzigen" Code zu Testzwecken hinzufügen.
So etwas in der Art 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.
Dann konnte ich test.php
den Browser aufrufen und sehen, was ich tue.
Wie kann ich dasselbe für Magento 2 tun?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Soll ich mein eigenes App-Modell erstellen?Antworten:
Basierend auf der Antwort von @ Flyingmana habe ich ein wenig gegraben und eine Lösung gefunden. Es scheint, für mich zu arbeiten.
Erst meine Lösung, dann ein paar Erklärungen.
Ich habe eine Datei
test.php
im Stammverzeichnis meiner Magento-Instanz erstellt.Dann habe ich eine Datei erstellt,
TestApp.php
die an derselben Stelle wie dieser Inhalt aufgerufen wird.Jetzt kann ich einfach
test.php
den Browser aufrufen und alles, was in TestApp :: launch () steht, wird ausgeführt.Nun, warum das so ist:
Die Methode
createApplication
aus der Bootstrap-Klasse ist der wichtigste Teil. Es wird eine Instanz einer Anwendungsklasse erstellt. Die MethodecreateApplication
erwartet eine Implementierung der\Magento\Framework\AppInterface
, die 2 Methoden enthält.Also habe ich meine eigene Klasse erstellt
TestApp
, die diese Schnittstelle implementiert. Ich habe die MethodecatchException
zurückgebenfalse
immer , weil ich möchte , dass meine App nicht um Ausnahmen zu behandeln. Falls etwas nicht stimmt, drucken Sie es einfach auf dem Bildschirm aus.Dann habe ich die Methode implementiert
launch
. Dieser wird von angerufen\Magento\Framework\App\Bootstrap::run
. Dieserun
Methode führt fast das gleiche aus, unabhängig davon, welche Anwendung als Parameter übergeben wurde.Das einzige, was von der Anwendung abhängt, ist diese Zeile:
Dies bedeutet, dass der Aufruf
\Magento\Framework\App\Bootstrap::run
das Magento-Env auslöst (vielleicht machen Sie ein paar andere verrückte Sachen ... Ich habe noch nicht alles überprüft) und dann dielaunch
Methode aus der Anwendung aufruft .Aus diesem Grund müssen Sie Ihren gesamten Dirty-Code in diese Methode einfügen.
Dann werden die
\Magento\Framework\App\Bootstrap::run
Aufrufe$response->sendResponse();
where$response
ist, was dielaunch
Methode zurückgibt.Deshalb
return $this->_response;
wird es gebraucht. Es wird nur eine leere Antwort zurückgegeben.Ich habe meine App-Klasse erweitert,
\Magento\Framework\App\Http
sodass ich bereits Anforderungs- und Antwortparameter (und andere) habe, aber Sie können Ihre Klasse dazu bringen, nichts zu erweitern. Dann müssen Sie den Konstruktor aus der\Magento\Framework\App\Http
Klasse kopieren . Fügen Sie ggf. weitere Parameter im Konstruktor hinzu.quelle
TestApp
könnte die Klasse in derselbentest.php
Datei definiert worden sein , aber ich möchte es nicht so schmutzig machen :)parent::launch();
als erste Zeile derlaunch()
Methode hinzufügen , da es mir einen Fehler "Vorwahl nicht gesetzt" gabFür schnelle / kurze / schmutzige Tests habe ich Folgendes verwendet:
quelle
Aufgrund der Antwort von @ Marius habe ich mir das ausgedacht .
Es funktioniert sowohl über die Kommandozeile als auch über den Browser, was ich nützlich finde.
Hier ist ein Beispielskript zum programmgesteuerten Löschen einer Kategorie.
scripts/abstract.php
scripts/delete-category.php
Dann lasse ich es einfach so laufen
php scripts/delete-category.php
quelle
Magento\Framework\Exception\LocalizedException: Area code is not set
. Wie kann ich es einstellen? Ich brauche die Frontpartie.Auf Anfrage ein sehr kurzes Beispiel, wie Sie einen Test schreiben können (ohne ihn in Ihrer Ordnererweiterungsstruktur abzulegen). Leider ist dies alles Kommandozeile und nicht zum Verzehr über einen Browser.
Erstellen Sie die Datei
dev/tests/unit/quicktest.php
mit
dann aus dem Verzeichnis
dev/tests/unit/
laufen ,phpunit quicktest.php
die Ihren Code ausgeführt werden. Dies alles funktioniert, da die Dateidev/tests/unit/phpunit.xml.dist
automatisch geladen wird und die Umgebung vorbereitet.In vielen Fällen müssen Sie möglicherweise Eingaben an den Konstruktor der Klassen senden. In den vorhandenen Tests unter finden Sie
dev/tests/unit/testsuite/
weitere Beispiele, wie dies aussehen könnte, einschließlich der Verspottung von Objekten.quelle
Hier ist eine bessere Möglichkeit, als sich in das Testsystem einzuklinken: Verwenden Sie die Befehlszeilenschnittstelle von Magento 2.
Das bedeutet, dass Sie Ihren Sandbox-Code in ein tatsächliches Modul integrieren müssen (oder zu diesem Zweck eines erstellen müssen), aber Sie sollten dies trotzdem tun.
Sobald Sie Ihr Modul eingerichtet haben , ist das Hinzufügen eines Befehls ziemlich einfach. Alles, was Sie brauchen, ist die Klasse und DI, um sie zu registrieren.
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Beispiel abgeleitet von https://github.com/magento/magento2-samples/tree/master/sample-module-command - ein vollständiges Modul mit dieser Funktionalität finden Sie dort. Es gibt weniger triviale Beispiele .
Konventionell sollte Ihre Befehlsklasse immer in sein
{module}/Console/Command
und mit endenCommand.php
.Sobald man diese zwei Bits von Code (und gerötet Magento Cache, etc.) hinzugefügt haben, führen Sie Ihren Befehl mit Namen in SSH:
php bin/magento example:greeting
.In diesem Kontext können Sie die Abhängigkeitsinjektion verwenden, sodass Sie jeden Code ausführen können, den Sie möchten
execute()
.Diese Benutzeroberfläche basiert auf der Symfony- Konsolenkomponente , sodass Sie auch vollen Zugriff auf alle Funktionen haben, einschließlich Optionen / Argumente , Tabellen und einfacher Fortschrittsbalken .
Wenn Sie beim Einrichten Ihres Befehls oder Ihrer Optionen auf Probleme stoßen, können Sie normalerweise den Befehl 'list' ausführen, um einen besseren Überblick über die Fehlerursache zu erhalten:
php bin/magento list
Genießen.
quelle
Der wichtige Teil ist der
\Magento\Framework\App\Bootstrap::create
Da die
Bootstrap::init()
Methode privat ist und viele wichtige Dinge vorkommen, werden öffentliche Methoden benötigt, die sie aufrufen.Das ist auf der einen Seite die
createApplication()
und folgenderun()
Methode, aber auch diegetDirList()
undgetObjectManager()
Methode, die beide kein Argument benötigen.Eine Anwendung wird also nicht benötigt, die Nachteile sind, dass der Fehlerhandler nicht initialisiert wird.
quelle
Möglicherweise nicht zum Thema gehörend, aber ich verwende immer die Contacts-Index-Controller-Datei in Magento 1, um Dinge zu testen (IndexAction-Methode). Es ist so einfach wie das Aufrufen von example.com/contacts. Sie müssen nur sicherstellen, dass diese Änderungen nicht übernommen werden.
Ich bin sicher, dass Sie in Magento 2 etwas Ähnliches tun können. Sie müssen keine neue Datei mit dem Bootstrap-Code erstellen.
quelle
Diese Antwort ist eine leichte Modifikation der obigen Antwort von Marius
Denn in Magento 2.1 kam der Fehler wie
Area code not set
bei der Verwendung dieses Codes.So the intension of this answer is to fix that error on Magento 2.1
Um diesen Fehler zu beheben, müssen Sie den Bereich in Ihrem Netzwerk definieren
test.php file
. (siehe die modifizierte Datei unten).Und die
TestApp.php
Datei bleibt gleich.quelle
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Sie können Skripte auf Magento-Root ausführen, indem Sie den folgenden Code hinzufügen, und Bootstrap wird mitgeliefert.
Hoffe das wird hilfreich sein.
quelle
Sie können das Direktskript von Magento 2 root aus mit dem folgenden Code ausführen. Erstellen Sie eine neue Datei im Magento 2-Stammverzeichnis, fügen Sie diesen Code hinzu und fügen Sie anschließend Ihr Skript in die Datei ein.
quelle
Folgendes habe ich getan, um Magento außerhalb des Magento-Verzeichnisses in mein benutzerdefiniertes Skript zu initialisieren.
Dies ist der empfohlene Weg gemäß den Magento-Dokumenten. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
quelle