PHP MVC-当标签字符串随对象类型更改时,它是否成为模型的一部分而不是视图的一部分?
我有一个多态对象迭代列表的“Summy”视图,并且我尝试将视图和模型完全分离 那么,我应该把静态标签信息放在哪里呢?我试图避免这种事情在视图中PHP MVC-当标签字符串随对象类型更改时,它是否成为模型的一部分而不是视图的一部分?,php,oop,templates,Php,Oop,Templates,我有一个多态对象迭代列表的“Summy”视图,并且我尝试将视图和模型完全分离 那么,我应该把静态标签信息放在哪里呢?我试图避免这种事情在视图中 while loop do switch (prop->type) case foo: echo "label1: ". prop->data1; echo "label2: ". prop->data2; break; case bar: echo "label3: ".
while loop do
switch (prop->type)
case foo:
echo "label1: ". prop->data1;
echo "label2: ". prop->data2;
break;
case bar:
echo "label3: ". prop->data1;
echo "label2: ". prop->data2;
...
这会使视图代码非常混乱,尤其是当您有多达10种不同的道具->类型,并且摘要必须在几个不同的区域显示时
我想这里真正的问题是…标签是否已经不再是视图的一部分,而现在是模型的一部分,因为它根据对象类型而动态变化?使用switch语句可能不是这里的最佳实践。每次你需要一个新的类型,你就必须添加一个新的案例。在我看来,最好将相应的标签和数据一起存储在类中。但让我们来解决这个问题 您可以做的一件事是为
prop
类实现一个函数,该函数添加了一个功能来获取相应的标签
class PrintLabelPropDecorator {
protected $prop;
public function __construct(Prop $prop)
{
$this->prop = $prop;
}
public function printLabels()
{
switch($this->prop->type)
{
case 'foo':
echo 'Label1: ' . $this->prop->data1;
echo 'Label2: ' . $this->prop->data2;
break;
//[...]
}
}
}
我们要做的第一件事是将要修饰的类注入构造函数。
然后我们编写实际的装饰方法printLabels()
。进行实际检查并打印标签信息
现在我们只需要装饰实际的班级。为了简化起见,我使用伪控制器方法来实现这一点。你应该根据自己的要求把它外包出去
<?php
public function myControllerMethod()
{
//$props = whatever you need to do to get the prop objects
$printLabelPropDecorators = [];
// That should usually better not be handled by the controller
foreach($props AS $prop)
{
$printLabelPropDecorators[] = new PrintLabelPropDecorator($prop);
}
$this->view->create('myfancyview', compact('printLabelPropDecorators'));
}
这可能是一种方法。决定打印哪些标签的实际逻辑现在确实存在于装饰器中,您不会弄乱视图。非常有趣……因此装饰器类是在控制器中调用并传递给视图的模型的一部分。在数据/模型类中使用多态性并在其中定义printLabels()的想法如何?也许,因为所有的['code'](prop)模型/数据对象都是用MVC表示的,所以您可以将这个装饰器称为“视图演示器”。好吧,它既不是一个纯模型(表示内容通常不由模型层处理),也不是一个纯视图(通常视图层不应包含任何逻辑)。非常有趣……因此Decorator类是在控制器中调用并传递给视图的模型的一部分。在数据/模型类中使用多态性并在其中定义printLabels()的想法如何?也许,因为在我的应用程序中,所有的
prop
模型/数据对象都需要能够描述它们自己的摘要,所以可以将其添加到接口中
?这在理论上是可能的,但会违反模型层的目的。您的实体应该保存并提供您的数据,但输出任何内容都不应该是其中的一部分。所以我建议不要这样做。
<?php foreach($printLabelPropDecorators AS $prop): ?>
<?php $prop->printLabels(); ?>
<?php endforeach ?>