No magento 1, eu poderia criar um arquivo em que só precisava instanciar a Mage_Core_Model_App
classe e, em seguida, adicionar meu código "sujo" para fins de teste.
Algo assim 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.
Pude ligar test.php
no navegador e ver o que estou fazendo.
Como posso fazer o mesmo com o Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Devo criar meu próprio modelo de aplicativo?Respostas:
Com base na resposta da @ Flyingmana, eu pesquisei um pouco e achei uma solução. Parece trabalhar para mim.
Primeiro a minha solução, depois algumas explicações.
Eu criei um arquivo chamado
test.php
na raiz da minha instância do magento.Então eu criei um arquivo chamado
TestApp.php
no mesmo local com este conteúdo.Agora posso chamar
test.php
o navegador e tudo o que é colocado no TestApp :: launch () será executado.Agora, por que isso funciona:
o método
createApplication
da classe bootstrap é a parte mais importante. Ele cria uma instância de uma classe de aplicativo. O métodocreateApplication
espera uma implementação do\Magento\Framework\AppInterface
que contém 2 métodos.Então, eu criei minha própria classe em
TestApp
que implementa essa interface. Eu fiz o métodocatchException
retornarfalse
sempre porque não quero que meu aplicativo lide com exceções. Caso algo esteja errado, basta imprimi-lo na tela.Então eu implementei o método
launch
. este é chamado por\Magento\Framework\App\Bootstrap::run
. Esserun
método faz quase a mesma coisa, independentemente do que o aplicativo passou como parâmetro.A única coisa que depende da aplicação é esta linha:
Isso significa que a chamada
\Magento\Framework\App\Bootstrap::run
iniciará o ambiente do Magento (talvez faça outras coisas malucas ... Eu não verifiquei tudo ainda) e depois chame olaunch
método a partir do aplicativo.É por isso que você precisa colocar todo o seu código sujo dentro desse método.
Em seguida, as
\Magento\Framework\App\Bootstrap::run
chamadas$response->sendResponse();
onde$response
é o que olaunch
método retorna.É por isso que
return $this->_response;
é necessário. Apenas retorna uma resposta vazia.Eu fiz minha classe de aplicativo estender
\Magento\Framework\App\Http
para que eu já tenha parâmetros de solicitação e resposta (e outros), mas você pode fazer com que sua classe não estenda nada. Então você precisa copiar o construtor da\Magento\Framework\App\Http
classe. Talvez adicione mais parâmetros no construtor, se necessário.fonte
TestApp
classe poderia ter sido definido no mesmotest.php
arquivo, mas eu não quero fazê-lo que suja :)parent::launch();
como a primeira linha delaunch()
método como ele estava me dando um "código de área não definida" erroPara testes rápidos / curtos / sujos, usei algo como isto:
fonte
Com base na resposta de @ Marius, eu vim com isso.
Funciona tanto pela linha de comando quanto pelo navegador, o que acho útil.
Aqui está um exemplo de script para excluir programaticamente a categoria.
scripts/abstract.php
scripts/delete-category.php
Então eu apenas corro como
php scripts/delete-category.php
fonte
Magento\Framework\Exception\LocalizedException: Area code is not set
. Como posso configurá-lo? Eu preciso do amigo.Conforme solicitado, um exemplo muito curto de como você pode escrever um teste (sem colocá-lo na estrutura de extensão de pastas). Infelizmente, tudo isso é linha de comando e não para consumo através de um navegador.
Crie o arquivo
dev/tests/unit/quicktest.php
com
depois, a partir do diretório
dev/tests/unit/
executado,phpunit quicktest.php
que executará seu código. Isso tudo funciona, pois o arquivodev/tests/unit/phpunit.xml.dist
é carregado automaticamente e prepara o ambiente.Em muitos casos, você pode precisar fornecer informações ao construtor das classes. Consulte os testes existentes abaixo
dev/tests/unit/testsuite/
para obter mais exemplos de como isso pode parecer, incluindo objetos de simulação.fonte
Aqui está uma maneira melhor do que se conectar ao sistema de teste: Use a interface de linha de comando do Magento 2.
Isso significa que você terá que integrar seu código de sandbox em um módulo real (ou criar um para o efeito), mas você deve fazer isso de qualquer maneira.
Depois de configurar seu módulo , adicionar um comando é bem fácil. Tudo que você precisa é da classe e do DI para registrá-la.
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Exemplo derivado de https://github.com/magento/magento2-samples/tree/master/sample-module-command - veja aqui um módulo completo que incorpora essa funcionalidade. Existem exemplos menos triviais incluídos.
Por convenção, sua classe de comando deve sempre estar dentro
{module}/Console/Command
e terminar comCommand.php
.Depois de adicionar esses dois pedaços de código (e cache do Magento corado, etc.), execute o seu comando pelo nome em SSH:
php bin/magento example:greeting
.Você pode usar a injeção de dependência nesse contexto, para executar qualquer código que desejar
execute()
.Essa interface é construída no componente Console do Symfony , para que você também tenha acesso total a toda essa ampla gama de funcionalidades, incluindo opções / argumentos , tabelas e barras de progresso muito fáceis .
Se você tiver algum problema ao configurar seu comando ou opções, geralmente poderá executar o comando 'list' para obter melhor visibilidade do que está errado:
php bin/magento list
Desfrutar.
fonte
A parte importante é a
\Magento\Framework\App\Bootstrap::create
mas como o
Bootstrap::init()
método é privado, e acontece muitas coisas importantes, são necessários métodos públicos que o chamam.Isso, por um lado,
createApplication()
e seguindo orun()
método, mas também o métodogetDirList()
egetObjectManager()
, que ambos não precisam de argumento.Portanto, um Aplicativo não é necessário, as desvantagens são que o Manipulador de erros não é inicializado.
fonte
Possivelmente fora de tópico, mas eu sempre uso o arquivo do controlador de índice de contatos no Magento 1 para testar as coisas (método IndexAction). É tão simples quanto ir para example.com/contacts. Você só precisa se certificar de não confirmar essas alterações;)
Tenho certeza que você pode fazer algo semelhante no Magento 2. Poupa você de ter que criar um novo arquivo com o código de inicialização.
fonte
Esta resposta é uma pequena modificação na resposta acima por Marius
Porque no Magento 2.1 obtive o erro como
Area code not set
ao usar esse código.So the intension of this answer is to fix that error on Magento 2.1
O que você precisa fazer para corrigir esse erro é definir a área em seu
test.php file
. (veja o arquivo modificado abaixo).E o
TestApp.php
arquivo permanecerá o mesmo.fonte
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Você pode direcionar o script na raiz do magento adicionando o código abaixo e a inicialização será incluída. [Crie o test.php na pasta raiz do magento e inclua o código abaixo]
Espero que isso seja útil.
fonte
Você pode executar o script direto da raiz do Magento 2 usando o código abaixo. Crie um novo arquivo no diretório raiz do Magento 2 e adicione esse código e depois adicione seu script no arquivo.
fonte
Aqui está o que eu fiz para trazer o Magento para inicializar no meu script personalizado fora do diretório magento.
Esta é a maneira recomendada, de acordo com os documentos do Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
fonte