干我的申请

时间:2013-09-01 20:12:51

标签: codeigniter oop dry

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

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

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

我已经苦苦挣扎了一段时间,如果你能指出我正确的方向,或者给我一些建议如何正确地做到这一点,我会很高兴。

我的控制器:

    class MY_Controller extends CI_Controller
    {
        $style='',
        $contents = array(),
        $title=''; //and so on

        public function index()
        {
            $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);
        }
    }
到目前为止

图库控制器

    class Gallery extends MY_Controller 
    {
        $style = 'galeria.css',
        $title = 'galeria',
        $contents = array('content_gallery');

        // if $gallery is null, show only all galleries in a list, 
        //else show chosen gallery with its content beneath that list
        public function index($gallery = NULL)
        {        
            $data['galleries'] = $this->gallery_model->get_all_active_galleries(); //names and ids

            if( $gallery != NULL )
            {
                $data['name'] = ...
                $data['description'] = ...

                etc...
            }
        }
    }

1 个答案:

答案 0 :(得分: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