Magento 2不可能跟踪管理网格错误:致命错误:方法Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString()不得引发异常


9

由于高度依赖XML文件,因此在创建自定义管理网格时,很难弄清此错误的原因:

致命错误:方法Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString()不得在C:\ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php中引发异常0

我正在尝试为sales_shipment_item表格创建一个管理网格。

到目前为止,我有:

  1. 使用了xdebug并将其放在__toString()Result类的方法中,它没有显示真正的错误是什么

  2. 我已经var_dump-ed __toString()方法中的变量

  3. 我在Magento 2中启用了开发人员模式

  4. 我已经检查了var/logs,它没有任何帮助

我已经成功地制作了其他管理员自定义网格,但是试图找出实际错误就像大海捞针一样。有没有人找到调试这些的更好的方法?我查看了所有的Grid xml di.xml,和模型,一切看起来都还可以。


在中进行较大的try / catch块Magento\Ui\TemplateEngine\Xhtml\Result::__toString(),捕获异常并将其记录或打印。无论如何,这是M2应该做的。
nevvermind

是的,这就是Result.php:中已经存在的内容} catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); },错误是我已经发布的内容。当我遇到这些错误之前,通常这与丢失di.xml注入有关,但是如果不作猜测就无法调试这些错误,这就是为什么我发布了这个问题。
凯文·查韦斯

@KevinJavitz,您解决了这个问题吗?我有同样的问题。
MGento

Answers:


4

您收到的错误确实在中触发vendor\magento\module-ui\Component\Wrapper\UiComponent.php

但是,它不是在第0行触发的,而是在return语句中的以下方法中将结果转换为字符串时触发的:

protected function _toHtml()
{
    foreach ($this->getChildNames() as $childName) {
        $childBlock = $this->getLayout()->getBlock($childName);
        if ($childBlock) {
            $wrapper = $this->blockWrapperFactory->create([
                'block' => $childBlock,
                'data' => [
                    'name' => 'block_' . $childName
                ]
            ]);
            $this->component->addComponent('block_' . $childName, $wrapper);
        }
    }

    $result = $this->component->render();
    return (string)$result;
}

这是您可以尝试调试问题的方法:

  • $result在调用字符串转换和return语句之前检查包含的内容
  • 通过调用获取有关引起问题的组件的信息$component->getName()$component->getComponentName()$component->getData()帮助您找出问题所在。

2

当我添加自定义列表/网格时,我也发生了此致命错误。我通过更改构造函数并为数据提供程序构造函数中的数据列表/网格初始化正确的集合来解决此问题。自定义网格DataProvider.php的示例

use Acme\CustomModule\Model\ResourceModel\Entity\Listing\CollectionFactory;

class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        CollectionFactory $collectionFactory,
        array $meta = [],
        array $data = []
    ) {
        parent::__construct($name, $primaryFieldName, $requestFieldName, 
        $meta, $data);
        $this->collection = $collectionFactory->create();
    }

    public function getData(): array
    {
        $collection = $this->getCollection();
        return $collection->toArray();
    }
}

但是您需要创建\ Acme \ CustomModule \ Model \ ResourceModel \ Entity \ Listing \ Collection才能在数据提供程序中获取它的数据


1

如果您已将M1迁移到M2,则在执行cmd的过程中遇到了一些错误 。找不到所请求的存储。验证商店,然后重试。

请不要更改供应商 模块存储 文件

  • /vendor/magento/module-store/Model/StoreManager.php或

    /vendor/magento/module-store/Model/StoreRepository.php

只需简单地执行以下步骤:

Magento 1.9.3.8迁移到2.3.0后,我最近遇到了同样的情况,希望我的回答对您有所帮助。问题来自确切地删除多个存储96。我在这里尝试了所有其他答案,但仍然遇到相同的错误。

对我来说,解决方法是从“ core_config_data”内部删除旧的存储数据。问题是,当Magento加载运行时配置数据时,它会找到旧存储并尝试解决它们。从数据库中清除数据之前,我强烈建议您运行以下SELECT查询,以确保删除正确的存储。

SELECT * FROM core_config_data WHERE作用域='商店';

警告:在运行此数据库之前,请务必备份您的数据库!

从core_config_data删除WHERE scope_id!= 1 AND scope ='stores';

现在执行所有magento命令,您可以看到查询已修复“找不到请求的商店。请验证商店并重试”

致命错误:方法Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString()不得在C:\ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php中引发异常0

现在检查上面致命错误的管理员也解决了等等...等等...

(注意:-存储模块上的致命错误error_Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString()依赖,因此请勿更改/ vendor / module-store,否则管理方网格/列表目录将无法看到正确的数据)


0

经过无数小时和大量的脑袋撞到桌子上之后,我发现我收到了这个错误,因为我正在使用xdebug(太神奇了!)在低级功能上进行断点,即Magento\Ui\TemplateEngine\Xhtml\Result::__toString()为了进行测试。

显然,以某种方式,调试器的输出实际上引发了一个错误,导致__toString方法对我大吼大叫。

我疯了,因为该错误仅在打开调试器时才会显示,并认为这可能与填充UI列表中的AJAX调用有关。关闭它似乎可以使其正常工作,因此值得一试。我不太确定xdebug(特别是在IntelliJ产品中……可能)的断点功能如何工作,除了您能够用line调用断点之外xdebug_break()。无论如何,在__toString方法中具有断点很可能是一件愚蠢的事情。

猜猜我们还不能动态调试所有内容……有一天!

我真的希望这对其他人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.