视图

视图只是一个网页,或一个页面片段,比如页眉、页脚、侧边栏等。事实上,如果需要这种层次结构,视图可以灵活地嵌入到其他视图中(在其他视图中,等等)。

视图永远不会被直接调用,它们必须由控制器或 视图路由 加载。

请记住,在 MVC 框架中,控制器充当交通警察,因此它负责获取特定的视图。如果您还没有阅读 控制器 页面,您应该在继续之前阅读。

使用您在控制器页面中创建的示例控制器,让我们向其中添加一个视图。

创建视图

使用您的文本编辑器,创建一个名为 blog_view.php 的文件,并将以下内容放入其中

<html>
    <head>
        <title>My Blog</title>
    </head>
    <body>
        <h1>Welcome to my Blog!</h1>
    </body>
</html>

然后将文件保存到您的 app/Views 目录中。

显示视图

要加载和显示特定的视图文件,您将在控制器中使用以下代码

return view('name');

其中 name 是您的视图文件的名称。

重要

如果省略文件扩展名,则视图应以 **.php** 扩展名结尾。

现在,在 **app/Controllers** 目录中创建一个名为 **Blog.php** 的文件,并将以下内容放入其中

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        return view('blog_view');
    }
}

打开位于 **app/Config/Routes.php** 的路由文件,并查找“路由定义”。添加以下代码

use App\Controllers\Blog;

$routes->get('blog', [Blog::class, 'index']);

如果您访问您的网站,您应该会看到您的新视图。URL 类似于以下内容

example.com/index.php/blog/

加载多个视图

CodeIgniter 将智能地处理控制器中对 view() 的多次调用。如果发生多次调用,它们将被附加在一起。例如,您可能希望有一个标题视图、一个菜单视图、一个内容视图和一个页脚视图。这可能看起来像这样

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class Page extends Controller
{
    public function index()
    {
        $data = [
            'page_title' => 'Your title',
        ];

        return view('header')
            . view('menu')
            . view('content', $data)
            . view('footer');
    }
}

在上面的示例中,我们使用的是“动态添加的数据”,您将在下面看到。

将视图存储在子目录中

如果您希望进行这种类型的组织,您的视图文件也可以存储在子目录中。这样做时,您需要包含加载视图的目录名称。示例

return view('directory_name/file_name');

命名空间视图

您可以在一个名为 **View** 的目录下存储视图,该目录具有命名空间,并像命名空间一样加载该视图。虽然 PHP 不支持从命名空间加载非类文件,但 CodeIgniter 提供了此功能,以便能够以模块化方式将您的视图打包在一起,以便于重复使用或分发。

如果您有一个 **example/blog** 目录,该目录在 自动加载器 下具有 PSR-4 映射设置,位于命名空间 Example\Blog 下,您可以像命名空间一样检索视图文件。

按照此示例,您可以通过在视图名称前添加命名空间来加载 **example/blog/Views** 中的 **blog_view.php** 文件

<?php

return view('Example\Blog\Views\blog_view');

缓存视图

您可以通过在第三个参数中传递一个 cache 选项,以及要缓存视图的秒数,使用 view() 函数缓存视图

// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60]);

默认情况下,视图将使用与视图文件本身相同的名称进行缓存。您可以通过传递 cache_name 和您想要使用的缓存 ID 来自定义它。

// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);

向视图添加动态数据

数据通过 view() 函数的第二个参数中的数组从控制器传递到视图。以下是一个示例

$data = [
    'title'   => 'My title',
    'heading' => 'My Heading',
    'message' => 'My Message',
];

return view('blog_view', $data);

让我们尝试使用您的控制器文件。打开它并添加以下代码

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        $data['title']   = 'My Real Title';
        $data['heading'] = 'My Real Heading';

        return view('blog_view', $data);
    }
}

现在打开您的视图文件,并将文本更改为与数据中数组键相对应的变量

<html>
    <head>
        <title><?= esc($title) ?></title>
    </head>
    <body>
        <h1><?= esc($heading) ?></h1>
    </body>
</html>

然后加载您一直在使用的 URL 上的页面,您应该会看到变量被替换。

saveData 选项

传递进来的数据将保留在后续对 view() 的调用中。如果您在一个请求中多次调用该函数,则无需将所需数据传递给每个 view()

但这可能无法阻止任何数据“泄漏”到其他视图中,从而可能导致问题。如果您希望在一次调用后清除数据,可以将 saveData 选项传递到第三个参数中的 $option 数组中。

$data = [
    'title'   => 'My title',
    'heading' => 'My Heading',
    'message' => 'My Message',
];

return view('blog_view', $data, ['saveData' => false]);

此外,如果您希望 view() 函数的默认功能是在调用之间清除数据,您可以在 app/Config/Views.php 中将 $saveData 设置为 false

创建循环

传递给视图文件的数据数组不限于简单变量。您可以传递多维数组,这些数组可以循环生成多行。例如,如果您从数据库中提取数据,它通常会以多维数组的形式出现。

以下是一个简单的示例。将其添加到您的控制器中

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        $data = [
            'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
            'title'     => 'My Real Title',
            'heading'   => 'My Real Heading',
        ];

        return view('blog_view', $data);
    }
}

现在打开您的视图文件并创建一个循环

<html>
<head>
    <title><?= esc($title) ?></title>
</head>
<body>
    <h1><?= esc($heading) ?></h1>

    <h2>My Todo List</h2>

    <ul>
    <?php foreach ($todo_list as $item): ?>

        <li><?= esc($item) ?></li>

    <?php endforeach ?>
    </ul>

</body>
</html>