Slim 跟传统的MVC框架不一样,并没有视图层.在Slim中,视图是一个HTTP响应.任何一个Slim应用的路由都是负责准备或者返回一个PSR 7的响应对象.

切记:Slim 的视图是一个HTTP 响应

话虽如此,但是Slim项目提供了 Twig-ViewPHP-View 组件帮助你实现在PSR 7响应里面实现模板的渲染.


slim/twig-view 组件

Twig-View 组件帮助你在Slim应用里面使用 Twig 模板引擎实现模板渲染.这个组件可以在 Packagist 上找到,使用 Composer安装也是非常方便的:

composer require slim/twig-view

然后你只需要以服务的形式把组件注入Slim 应用的容器里面就可以使用了:

<?php
// Create app
$app = new \Slim\App();

// Get container
$container = $app->getContainer();

// Register component on container
$container['view'] = function ($container) {
		$view = new \Slim\Views\Twig('path/to/templates', [
				'cache' => 'path/to/cache'
		]);
		$view->addExtension(new \Slim\Views\TwigExtension(
				$container['router'],
				$container['request']->getUri()
		));

		return $view;
};

注意:cache 可以设置为false禁用它,在不同的开发环境中使用,查看下选项 auto_reload是非常有用的.更多详细信息可以查看官方文档Twig environment options

现在你可以在你的Slim应用路由中使用 slim/twig-view 组件服务去渲染模板,写入到PSR 7响应对象了:

// Render Twig template in route
$app->get('/hello/{name}', function ($request, $response, $args) {
		return $this->view->render($response, 'profile.html', [
				'name' => $args['name']
		]);
})->setName('profile');

// Run app
$app->run();

在这个例子中, $this->view 会调用路由里面的回调,返回一个指向 \Slim\Views\Twig 实例的 view 容器服务. \Slim\Views\Twig 实现了 render() 方法接收 PSR 7响应对象作为第一个参数, Twig 模板的路径作为第二个参数,模板的数组变量作为最后一个参数. render() 方法返回一个新的 PSR 7 响应对象,响应的正文是渲染的 Twig 模板

path_for() 方法

slim/twig-view 组件有一个自定义的函数 path_for()Twig 模板中使用.你可以使用这个函数在模板中为你的Slim应用中的任何一条有命名的路由生成一条完整的 URL. path_for() 接收两个参数:

1. 路由名称
2. 一个JSON形式的的值,键名为路由匹配模式的占位符,键值为所代表的值

下面这个例子就是一个在模板中使用 path_for() 为名字为 profile 的路由生成一条完整的URL:

{% extends "layout.html" %}

{% block body %}
<h1>User List</h1>
<ul>
		<li><a href="{{ path_for('profile', { 'name': 'josh' }) }}">Josh</a></li>
</ul>
{% endblock %}

slim/php-view 组件

PHP-View 组件也是为了帮助模板渲染的,可以在 Packagist 上找,或者直接使用 composer 去安装:

composer require slim/php-view

把组件注册为Slim 应用的容器服务:

<?php
// Create app
$app = new \Slim\App();

// Get container
$container = $app->getContainer();

// Register component on container
$container['view'] = function ($container) {
		return new \Slim\Views\PhpRenderer('path/to/templates');
};

使用组件 PHP view:

// Render Twig template in route
$app->get('/hello/{name}', function ($request, $response, $args) {
		return $this->view->render($response, 'profile.html', [
				'name' => $args['name']
		]);
})->setName('profile');

// Run app
$app->run();

其他的模板引擎

Slim没有限制你只能使用 Twig-view 或则 PHP-view 组件,你可以使用任何的PHP 模板引擎只要最后把渲染的模板输出在 PSR 7响应对象的body 里面就可以了


文档翻译的并不是很专业,仅供个人学习作用,建议看官方文档。

如有兴趣,请看下一篇 SLIM 3 文档(十三)-HTTP 缓存7)