如何在 Codeigniter 4 中使用 renderSection?

How to use renderSection in Codeigniter 4?

view layouts 的 Codeigniter 4 官方文档中,有一个函数 renderSection 可以在您的模板中使用。

但主要问题是我无法弄清楚它是如何工作的。请记住,我不想解决这个问题,我真的需要知道 renderSection 是如何工作的以及我缺少什么。

更准确地说:

在我的 Controller 我有这个代码:

// TestController.php
...
// My method
...

$view = \Config\Services::renderer();

$view->setVar('output', $output);

return $view->render('my-main-view');
...

我的观点是这样的:

// my-main-view.php
...
<div class="main-container">
    <main>
        <?php echo $output; ?>
    </main>
    <?php echo $this->renderSection('sidebar'); ?>
</div>
...

所以我的问题是:

我能以某种方式从我的控制器添加我想要的 'sidebar' 数据吗?我想专门使用 renderSection 来了解它是如何工作的。

请不要为此添加解决方法。我知道我可以拥有:

$view->setVar('sidebar', view('my-view'));

然后在我的模板中:

echo $sidebar;

我问这个问题的主要原因是我们通常会找到解决方法,而我们忽略了如何实际使用 renderSection

有没有:

$view->setRenderSection('sidebar', 'my-view', ['data' => $data]);

我可以用吗?我在这里遗漏了什么吗?

在花了一些时间了解该部分的工作原理后,我终于找到了渲染部分的解决方案。

解决方案不是很明显的想法。似乎没有 setRenderSection 所以我确实为我的控制器创建了自己的。更具体地说,我们有之前的例子:

$view = \Config\Services::renderer();

$view->setVar('output', $output);

return $view->render('my-main-view');

所以我在控制器中添加了一个名为 _setRenderSection 的函数:

private function _setRenderSection($viewRenderer, $sectionName , $viewName, $data = []) {
    $viewRenderer->section($sectionName);
    echo view($viewName, $data);
    $viewRenderer->endSection($sectionName);
}

所以我的最终方法将如下所示:

$view = \Config\Services::renderer();

$view->setVar('output', $output);

$this->_setRenderSection($view, 'sidebar' ,'my-view', ['data' => '123']);

return $view->render('my-main-view');

我还复制了完整的 Controller,以防您想复制粘贴它:

<?php namespace App\Controllers;

class Webpages extends BaseController
{

    private function _setRenderSection($viewRenderer, $sectionName , $viewName, $data = []) {
        $viewRenderer->section($sectionName);
        echo view($viewName, $data);
        $viewRenderer->endSection($sectionName);
    }

    public function about()
    {
        $view = \Config\Services::renderer();

        $view->setVar('output', 'Hello World!');

        $this->_setRenderSection($view, 'sidebar' ,'my-view', ['data' => '123']);

        return $view->render('my-main-view');
    }
}