W magento 1 mogłem stworzyć plik, w którym wystarczyło tylko utworzyć instancję Mage_Core_Model_App
klasy, a następnie dodać „brudny” kod do celów testowych.
Coś takiego 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.
Potem mogłem zadzwonić test.php
w przeglądarce i zobaczyć, co robię.
Jak mogę zrobić to samo dla Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Czy powinienem stworzyć własny model aplikacji?Odpowiedzi:
Opierając się na odpowiedzi @ Flyingmana, zrobiłem małe kopanie i wymyśliłem rozwiązanie. Wydaje mi się, że dla mnie działa.
Najpierw moje rozwiązanie, a potem kilka wyjaśnień.
Utworzyłem plik o nazwie
test.php
w katalogu głównym mojej instancji magento.Następnie utworzyłem plik o
TestApp.php
tej samej nazwie o tym samym miejscu.Teraz mogę po prostu wywołać
test.php
w przeglądarce i wszystko, co jest umieszczone w TestApp :: launch () zostanie wykonane.Dlaczego to działa:
Najważniejsza jest metoda
createApplication
z klasy bootstrap. Tworzy instancję klasy aplikacji. MetodacreateApplication
oczekuje implementacji\Magento\Framework\AppInterface
zawierającej 2 metody.Więc stworzyłem własną klasę,
TestApp
która implementuje ten interfejs. Zrobiłem sposóbcatchException
powrócićfalse
zawsze, bo nie chcę mojej aplikacji do obsługi wyjątków. Jeśli coś jest nie tak, po prostu wydrukuj to na ekranie.Następnie wdrożyłem metodę
launch
. ten jest nazywany przez\Magento\Framework\App\Bootstrap::run
. Tarun
metoda robi prawie to samo, bez względu na to, co aplikacja przekazała jako parametr.Jedyne, co zależy od aplikacji, to ta linia:
Oznacza to, że wywołanie
\Magento\Framework\App\Bootstrap::run
zainicjuje env Magento (może zrobię trochę innych szalonych rzeczy ... jeszcze nie wszystko sprawdziłem), a następnie wywołalaunch
metodę z aplikacji.Dlatego musisz umieścić cały brudny kod w tej metodzie.
Następnie
\Magento\Framework\App\Bootstrap::run
rozmowy$response->sendResponse();
gdzie$response
jest to, colaunch
zwraca metoda.Dlatego
return $this->_response;
jest potrzebny. Zwraca tylko pustą odpowiedź.Sprawiłem, że moja klasa aplikacji została rozszerzona,
\Magento\Framework\App\Http
więc będę już mieć parametry żądania i odpowiedzi (i inne), ale możesz sprawić, że twoja klasa nic nie rozszerzy. Następnie musisz skopiować konstruktor z\Magento\Framework\App\Http
klasy. W razie potrzeby dodaj więcej parametrów do konstruktora.źródło
TestApp
klasa mogła zostać zdefiniowana w tym samymtest.php
pliku, ale nie chcę, aby była tak brudna :)parent::launch();
jako pierwszy wierszlaunch()
metody, ponieważ dawał mi błąd „Nie ustawiono kodu kierunkowego”Do szybkich / krótkich / brudnych testów użyłem czegoś takiego:
źródło
Na podstawie odpowiedzi @ Marius wymyśliłem to.
Działa zarówno za pomocą wiersza polecenia, jak i przeglądarki, co uważam za przydatne.
Oto przykładowy skrypt do programowego usuwania kategorii.
scripts/abstract.php
scripts/delete-category.php
Potem po prostu to uruchamiam
php scripts/delete-category.php
źródło
Magento\Framework\Exception\LocalizedException: Area code is not set
. Jak mogę to ustawić? Potrzebuję fronend.Zgodnie z prośbą bardzo krótki przykład, w jaki sposób można napisać test (bez umieszczania go w strukturze rozszerzeń folderów). Niestety jest to wszystko wiersz poleceń, a nie do konsumpcji za pośrednictwem przeglądarki.
Utwórz plik
dev/tests/unit/quicktest.php
z
następnie z katalogu
dev/tests/unit/
uruchom,phpunit quicktest.php
który wykona twój kod. To wszystko działa, ponieważ plikdev/tests/unit/phpunit.xml.dist
jest automatycznie ładowany i przygotowuje środowisko.W wielu przypadkach może być konieczne podanie danych wejściowych do konstruktora klas. Zobacz istniejące testy poniżej,
dev/tests/unit/testsuite/
aby uzyskać dalsze przykłady tego, jak to może wyglądać, w tym kpiące obiekty.źródło
Oto lepszy sposób niż podpięcie się do systemu testowego: użyj interfejsu wiersza poleceń Magento 2.
Oznacza to, że będziesz musiał zintegrować kod piaskownicy z rzeczywistym modułem (lub utworzyć go do tego celu), ale i tak powinieneś to zrobić.
Po Twojej moduł skonfigurować , dodając polecenie jest całkiem proste. Wszystko czego potrzebujesz to klasa i DI, aby ją zarejestrować.
1. {moduł} /etc/di.xml
2. {moduł} /Console/Command/GreetingCommand.php
Przykład pochodzący z https://github.com/magento/magento2-samples/tree/master/sample-module-command - zobacz tam kompletny moduł zawierający tę funkcjonalność. Zawiera mniej trywialne przykłady .
Zgodnie z konwencją klasa poleceń powinna zawsze znajdować się na
{module}/Console/Command
końcu i kończyć się niąCommand.php
.Po dodaniu tych dwóch bitów kodu (i wypiekami na Magento cache, etc.), wykonywać swoje polecenia z nazwy w SSH:
php bin/magento example:greeting
.W tym kontekście można użyć wstrzykiwania zależności, dzięki czemu można uruchomić dowolny kod, który ma się znaleźć
execute()
.Interfejs ten oparty jest na komponencie konsoli Symfony , dzięki czemu masz również pełny dostęp do całego tego szerokiego zakresu funkcji, w tym opcji / argumentów , tabel i bardzo łatwych pasków postępu .
Jeśli napotkasz jakiekolwiek problemy z konfiguracją polecenia lub opcji, zwykle możesz uruchomić polecenie „lista”, aby uzyskać lepszy wgląd w to, co się dzieje:
php bin/magento list
Cieszyć się.
źródło
Ważną częścią jest
\Magento\Framework\App\Bootstrap::create
ale ponieważ
Bootstrap::init()
metoda jest prywatna i zdarza się wiele ważnych rzeczy, potrzebne są publiczne metody nazywające ją.Z jednej strony jest
createApplication()
torun()
metoda podążająca za nią , ale także metodagetDirList()
igetObjectManager()
, które nie wymagają argumentów.Więc aplikacja nie jest potrzebna, wady są takie, że moduł obsługi błędów nie został zainicjowany.
źródło
Być może nie na temat, ale zawsze używam pliku kontrolnego indeksu Kontakty w Magento 1 do testowania rzeczy (metoda IndexAction). To tak proste, jak wejście na example.com/contacts. Musisz tylko upewnić się, że nie wprowadzisz tych zmian;)
Jestem pewien, że możesz zrobić coś podobnego w Magento 2. Nie musisz tworzyć nowego pliku z kodem bootstrap.
źródło
Ta odpowiedź jest niewielką modyfikacją powyższej odpowiedzi Mariusza
Ponieważ w Magento 2.1 dostał błąd jak
Area code not set
przy użyciu tego kodu.So the intension of this answer is to fix that error on Magento 2.1
Aby naprawić ten błąd, musisz zdefiniować obszar w swoim
test.php file
. (patrz zmodyfikowany plik poniżej).I
TestApp.php
złoży pozostaje taka sama.źródło
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Możesz skierować skrypt na root Magento z dodaniem poniższego kodu, a bootstrap zostanie dołączony .. [Utwórz test.php na folderze głównym Magento i dołącz poniższy kod]
Mam nadzieję, że to będzie pomocne.
źródło
Możesz uruchomić bezpośredni skrypt z katalogu głównego Magento 2, używając poniższego kodu. Utwórz nowy plik w katalogu głównym Magento 2 i dodaj ten kod, a następnie dodaj skrypt do pliku.
źródło
Oto, co zrobiłem, aby zainicjować Magento w moim skrypcie niestandardowym poza katalogiem magento.
Jest to zalecany sposób według dokumentów Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
źródło