olekhy/view-model-service

视图建模助手

v0.1.0 2014-05-11 11:09 UTC

This package is auto-updated.

Last update: 2024-09-15 19:19:52 UTC


README

Build Status

Scrutinizer Code Quality

Coverage Status

Coverage Status

名为"ViewModelService"的模块可用于

  • 通过适当的映射器将数据库或用户输入获取的数据插入到视图模型实例中。
  • 随后将(应用)数据插入到视图模型中,并在模板中调用视图模型时构建实例。
  • 在IDE中进行编码时,从视图模板中视图模型的自动完成功能中获得便利。
  • 灵活且安全地将数据映射到视图模型中的逻辑方法(使用映射器)。
  • 通过仓库在不使用控制器的情况下延迟加载视图模型中的数据。

#解释过程和核心思想

首先,在项目的代码库中将包含许多视图模型类,这些类是数据库或另一个来源获取的变量简单表示,并将用于我们的视图模板。所有视图模型类都需要按照约定命名为ConcreteNameViewModel,并且必须实现一个接口ViewModelInterface

与视图模型并行,我们创建视图模型映射器类,映射器类的作用是将数据映射到视图模型实例。映射器类的命名约定与视图模型命名相似,看起来像这样ConcreteNameViewMapper。所有映射器都实现一个接口ViewMapperInterface,并且必须实现map()方法,该方法包含描述如何将数据映射到视图模型的逻辑。

应用数据的过程在内部分为两个逻辑独立的进程,第一个是在仓库中记录一个描述如何创建视图模型的配方,第二个是创建真实的视图模型实例。这种分离的目的是使请求的执行尽可能简单,也就是说,视图模型实例只有在调用以及在模板中需要时才会创建。

接下来,我们将解释如何使用视图模型服务

例如,我们处于UserController::actionShowProfile()请求中

use ViewModelService\ViewModelRepo;

class UserController
{

	function actionShowProfile()
	{
		$self = $this;

		ViewModelRepo::getRepo()->addUserProfile(function() use($self)
		{
			$userId = $self->getRequest()->getParam('userId');
			return $self->getUserService()->findUserProfile($userId);
		);});
	}

	public function getUserService()
	{
		return new UserService();
	}
}

现在在视图模板中

	echo ViewModelRepo::getRepo()->getUserProfile()->firstname;
	echo '<br/>';
	echo ViewModelRepo::getRepo()->getUserProfile()->lastname;

重要的是UserProfileViewModel和UserProfileViewMapper类在代码范围内存在。

以下是一些其他用例

// output immediately as json
echo json_encode(ViewModelRepo::getRepo()->addConcreteViewModel($callable)->getConcreteMode());

// creation of the view model with an specific identifier
// this is necessary for creation more than one view model instance that contains different data
ViewModelRepo::getRepo()->addConcreteViewModel(array('status_first' => 1, 'status_second' => 2, 'level' => 3), 'id_concrete_1');

ViewModelRepo::getRepo()->addConcreteViewModel(new stdClass, 'id_concrete_2');

// get data in template
echo ViewModelRepo::getRepo()->getConcreteViewModel();
// ...
echo ViewModelRepo::getRepo()->getConcreteViewModel('id_concrete_1')->status_first;
// ...
echo ViewModelRepo::getRepo()->getConcreteViewModel('id_concrete_2');