CodeIgniter 4在视图布局上从数据库填充菜单

问题描述

我是CodeIgniter的新手。我有一个视图布局,上面有导航菜单栏。我想用我保存在数据库中的类别填充下拉菜单

这是我的布局的摘要(View \ layouts \ frontend.PHP):

<nav class="navbar navbar-expand-md sticky-top">
    <div class="collapse navbar-collapse flex-column " id="navbar">
        <!-- Brand bar -->
        <a class="navbar-brand ml-3" href="#">
            <span class="">Test Site</span>
        </a>
        <!-- Internal links Menu navbar -->
        <ul class="navbar-nav justify-content-center w-100 px-3">
            <li class="nav-item">
                <a class="nav-link" href="#">Home</a>
            </li>
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    Categories
                </a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                    <a class="dropdown-item" href="#">News</a>
                    <a class="dropdown-item" href="#">Event</a>
                    <a class="dropdown-item" href="#">Announcement</a>
                </div>
            </li>
        </ul>
</nav>

现在,我了解到在扩展该布局的每个视图上,我都可以在控制器上进行查询并返回包含数据的视图。到目前为止,这是我已经完成的工作。

家庭控制器:

use App\Models\CategoryModel;

class Home extends BaseController
{
    public function index()
    {
        $categoryModel = new CategoryModel();
        $data['categories'] = $categoryModel->orderBy('id','ASC')->findAll();
        
        return view('frontend/home_page',$data);
    }
}

部分布局:

<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        Categories
    </a>
    <?PHP if ($categories) : ?>
        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
            <?PHP foreach ($categories as $category) : ?>
                <a class="dropdown-item" href="#"><?PHP echo $category['name'] ?></a>
            <?PHP endforeach; ?>
        </div>
    <?PHP endif; ?>
</li>

但是看起来我必须在所有控制器的函数上执行此操作,这些函数会渲染使用布局的视图(frontend.PHP)。 我想问的是,是否有可能只调用一个函数/类/某些东西,而只完成一次?在这种情况下,最佳做法是什么?

解决方法

如果

$categoryModel = new CategoryModel();
$data['categories'] = $categoryModel->orderBy('id','ASC')->findAll();

您计划在该Controller内调用多个方法,然后,是的,将代码推送到可重用的代码中将是最佳实践。

表面上您可以在几个不同的地方定义此功能,但是在这种情况下,私有控制器功能可能是最简单的(必须 私有才能阻止其服务通过网络请求):

private getCategories(){
  $categoryModel = new CategoryModel();
  $ret['categories'] = $categoryModel->orderBy('id','ASC')->findAll();
  return $ret;
}

同一控制器内的任何其他函数随后都可以通过调用来获取数据

$this->getCategories()