【发布时间】:2015-08-31 18:46:25
【问题描述】:
我正在学习使用 MVC 作为设计模式编写 php。我确实认为我非常了解角色控制器、模型和视图的方式和内容。
但我似乎遇到的主要问题是如何实际布局页面。 对我来说一个典型的页面示例是。
一个看起来像这样的路由器:
Route::('/blogg/[id]', 'controllers/blogg@read');
稍后,在控制器中它可能会这样说:
public function read($id)
{
$this->model->getPost($id);
View::renderHtml('header', $data);
View::render('views/blogg/post', $data);
View::renderHtml('footer', $data);
}
好的,到目前为止,一切都很好。在我的脑海中,一切看起来都干净利落。例如,这将使页面看起来像图片上的示例 B。导航栏在“renderHtml('header')”视图内的位置...
但是,如果我希望我的页面看起来像示例 F。两个侧边栏位于屏幕的两侧。我该怎么做呢?
让我们尝试一下侧边栏包含不同的可重用小部件的想法。像 Twitter Feed,或“热门博客文章”或其他任何东西。并且不同的页面,甚至不同的博客文章会动态地将不同的小部件或信息加载到两个侧边栏中。
这仍然是这个控制器的责任吗?我是否应该简单地做这样的事情:
public function read($id)
{
$this->model->getPost($id);
View::renderHtml('header', $data);
View::renderPartial('sidebar-left', $data);
View::render('views/blogg/post', $data);
View::renderPartial('sidebar-right', $data);
View::renderHtml('footer', $data);
}
我根本不喜欢这个解决方案。因为突然之间,我刚刚学到的干净的 MVC 模式……似乎又变成了这个大烂摊子。
所以...例如,谁来渲染侧边栏。谁应该动态地用内容填充侧边栏。所有这些在哪里结合在一起!?我的意思是,我不应该在每个视图中重新创建侧边栏,对吧?例如,我将有许多不同的页面将侧边栏用于完全不同的目的。
为了记录,我正在使用一个框架,但不是像 Laravel 或 CakePHP 这样的大框架......一个更小的框架。我真的很喜欢它,所以我更想学习...... MVC 这样做的方式,而不是仅仅被推荐使用 Laravel 或其他东西。不过,请告诉我 Laravel 或其他大型框架如何处理这个问题。我相信有很多方法可以解决这个问题。
【问题讨论】:
-
在大多数框架中,您只需将数据向下传递,然后让主视图决定在哪里呈现部分......
-
什么是主视图?就像一个决定天气的主视图/布局一样,此页面上是否有侧边栏?就像一个包含所有可能事物的视图,例如左侧边栏、右侧边栏、导航栏、内容等?那么控制器将如何传递,让我们说侧边栏左侧到主视图呢?它如何告诉它侧边栏需要显示什么?
标签: php html model-view-controller