Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MVC-当标签字符串随对象类型更改时,它是否成为模型的一部分而不是视图的一部分?_Php_Oop_Templates - Fatal编程技术网

PHP MVC-当标签字符串随对象类型更改时,它是否成为模型的一部分而不是视图的一部分?

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: ".

我有一个多态对象迭代列表的“Summy”视图,并且我尝试将视图和模型完全分离

那么,我应该把静态标签信息放在哪里呢?我试图避免这种事情在视图中

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 ?>