Magento – Magento 2 Impossible To Trace Admin Grid Error: Fatal error: Method Magento\Ui\TemplateEngine\Xhtml\Result::__toString() must not throw an exception

admingridmagento2

Because of the high reliance of XML files, I am having a very hard time figuring out the cause of this error when creating a custom admin grid:

Fatal error: Method
Magento\Ui\TemplateEngine\Xhtml\Result::__toString() must not throw an
exception in
C:\wamp64\www\mage2\vendor\magento\module-ui\Component\Wrapper\UiComponent.php
on line 0

I am trying to make an admin grid for the sales_shipment_item table.

So far I have:

  1. Used xdebug and put it within the __toString() method of the Result class, it does not show what the real error is

  2. I have var_dump-ed the variables within the __toString() method

  3. I have developer mode turned on in Magento 2

  4. I have checked the var/logs and it shows nothing helpful

I have successfully made other admin custom grids, but trying to figure out the actual error is like a needle in a haystack. Has anyone found a better way of debugging these? I have looked over all the grid xml, di.xml, and models and all looks ok.

Best Answer

The error you're getting is indeed triggered in vendor\magento\module-ui\Component\Wrapper\UiComponent.php.

However, it is not triggered at line 0 but when the result is being converted to a string in the following method in the return statement:

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;
}

Here's what you can try to debug your problem:

  • check what $result contains before the string conversion and return statement is called
  • get informations about the component that is causing an issue by calling $component->getName(), $component->getComponentName() and $component->getData() to help you finding out what the problem is
Related Topic