是什么让您觉得您正在实施 MVC?因为从哪里看,看起来你已经混淆了模式每个部分的职责。
这是基础知识..
MVC是一种架构设计模式,是SoC原理的体现。它将模型层(负责实现领域业务逻辑)与表示层分开。在表示层中,它将处理用户输入(控制器)的部分与生成用户界面(视图)的逻辑分开。
将此模式应用于 Web 时,信息流如下所示:
- 控制器接收用户的请求
- 控制器改变模型层的状态和(也许)当前视图
- 从模型层查看请求必要信息
- 视图对用户产生响应
你所拥有的不是一个视图,而只是一个模板。你所拥有的不是模型,而只是一个类。
现在你的问题是:
如何设置视图的标题?
您的视图应该从模型层请求它需要的信息:
namespace Views;
class Doclument
{
// ... some code
public function foobar()
{
$library = $this->serviceFactory->acquire('Library');
$title = $library->getCurrentDocument('title');
$content = $library->getCurrentDocument('content');
$this->template['main']->assign([
'title' => $title,
'body' => $content,
]);
}
// ... some more code
public function render()
{
/*
if any templates have been initialized,
here you would put code for combining them and
return html (or some other format)
*/
}
}
当然,您需要知道用户想要查看的文档......应该在控制器中完成:
namespace Controllers;
class Document
{
// ... again, some code, that's not important here
public function getFoobar( $request )
{
$library = $this->serviceFactory->acquire('Library');
$library->useLanguage( $request->getParameter('lang') );
$library->locateDocument( $request->getParameter('id') );
}
}
这$serviceFactory
将在控制器和视图之间共享,因为这是您与模型层交互的方式。这也为您提供了一种只初始化每个服务一次的方法,而不会产生对全局状态的依赖。
我应该在控制器中“公开”这个变量,并在构建模型以在我的视图文件中使用时获取它吗?
不。
模型层(是的,它应该是层而不是类)不应该知道表示层的实现中的任何内容。实际上,视图也不应该知道控制器的。
实际上,在 OOP 中使用公共变量被认为是一种不好的做法(除非您正在创建数据结构......想想:像二叉树这样的东西)。它会导致您的代码泄漏封装。
附言
我试图了解传递变量是如何工作的。
这就是 OOP 的基础。如果您没有很好地掌握 OOP 概念、实践和方法论,那么您不应该玩弄像 MVC 模式这样的高级结构。
查找称为“依赖注入”的东西。