如何在Magento 2中调试布局文件处理?


14

根据有关布局文件处理的magento 2主题规范:

Magento应用程序按以下顺序处理布局文件:

1 /从模块收集所有布局文件。该顺序由来自app / etc / config.php的模块列表中的模块顺序确定。

2. /确定继承主题[,...,]的顺序

3. /从上一个祖先到当前迭代一个主题序列:

一种。将所有扩展主题布局文件添加到列表中。

b。替换列表中被覆盖的布局文件。

4. /合并列表中的所有布局文件。

如何为该过程的每个步骤调试和查看布局文件?


您的意思是在哪里放置断点?还是您会期望什么?
BuskaMuza

嗨,谢谢你。我的主要目的是打印“合并所有布局文件”,以查看magento 2布局如何呈现。我添加了我的答案如下。
thienphucvx

@ thienphucvx,我使用了您的代码,但无法在var / log上创建.xml。我需要改变什么吗?
学习者

您能否尝试调试以确保已正确创建该模块,例如“ var_dump观察者的执行方法上的某些内容”,以检查其是否正常工作?
thienphucvx

1
看看这个开发者应用程序,它可能会在调试过程中为您提供帮助:github.com/magespecialist/mage-chrome-toolbar
Phoenix128_RiccardoT

Answers:


16

最后,我可以打印所有已加载的xml布局,并知道magento 2布局的工作方式。它还有助于我们检查是否已加载自定义模块布局。这个想法是:

  • 我们侦听事件“ layout_generate_blocks_after ”,并从该点获取所有已加载的树。

  • 将所有已加载的树保存到xml文件。

1 /我们创建一个新目录Sample/Dev。创建Sample/Dev/registration.php以使用Magento 2声明我们的模块目录。

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Sample_Dev',
    __DIR__
);

2 /创建Sample/Dev/etc/module.xml:让Magento 2知道我们模块的安装版本

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="module.xsd">
    <module name="Sample_Dev" setup_version="1.0.0" schema_version="1.0.0" release_version="1.0.1">
    </module>
</config>

3 /创建Sample/Dev/etc/frontend/events.xml。在此文件中,我们将监听事件“ layout_generate_blocks_after”

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">

    <event name="layout_generate_blocks_after">
        <observer name="thienphucvx_layout_generate_blocks_after" instance="Sample\Dev\Model\Layout" />
    </event>

</config>

4 / Sample/Dev/Model/Layout.php使用以下内容创建

<?php

namespace Sample\Dev\Model;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class Layout  implements ObserverInterface
{
    protected $_logger;
    public function __construct ( \Psr\Log\LoggerInterface $logger
    ) {
        $this->_logger = $logger;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $xml = $observer->getEvent()->getLayout()->getXmlString();
        /*$this->_logger->debug($xml);*//*If you use it, check ouput string xml in var/debug.log*/
        $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/layout_block.xml');
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info($xml);
        return $this;
    }
}

5 /设置新模块。在您的主网站目录中。输入CMD命令行:

– php bin / magento模块:启用Sample_Dev

– php bin / magento设置:升级

6 /刷新要查看xml文件的页面(例如:主页)并在中检查您的句柄xml文件var/log/layout_block.xml


我刚遇到这个,真是太神奇了。您介意向Magento 2提交PR,以便每个人都可以使用此功能吗?甚至发布一个模块也将极大地帮助您。
mbalparda

嗨Mbalparda,我不知道该怎么做。你能帮我提交吗?
thienphucvx

是的,在Twitter上对您执行了ping操作。
mbalparda

1
投票的问题/请求在哪里?链接?
BernhardZürn18年
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.