jakesee / slim-template-response

一个Slim框架的插件,允许延迟解析和渲染模板,以便可以检查或修改模板数据。

1.0.1 2017-11-23 15:41 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:37:11 UTC


README

这是一个Slim框架的插件,允许延迟解析和渲染模板,以便可以检查或修改模板数据。

安装

composer require jakesee/slim-template-response ^1.0.1

详细说明

由于Slim框架的设计方式,Slim框架推荐的模板引擎都会在控制器中直接将数据写入ResponseInterface流,因此,在控制器退出后(例如在出站中间件路径中),无法检查或修改模板数据变量。因此,这个Slim-Template-Response插件添加了一种简单的方法,可以在最终将数据写入流之前保存模板变量。

不修改Slim的工作方式,我们可以使用以下方法来延迟写入:

$app->respond($app->run(true)->render());

代替以下内容:

$app->run();

中间件

因此,您可以在控制器退出后的任何中间件中修改模板变量。

class MyMiddleware
{
	function __invoke($request, $response, $next)
	{
		// incoming loop
		...

		// call the next middleware
		$response = $next($request, $response);

		// controller is called eventually and returns:
		// return $response->withTemplate(...);

		// outgoing loop, modify template data
		$response->getTemplate()->data['total'] = 50;

		return $response;
	}
}

单元测试

在单元测试中,您现在也可以通过检查数据变量来直接测试结果。

function testDisplayTotal()
{
	// setup ...

	// Run Slim App
	$response = $app($request, $response);

	// Get the template data
	$data = $response->getTemplate()->data;

	$this->assertEquals(50, $data['total']);
}

用法

此插件由一个Response类(它扩展了Slim Response类)和一个Template类组成。只需将Response类注入到依赖容器中,以便Slim App将使用我们的扩展Response类。

$app = new \Slim\App(); // default Slim Response is initialized by this constructor
$container = $app->getContainer();

// We just replace the Response object by injecting our extended Response into the container
$container['response'] = function($container) {

	// This is how Slim sets up the default Response object in vendor/slim/slim/Slim/DefaultServicesProvide.php.
	// We simply replicate it here as closely as possible.
	$headers = new \Slim\Http\Headers(['Content-Type' => 'text/html; charset=UTF-8']);
	$template = new \Braincase\Slim\Template($container, __DIR__ . '/../resources/views/');
	$response = new \Braincase\Slim\Response($template, 200, $headers);

	return $response->withProtocolVersion($container->get('settings')['httpVersion']);
};

// create a route
$app->get('/test', function($request, $response) {
	$response->withTemplate('default.php', [
		'firstName' => 'Jake',
		'lastName' => 'See'
	]);
});

Template类使用纯PHP进行模板化,没有像Twig或Blade这样的高级功能,但只要您的Template类实现了TemplateInterface,就可以使用您自己的Template类。

兼容性

截至目前,此插件与Slim Framework 3兼容。即将推出Slim Framework 4,但我尚未对其新版本进行测试。