В magento 1 я мог создать файл, в котором мне нужно было только создать экземпляр Mage_Core_Model_App
класса, а затем я мог бы добавить свой «грязный» код для целей тестирования.
Как то так 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.
Тогда я смог позвонить test.php
в браузер и посмотреть, что я делаю.
Как я могу сделать то же самое для Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Должен ли я создать свою собственную модель приложения?Ответы:
Основываясь на ответе @ Flyingmana, я немного покопался и нашел решение. Это похоже на работу для меня.
Сначала моё решение, потом несколько объяснений.
Я создал файл с именем
test.php
в корне моего экземпляра magento.Затем я создал файл, который называется
TestApp.php
там же с этим контентом.Теперь я могу просто позвонить
test.php
в браузер и все, что помещено в TestApp :: launch (), будет выполнено.Теперь, почему это работает:
метод
createApplication
из класса начальной загрузки является наиболее важной частью. Создает экземпляр класса приложения. МетодcreateApplication
ожидает реализации,\Magento\Framework\AppInterface
которая содержит 2 метода.Поэтому я создал свой собственный класс,
TestApp
который реализует этот интерфейс. Я всегдаcatchException
возвращал метод,false
потому что не хочу, чтобы мое приложение обрабатывало исключения. Если что-то не так, просто распечатайте это на экране.Затем я реализовал метод
launch
. этот называется\Magento\Framework\App\Bootstrap::run
. Этотrun
метод делает почти то же самое, независимо от того, какое приложение передается в качестве параметра.Единственное, что зависит от приложения, это строка:
Это означает, что вызов
\Magento\Framework\App\Bootstrap::run
вызовет среду en Magento (может быть, сделаю что-то еще сумасшедшее ... я еще не все проверил), а затем вызоветlaunch
метод из приложения.Вот почему вы должны поместить весь свой грязный код в этот метод.
Затем
\Magento\Framework\App\Bootstrap::run
вызовы$response->sendResponse();
where$response
- это то, чтоlaunch
возвращает метод.Вот почему
return $this->_response;
это необходимо. Он просто возвращает пустой ответ.Я сделал свой класс приложения расширенным,
\Magento\Framework\App\Http
чтобы у меня уже были параметры запроса и ответа (и другие), но вы не можете заставить свой класс ничего не расширять. Затем вам нужно скопировать конструктор из\Magento\Framework\App\Http
класса. Возможно, добавьте больше параметров в конструктор, если вам это нужно.источник
TestApp
класс мог быть определен в том жеtest.php
файле, но я не хочу делать его таким грязным :)parent::launch();
в качестве первой строкиlaunch()
метода, так как он выдавал ошибку «Код города не установлен»Для быстрых / коротких / грязных тестов я использовал что-то вроде этого:
источник
Основываясь на ответе @ Marius, я придумал это.
Он работает как через командную строку, так и через браузер, что я считаю полезным.
Вот пример сценария для программного удаления категории.
scripts/abstract.php
scripts/delete-category.php
Тогда я просто запускаю это как
php scripts/delete-category.php
источник
Magento\Framework\Exception\LocalizedException: Area code is not set
. Как я могу установить это? Мне нужен приятель.Как и просил очень короткий пример того, как вы могли бы написать тест (не помещая его в структуру расширений вашей папки). Увы, это все командная строка, а не для потребления через браузер.
Создать файл
dev/tests/unit/quicktest.php
с участием
затем из каталога
dev/tests/unit/
запустить,phpunit quicktest.php
который будет выполнять ваш код. Это все работает, так как файлdev/tests/unit/phpunit.xml.dist
автоматически загружается и подготавливает среду.Во многих случаях вам может потребоваться ввести данные в конструктор классов. Пожалуйста, ознакомьтесь с существующими тестами в разделе
dev/tests/unit/testsuite/
дальнейшие примеры того, как это может выглядеть, включая насмешливые объекты.источник
Вот лучший способ, чем подключиться к тестовой системе: использовать интерфейс командной строки Magento 2.
Это означает, что вам придется интегрировать свой код песочницы в реальный модуль (или создать его для этой цели), но вы все равно должны это делать.
После того, как вы настроили свой модуль , добавить команду довольно просто. Все, что вам нужно, это класс и DI, чтобы зарегистрировать его.
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Пример, полученный из https://github.com/magento/magento2-samples/tree/master/sample-module-command - см. Там полный модуль, включающий эту функцию. Есть и менее тривиальные примеры .
По соглашению, ваш командный класс всегда должен быть
{module}/Console/Command
и заканчиваться наCommand.php
.После того, как вы добавили эти два бита кода (и промытой кэш Magento и т.д.), выполнить вашу команду по имени в SSH:
php bin/magento example:greeting
.Вы можете использовать внедрение зависимостей в этом контексте, поэтому вы можете запускать любой код, который захотите
execute()
.Этот интерфейс построен на компоненте консоли Symfony , поэтому у вас также есть полный доступ ко всему широкому спектру функций, включая параметры / аргументы , таблицы и очень простые индикаторы выполнения .
Если вы сталкиваетесь с какими-либо проблемами при настройке вашей команды или опций, вы обычно можете запустить команду list, чтобы лучше понять, что происходит:
php bin/magento list
Наслаждаться.
источник
Важной частью является
\Magento\Framework\App\Bootstrap::create
но так как
Bootstrap::init()
метод является частным, и там происходит много важных вещей, необходимы публичные методы, вызывающие его.То с одной стороны,
createApplication()
и следуяrun()
способу, но такжеgetDirList()
иgetObjectManager()
способ, в котором оба не нужно никаких аргументов.Таким образом, приложение не нужно, минусы в том, что обработчик ошибок не инициализирован.
источник
Возможно, не по теме, но я всегда использую файл контроллера индекса контактов в Magento 1 для тестирования (метод IndexAction). Это так же просто, как перейти на example.com/contacts. Вы просто должны убедиться, что эти изменения не зафиксированы;)
Я уверен, что вы можете сделать что-то подобное в Magento 2. Избавляет вас от необходимости создавать новый файл с кодом начальной загрузки.
источник
Этот ответ является небольшой модификацией ответа Мариуса выше
Потому что в Magento 2.1 появилась ошибка как
Area code not set
при использовании этого кода.So the intension of this answer is to fix that error on Magento 2.1
Что вы должны сделать, чтобы исправить эту ошибку, это определить область в вашем
test.php file
. (см. измененный файл ниже).И
TestApp.php
файл останется прежним.источник
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Вы можете направить скрипт в корневой каталог magento, добавив нижеприведенный код, и загрузчик будет включен. [Создайте test.php в корневой папке magento и включите код ниже]
Надеюсь, это будет полезно.
источник
Вы можете запустить прямой скрипт из корня Magento 2, используя приведенный ниже код. Создайте новый файл в корневой директории Magento 2 и добавьте этот код, а затем добавьте свой скрипт в файл.
источник
Вот что я сделал, чтобы инициализировать Magento в свой собственный скрипт за пределами каталога magento.
Это рекомендуемый способ в соответствии с документами Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
источник