从这里开始使用 Slim 3 视图篇

2016/06/29

延续 从这里开始使用 Slim 3 入门篇 项目结构,请了解。

安装视图组件

在 site 项目根目录运行

composer require slim/twig-view

设置容器

修改 site/app/bootstrap.php 文件

// ...

// 修改 $app = new \Slim\App;
$container = new \Slim\Container;
$container['view'] = function ($c) {
	$view = new \Slim\Views\Twig('../resources/views');
	
	$view->addExtension(new \Slim\Views\TwigExtension(
		$c['router'],
		$c['request']->getUri(),
	));
	
	return $view;
};
$app = new \Slim\App($container);

// ...

渲染视图

创建 site/resources/views/home.twig 文件

This is the home view.

修改 site/app/routes.php 文件

// ...

/* 修改
* $app->get('/', function ($request, $response, $args) {
*   echo 'Home';
* });
*/
$app->get('/', function ($request, $response, $args) {
	return $this->view->render($response, 'home.twig');
});

// ...

运行下网站看效果 …

数据传送至视图

修改 site/app/routes.php 文件

// ...

/* 修改
* $app->get('/', function ($request, $response, $args) {
* 	return $this->view->render($response, 'home.twig');
* });
*/ 
$app->get('/', function ($request, $response, $args) {
	$name = 'Haven';
	
	return $this->view->render($response, 'home.twig', [
		'name' => $name,
	]);
});

// ...

修改 site/resources/views/home.twig 文件

// 修改 This is the home view.
Hello 

运行下网站看效果 …

路由参数传递

修改 site/app/routes.php 文件

// ...

//增加
$app->get('/profile/{username}', function ($request, $response, $args) {
	
	return $this->view->render($response, 'home.twig', [
		'name' => $args['username'],
	]);
});

// ...

运行下网站看效果 …

path_for 函数使用

修改 site/app/routes.php 文件

// ...

/* 修改
* $app->get('/profile/{username}', function ($request, $response, $args) {
* 
* 	return $this->view->render($response, 'home.twig', [
* 		'name' => $args['username'],
* 	]);
* });
*/
$app->get('/profile/{username}', function ($request, $response, $args) {
	echo $args['username'];
})->setName('user.profile');

// ...

修改 site/resources/views/home.twig 文件

// 修改 Hello 
<a href="\{\{ path_for('user.profile', {'username': 'Haven'}) }}">Haven's user profile</a>

运行下网站看效果 …

你也可以使用 Router 路径来实现,但推荐使用 path_for 函数,如果你改了 Router 路径 setName() 这个别名是不变的,所以不会引起你因业务修改 Router 路径造成你更改大量的的静态页面路径,可维护性更高。