En magento 1 pude crear un archivo donde solo necesitaba instanciar la Mage_Core_Model_App
clase y luego pude agregar mi código "sucio" para propósitos de prueba.
Algo como esto 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.
Luego pude llamar test.php
al navegador y ver qué estoy haciendo.
¿Cómo puedo hacer lo mismo para Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. ¿Debo crear mi propio modelo de aplicación?Respuestas:
Basado en la respuesta de @ Flyingmana, investigué un poco y encontré una solución. Parece que funciona para mí.
Primero mi solución, luego algunas explicaciones.
He creado un archivo llamado
test.php
en la raíz de mi instancia de magento.Luego creé un archivo llamado
TestApp.php
en el mismo lugar con este contenido.Ahora solo puedo llamar
test.php
al navegador y todo lo que se coloca en TestApp :: launch () se ejecutará.Ahora, por qué esto funciona:
el método
createApplication
de la clase bootstrap es la parte más importante. Crea una instancia de una clase de aplicación. El métodocreateApplication
espera una implementación del\Magento\Framework\AppInterface
que contiene 2 métodos.Así que creé mi propia clase en
TestApp
que implementa esa interfaz. Siempre hice que el métodocatchException
regresarafalse
porque no quiero que mi aplicación maneje excepciones. En caso de que algo esté mal, simplemente imprímalo en la pantalla.Luego implementé el método
launch
. Este es llamado por\Magento\Framework\App\Bootstrap::run
. Esterun
método hace casi lo mismo sin importar qué pase la aplicación como parámetro.Lo único que depende de la aplicación es esta línea:
Esto significa que la llamada
\Magento\Framework\App\Bootstrap::run
iniciará el entorno de Magento (tal vez haga algunas otras cosas locas ... aún no he verificado todo) y luego llama allaunch
método desde la aplicación.Es por eso que necesitas poner todo tu código sucio dentro de ese método.
Luego las
\Magento\Framework\App\Bootstrap::run
llamadas$response->sendResponse();
donde$response
es lolaunch
que devuelve el método.Por eso
return $this->_response;
es necesario. Simplemente devuelve una respuesta vacía.Hice que mi clase de aplicación se extendiera,
\Magento\Framework\App\Http
por lo que ya tendré parámetros de solicitud y respuesta (y otros), pero puede hacer que su clase no extienda nada. Entonces necesitas copiar el constructor de la\Magento\Framework\App\Http
clase. Tal vez agregue más parámetros en el constructor si lo necesita.fuente
TestApp
clase podría haberse definido en el mismotest.php
archivo, pero no quiero ensuciarla :)parent::launch();
como la primera línea delaunch()
método, ya que me estaba dando un error "Código de área no establecido"Para pruebas rápidas / cortas / sucias, usé algo como esto:
fuente
Basado en la respuesta de @ Marius se me ocurrió esto.
Funciona tanto a través de la línea de comandos como del navegador, lo que me parece útil.
Aquí hay una secuencia de comandos de muestra para eliminar la categoría mediante programación.
scripts/abstract.php
scripts/delete-category.php
Entonces lo corro como
php scripts/delete-category.php
fuente
Magento\Framework\Exception\LocalizedException: Area code is not set
. ¿Cómo puedo configurarlo? Necesito el amigoSegún lo solicitado, un ejemplo muy breve de cómo podría escribir una prueba (sin colocarla en la estructura de extensión de su carpeta). Por desgracia, esto es todo línea de comandos y no para el consumo a través de un navegador.
Crea el archivo
dev/tests/unit/quicktest.php
con
luego desde el directorio
dev/tests/unit/
ejecutadophpunit quicktest.php
que ejecutará su código. Todo esto funciona ya que el archivodev/tests/unit/phpunit.xml.dist
se carga automáticamente y prepara el entorno.En muchos casos, es posible que deba proporcionar información al constructor de las clases. Consulte las pruebas existentes
dev/tests/unit/testsuite/
a continuación para obtener más ejemplos de cómo podría verse esto, incluidos los objetos de burla.fuente
Aquí hay una mejor manera que conectarse al sistema de prueba: use la interfaz de línea de comandos de Magento 2.
Esto significa que tendrá que integrar su código de sandbox en un módulo real (o crear uno para el propósito), pero debería hacerlo de todos modos.
Una vez que haya configurado su módulo , agregar un comando es bastante fácil. Todo lo que necesita es la clase y DI para registrarla.
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Ejemplo derivado de https://github.com/magento/magento2-samples/tree/master/sample-module-command ; consulte allí un módulo completo que incorpora esta funcionalidad. Hay ejemplos menos triviales incluidos.
Por convención, su clase de comando siempre debe estar en
{module}/Console/Command
y terminar conCommand.php
.Una vez añadidos los dos trozos de código (y la memoria caché Magento enrojecida, etc.), ejecute el comando por su nombre en SSH:
php bin/magento example:greeting
.Puede usar la inyección de dependencia en este contexto, por lo que puede ejecutar cualquier código que desee dentro
execute()
.Esta interfaz se basa en el componente Consola de Symfony , por lo que también tiene acceso completo a toda esa amplia gama de funcionalidades, incluidas opciones / argumentos , tablas y barras de progreso muy fáciles .
Si tiene algún problema al configurar su comando u opciones, generalmente puede ejecutar el comando 'lista' para obtener una mejor visibilidad de lo que está mal:
php bin/magento list
Disfrutar.
fuente
La parte importante es la
\Magento\Framework\App\Bootstrap::create
pero como el
Bootstrap::init()
método es privado y ocurren muchas cosas importantes, se necesitan métodos públicos que lo llamen.Eso es, por un lado,
createApplication()
y seguir elrun()
método, pero también el métodogetDirList()
ygetObjectManager()
, que no necesitan argumento.Por lo tanto, no se necesita una aplicación, las desventajas son que el controlador de errores no se inicializa.
fuente
Posiblemente fuera de tema, pero siempre uso el archivo del controlador de índice de Contactos en Magento 1 para probar cosas (método IndexAction). Es tan simple como ir a example.com/contacts. Solo tiene que asegurarse de no cometer esos cambios;)
Estoy seguro de que puede hacer algo similar en Magento 2. Le ahorra tener que crear un nuevo archivo con el código de arranque.
fuente
Esta respuesta es una ligera modificación a la respuesta anterior de Marius
Porque en Magento 2.1 obtuve el error como
Area code not set
al usar ese código.So the intension of this answer is to fix that error on Magento 2.1
Lo que debe hacer para corregir este error es definir el área en su
test.php file
. (Ver el archivo modificado a continuación).Y el
TestApp.php
archivo seguirá siendo el mismo.fuente
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Puede dirigir el script en la raíz de magento agregando el siguiente código y se incluirá bootstrap ... [Cree test.php en la carpeta raíz de magento e incluya el código a continuación]
Esperamos que esto sea útil.
fuente
Puede ejecutar el script directo desde la raíz de Magento 2 usando el código a continuación. Cree un nuevo archivo en el directorio raíz de Magento 2 y agregue este código y luego agregue su script en el archivo.
fuente
Esto es lo que hice para inicializar Magento en mi script personalizado fuera del directorio de magento.
Esta es la forma recomendada según los documentos de Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
fuente