ฉันพยายามค้นหาวิธีที่ดีที่สุดในการแสดง HTML ผ่าน AJAX ใน Magento 2
วิธีที่ 1: การใช้ตัวควบคุมโดยไม่มีเค้าโครง
ไฟล์ Foo/Bar/Controller/Popin/Content.php
<?php
namespace Foo\Bar\Controller\Popin;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
/**
 * Class Content
 */
class Content extends Action
{
    /**
     * Content constructor.
     *
     * @param Context $context
     */
    public function __construct(
        Context $context
    ) {
        parent::__construct($context);
    }
    /**
     *
     */
    public function execute()
    {
        /** @var \Magento\Framework\View\Layout $layout */
        $layout = $this->_view->getLayout();
        /** @var \Foo\Bar\Block\Popin\Content $block */
        $block = $layout->createBlock(\Foo\Bar\Block\Popin\Content::class);
        $block->setTemplate('Foo_Bar::popin/content.phtml');
        $this->getResponse()->setBody($block->toHtml());
    }
}   
วิธีที่ 2: การใช้ตัวควบคุมด้วยเค้าโครงที่กำหนดเอง
ไฟล์ Foo/Bar/Controller/Popin/Content.php
<?php
namespace Foo\Bar\Controller\Popin;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
/**
 * Class Content
 */
class Content extends Action
{
    /**
     * Content constructor.
     *
     * @param Context $context
     */
    public function __construct(
        Context $context
    ) {
        parent::__construct($context);
    }
    /**
     *
     */
    public function execute()
    {
        $this->_view->loadLayout();
        $this->_view->renderLayout();
    }
}    
ไฟล์ Foo/Bar/view/frontend/page_layout/ajax-empty.xml
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
    <container name="root"/>
</layout>
ไฟล์ Foo/Bar/view/frontend/layout/foo_bar_popin_content.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="ajax-empty" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="root">
            <block class="Foo\Bar\Block\Popin\Content" name="foo_bar_popin_content" template="Foo_Bar::popin/content.phtml" cacheable="false"/>
        </referenceContainer>
    </body>
</page>
IMO แนวปฏิบัติที่ดีที่สุดดูเหมือนจะเป็นวิธีที่ 2เพราะแยกตรรกะออกจากคอนโทรลเลอร์ 
แต่ปัญหาเกี่ยวกับวิธีที่ 2คือ<body>และ<head>ด้วยCSS/ JSถูกสร้างขึ้นดังนั้นจึงไม่ใช่ HTML ที่ได้รับการทำความสะอาดเต็มรูปแบบที่มีเฉพาะเทมเพลตบล็อกของฉันเท่านั้น
- ฉันใช้รูปแบบที่กำหนดเองในทางที่ผิด?
 - เป็นวิธีที่ 1ถือเป็นแนวปฏิบัติที่ดี?
 - มีวิธีอื่นที่จะทำเช่นนั้น?
 
