Php 使用对象内部视图

Php 使用对象内部视图,php,codeigniter,templates,Php,Codeigniter,Templates,我正在使用PHP和codeigniter开发一个简单的webapp。 通常在我的控制器中,我将从模型接收的字符串和int等文本值传递给视图以显示它们 在某些情况下,我的模型返回类的对象,而不是文本值。 我知道我可以传递对象来查看和显示它们的值(通过在视图中调用相关的方法),但我认为,从概念上讲,在视图中使用对象并调用它们的方法,而不仅仅是打印文本,是错误的(看起来也很奇怪) 另外,我的问题是,控制器应该从对象中获取/准备值并将其传递给视图,还是将对象传递给视图并让视图执行此任务是可以的。因此,在

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

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

另外,我的问题是,控制器应该从对象中获取/准备值并将其传递给视图,还是将对象传递给视图并让视图执行此任务是可以的。

因此,在“监视”其他PHP框架之后:

Yii:

Symfony:

我发现将对象(或对象数组)传递给视图并对其进行迭代是非常常见的。 因为传递对象有点麻烦(担心有人会调用对象的方法,比如update或delete)

因此,我继续搜索并找到了以下帖子:

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

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

pseoudo代码

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
    }

    ...
}
现在,在我的控制器中,我可以轻松地执行以下操作:

pseoudo代码

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
    }

    ...
}
对于帮助中的每个人来说,Thx在本例中“object”只是一种数据结构的名称。特别是当您从查询数据库的模型中获得结果时——您可以选择是以“数组”还是“对象”的形式返回这些数据库结果

有时您必须在视图中的数据上进行迭代。它是数组还是对象都不是什么大问题

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

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

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


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

答案是:没关系:)因为即使您可以将视图实例定义为object@Banzay,重播的第一个thk。但是不在MVC架构中,对象不应该与视图分离吗?@tereško,让我们把它留给另一个讨论。我是否应该只向视图传递文本以保持视图的逻辑“干净”呢?如果您坚持CodeIgniter的风格:是的。如果您实际实现的是类似于MVC的东西:控制器不应该向UI层传递任何东西。