我正在寻找MCV中视图层的更好解释,特别是程序中的流程如何从控制器到视图,在控制器和控制器之间使用1:1关系时关注模型的状态。图。
在所有示例中,我看到数据正在从控制器转发到视图,并且视图没有任何特定的内容,需要为特定控制器编写特定视图。我是否误解了1:1关系的口头禅?我发现的最新示例在几天后发布在此处:https://stackoverflow.com/a/18983927/1681418
class View
{
public function render($templateFile, array $vars = array())
{
ob_start();
extract($vars);
require($templateFile);
return ob_get_clean();
}
}
我尝试为每个控制器创建特定的视图类,我目前有一个视图,可以根据需要从模型中提取所有数据。从某种意义上来说,我有一个非常清晰的 do-stuff-to-model 部分(=控制器)和只读模型部分(=图)。然而,我有一些缺点,我还没有找到一个整洁的解决方案,即:
我在页面上呈现正确的输出没有问题,但我当前的方法感觉错误。 **任何人都有一个使用域驱动设计的视图示例,模型作为图层而不是类? **
This answer与我通常发现的非常相似,我不明白这种方法如何使用或需要1:1的关系。
我主要是在寻找示例,而不是代码审查,但我无论如何都会在下面提取我的代码中的一些代码。在这里,我通过调度程序调用控制器进行访问控制和路由,然后通过相同的调度程序再次检查访问。视图轮流调用不同的表示对象,如果是http请求,则将数据分配给模板引擎,如果是ajax请求则为json。
class Controller
{
public function login()
{
$this->serviceFactory
->build('recognition')
->authenticate($this->request->username, $this->request->password);
}
}
class View
{
public function login()
{
/** Prepare server response (i.e. state of the model) */
$this->presentationObjectFactory
->build('serverresponse', true)
->setPresentationName('success')
->assignData($this->serviceFactory->build('modelLog')->getModelResponse('success'));
/** Get current visitor information */
$this->presentationObjectFactory
->build('visitor', true)
->assignData($this->serviceFactory->build('recognition')->getCurrentVisitor());
return $this->serviceFactory->build('recognition')->getCurrentVisitor()->isLoggedIn() ?
$this->indexAction() : /* Reroute to index of view */
$this->display('login.html'); /* Show the login template when unsuccesful login*/
}
}
class PresentationObject
{
public function assignData(Collection $visitors)
{
$dateformat = new DateFormat();
$dateTime = new \Datetime();
foreach($visitors as $visitor)
{
$dateTime->setTimestamp($visitor->timestamp);
$this->assign_block_vars('visitor', array(
'ID' => $visitor->id,
'USERNAME' => $visitor->user->Username,
'IP' => $visitor->remote_addr,
'HTTP_USER_AGENT' => $visitor->http_user_agent,
'LAST_SEEN_ONLINE' => ucfirst($dateformat->formatDateDiff($dateTime)),
'DEVICE' => $visitor->getDevice(),
'PLATFORM' => $visitor->getPlatform(),
'BROWSER' => $visitor->getBrowser(),
));
}
}
}
我对MVC和域驱动设计的了解和理解受到用户tereško的强烈影响,但我可能在这个解释的View部分误解了一些内容......
答案 0 :(得分:1)
控制器和视图之间的1:1关系服务的目的是什么?
如果视图可以应用于多个工作流上下文/控制器/模型,则不需要严格的1:1规则。将视图和控制器分开,即使它们只是一起使用并且可以合并,也是明确分离责任的最佳实践。它还使以后更容易交换和共享视图。
应该在哪里选择模板文件?
在您的情况下,您有一个View类,因此应该在那里定义它。在某些系统中,模板是视图,通常在控制器或配置文件中选择。
视图如何了解模型中的错误? 视图如何了解控制器中的命令/操作是否成功?
在某些体系结构中,模型会在更新或任何其他操作期间将其问题返回给控制器。在控制器中,我通常会将任何问题添加到用户消息堆栈中。然后在视图中,我将这些消息输出给用户。
如果出现错误,如何更改视图?或者,当用户状态发生变化时,如何正确地进行路由选择。
我见过这种处理方式有很多种。最强大的解决方案是让控制器将下一个工作流程步骤传递给视图。该视图应该基本上与任何业务逻辑保持不可知。
任何示例代码都会过长而且精心制作SO。我将从良好的MVC框架教程开始: