Slim 跟传统的MVC框架不一样,并没有视图层.在Slim中,视图是一个HTTP响应.任何一个Slim应用的路由都是负责准备或者返回一个PSR 7的响应对象.
切记:Slim 的视图是一个HTTP 响应
话虽如此,但是Slim项目提供了 Twig-View 和 PHP-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)