【问题标题】:using object inside views [closed]在视图中使用对象[关闭]
【发布时间】:2014-12-30 07:34:55
【问题描述】:

我正在使用 PHP 和 codeigniter 开发一个简单的 webapp。 通常在我的控制器中,我将从 Model 接收到的字符串和 int 等文字值传递给 View 以显示它们。

在某些情况下,我的模型返回一个类的对象,而不是文字值。 我知道我可以将对象传递给 View 并显示它们的值(通过在视图中调用相关方法),但我认为,从概念上讲,使用对象并在视图中调用它们的方法是错误的(看起来也很奇怪),而不是只是打印文字。

无论如何,我的问题是,控制器应该从对象中获取/准备值并将它们传递给视图,还是可以将对象传递给视图并让视图完成这项工作。

【问题讨论】:

  • 答案是:没关系 :) 因为即使您可以将视图实例定义为对象
  • @Banzay,首先感谢重播。但不在 MVC 架构中,对象不应该与视图分开吗?
  • @tereško ellislab.com/codeigniter/user-guide/overview/mvc.html 但让我们把它留给另一个讨论。我应该只将文字传递给 Views 以保持视图从逻辑中“干净”吗?
  • 如果你坚持 CodeIgniter 的风格:是的。如果您实际上正在实现类似于 MVC 的任何东西:控制器不应该将 anything 传递给 UI 层。

标签: php codeigniter templates


【解决方案1】:

所以在“窥探”其他 PHP 框架之后:

Yii:http://www.yiiframework.com/doc/guide/1.1/en/form.table

Symfony:http://symfony.com/doc/current/quick_tour/the_view.html

我看到将对象(或对象数组)传递给 View 并对其进行迭代是很常见的。 因为它有点困扰我传递对象(害怕有人会调用对象的方法,如 updatedelete

于是我继续搜索,发现了这个帖子:Laravel: object or other structures (array, json..) to the view?

@The_Alpha,建议传递对象的数组表示,只包含类的属性,我相信这是个好主意

所以我将向模型基类添加一个新方法 getArray(),它将返回对象的数组表示。

伪代码

class Model{

    ...

    public function getArray(){
        $array = array();
        foreach($this as $key => $value) {
           $array[$key] = $value;
        }
        return $array;
    }

    ...
}

现在在我的控制器中我可以轻松做到:

伪代码

class MyController extends Controller{

    ...

    public function action(){

        $array = $this->model->getArray(); // fetch array representation of model
        $this->view('myview',$array);      // pass the array to view for rendering
    }

    ...
}

谢谢大家的帮助

【讨论】:

    【解决方案2】:

    在这种情况下,“对象”只是一种数据结构的名称。特别是当您从查询数据库的模型中获取结果时——您可以选择是将这些数据库结果作为“数组”还是“对象”返回。

    有时您必须遍历视图中的数据。它是一个数组还是一个对象都不是什么大问题。

    如果您有一个控制器以某种方式“准备数据”,那么您将拥有一个“胖”控制器。与让模型准备数据 => 瘦控制器相比。

    您希望控制器根据您获得的数据显示适当的视图。例如搜索——如果没有返回结果,那么您将显示“没有结果请重试”视图。如果结果返回,那么您会将这些结果传递给可以显示的视图。

    换句话说,您没有检查结果是否返回到视图代码中。如果您调用结果视图,则您已经确认有有效的结果要显示。

    控制器调用视图。视图可以调用其他视图。视图还可以包括对模型的调用,但不赞成这样做,因为它可能会变得混乱且难以调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多