W końcu znalazłem rozwiązanie tego problemu na forach społeczności Magento, które dostarczył @ dunagan5887 . Postanowiłem udostępnić go tutaj na magento.stackexchange.com, ponieważ wiele osób może skorzystać z dobrze opracowanego rozwiązania tego wyjątku.
Link do oryginalnego postu na forum społeczności: Szablon wiadomości e-mail z blokiem
Wygląda na to, że takie rozwiązanie cytowane przez @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.
Rozwiązanie składa się z tej prostej linii kodu:
$ this -> _ objectManager-> configure ($ this -> _ configLoader-> load ('adminhtml'));
Poniżej znajduje się klasa wiersza poleceń działającej wersji:
app / code / NameSpace / Module / Console / Command.php
<?php
namespace NameSpace\Module\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomCommandClass extends Command
{
public function __construct(
\Magento\Framework\App\State $state,
\Magento\Framework\ObjectManagerInterface $objectManager,
\Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader
) {
$state->setAreaCode('frontend'); //SET CURRENT AREA
$objectManager->configure($configLoader->load('frontend')); //SOLUTION
parent::__construct();
}
...
}
Wystarczy zmienić obszar z frontend
na admin
lub global
zgodnie z wymaganiami aplikacji.
[AKTUALIZACJA]
Obszar adminhtml
powodujący błędy wdrażania zawartości statycznej
Wydaje się, że z pewnych powodów ustawienie tego obszaru adminhtml
powoduje błędy podczas wdrażania zawartości statycznej.
Widzieliśmy następujące błędy:
Fatal error: Uncaught Exception: Warning: Error while sending QUERY packet. PID=22912 in ../magento/vendor/magento/zendframework1/library/Zend/Db/Statement/Pdo.php on line 228 in ../magento/vendor/magento/framework/App/ErrorHandler.php:61
Początkowo myślałem, że ten błąd będzie spowodowany niskim max_allowed_packet
ustawieniem MYSQL, ale ponieważ limit był już wystarczająco wysoki i podniesienie go nie rozwiązało problemu, postanowiłem kopać dalej. Po przejściu przez proces eliminacji w końcu odkryłem, że to była główna różnica między dwoma modułami używającymi podobnych funkcji poleceń, z których jeden z modułów powodował ten problem, gdy tylko został włączony.
Chociaż nie kopałem, aby znaleźć źródło tego problemu lub konfliktu, pomyślałem, że dobrym pomysłem byłoby podzielenie się swoimi odkryciami tutaj, ponieważ inni mogą uznać to za przydatne.
[AKTUALIZACJA - 2]
Właściwa metoda:
Po aktualizacji Magento do wersji 2.2.X zdaliśmy sobie sprawę, że jest to właściwa metoda ustawienia obszaru:
app / code / NameSpace / Module / Console / Command.php
<?php
namespace NameSpace\Module\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomCommandClass extends Command
{
public function __construct(
\Magento\Framework\App\State $state,
) {
$this->_appState = $appState;
parent::__construct();
}
...
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->_appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL); //SET CURRENT AREA
...
}
...
}
Zauważ, że nie korzystamy z Object Managera i że obszar musi być ustawiony w funkcji, która go wymaga, a NIE w konstruktorze. Jest to oficjalny sposób ustawiania obszaru i powinien działać bezbłędnie ze wszystkimi wersjami Magento 2.
Lista dostępnych obszarów jest dostępna w następującej klasie:
Magento \ Framework \ App \ Area
class Area implements \Magento\Framework\App\AreaInterface
{
const AREA_GLOBAL = 'global';
const AREA_FRONTEND = 'frontend';
const AREA_ADMIN = 'admin';
const AREA_ADMINHTML = 'adminhtml';
const AREA_DOC = 'doc';
const AREA_CRONTAB = 'crontab';
const AREA_WEBAPI_REST = 'webapi_rest';
const AREA_WEBAPI_SOAP = 'webapi_soap';
...
$objectManager->configure($configLoader->load('frontend'));
) w konstruktorze klasy! Jeśli to zrobisz i załadujesz konfigurację z innego obszaru niż bieżący, może to poważnie uszkodzić Magento 2!Magento\Developer\Model\TemplateEngine\Plugin\DebugHints
ponieważdebugHintsPath
zmienna nie jest ustawiona. Użycie oryginalnego kodu do załadowania obszaru DI obszaru ADMINHTML działa lub ręczne ustawieniedebugHintsPath
zmiennej działa, ale mogą istnieć inne uszkodzone części. W rzeczywistości jest to „błąd” w Magento, ponieważ nie można używać elementów warstwy widoku w CLI.Ponieważ CLI w Magento nie ma odpowiedniego obszaru, wymyśliłem następujące obejście:
źródło