0

我有MY_Controller一个家长班。它只加载视图,将一些数据传递给它们。我的应用程序是一个简单的网站,几乎没有扩展控制器MY_Controller,它只是设置一些包含需要传递给视图的信息的变量。

我有一个控制器,它与其他控制器略有不同。它需要将更多信息传递给从数据库中获取的视图。在这种情况下我该怎么办?

正如我所看到的,我可以覆盖该控制器中的整个索引函数,但这违反了 DRY 规则,因为唯一的区别是为传递给每个视图的数组设置了更多的值。或者我可以在父控制器中多写几个 LOC,但我想这不是一个好习惯,因为特定的子控制器是唯一需要该代码的控制器。

我已经为此苦苦挣扎了一段时间,如果您能指出正确的方向,或者给我一些如何正确执行此操作的建议,我会很高兴。

我的控制器:

    MY_Controller 类扩展 CI_Controller
    {
        $样式='',
        $contents = 数组(),
        $title=''; //等等

        公共函数索引()
        {
            $data['style'] = $this->style;
            $data['title'] = $this->title;

            $this->load->view('header',$data);

            foreach($this->contents as $row)
            {
                $this->load->view($row,$data);
            }

            $this->load->view('footer',$data);
        }
    }

画廊控制器到目前为止

    类 Gallery 扩展 MY_Controller
    {
        $style = 'galeria.css',
        $title = '画廊',
        $contents = array('content_gallery');

        // 如果 $gallery 为 null,则仅显示列表中的所有画廊,
        //else 在该列表下方显示所选画廊及其内容
        公共函数索引($gallery = NULL)
        {        
            $data['画廊'] = $this->gallery_model->get_all_active_galleries(); //名称和ID

            如果($画廊!= NULL)
            {
                $data['name'] = ...
                $data['描述'] = ...

                ETC...
            }
        }
    }
4

1 回答 1

0

如果您想为特定控制器的每个方法做某事,而不是其他控制器,那么您可以做的是覆盖该控制器的构造函数,如下例所示:

class Main extends MY_Controller {

    /**
     * Constructor
     */
    public function __construct()
    {
        // Call the constructor of the parent controller
        parent::__construct();

        // Load the session library
        $this->load->library('session');
    }
}
?>

在这个例子中,我们想要为每个方法加载会话库,所以我们重写了这个控制器的构造函数。我们首先调用构造函数,然后加载会话库。

同样的原则适用于您可能想做的任何其他任务。但是,请记住,您要在构造函数中设置并在控制器的其他位置使用的任何数据都需要设置为模型的属性。例如,如果您想从您的一个模型中获取商店销售的所有产品,您需要将其存储为$this->products,而不是$products

于 2013-09-02T13:41:55.430 回答