Codeigniter - 使我的控制器更干燥

时间:2011-12-01 16:28:05

标签: php model-view-controller templates codeigniter dry

在我的codeigniter控制器函数中,我使用以下代码生成我的视图并插入所有必要的内容:

        $left_column = $this->load->view('widgets/sub_navigation', $subnav_data, true);
        $left_column .= $this->load->view('widgets/search_box', '', true); //Set data to be loaded into columns
        $left_column_base = $this->load->view('widgets/assist_navigation', '', true);
        $center_column = 'this is center column';
        $right_column = $this->load->view('widgets/ask_us_a_question', '', true);
        $right_column .= $this->load->view('widgets/newsletter', '', true);
        $right_column .= $this->load->view('widgets/latest_news', '', true);

        $this->template->inject_partial('left_column', $left_column); //Inject data into the partial columns
        $this->template->inject_partial('left_column_base', $left_column_base);
        $this->template->inject_partial('center_column', $center_column);
        $this->template->inject_partial('right_column', $right_column);
        $this->template->build('template',$data); 

我使用的是三列布局,上面的代码指示了每个列中显示的内容。它以非常模块化的方式工作,允许我快速自定义每个页面。

有没有办法简化上面的代码,使用数组,可以减少重复代码,使事情更干嘛?

3 个答案:

答案 0 :(得分:5)

您需要创建扩展CI_Controller的基本控制器。然后,所有控制器都会扩展您创建的某个基本控制器,具体取决于在调用控制器的所有情况下需要执行的操作。

application/core中创建一个名为MY_controller.php的文件(前缀可在配置中更改):

class MY_Controller extends CI_Controller {


    function __construct()
    {

        parent::__construct();


            /* Widgets are only prepared -- they will be fetched and rendered once layout->render is called.
               This saves the overhead of reading the files on requests where layout isn't rendered.
            */                  


        $this->layout->prepare_widget( "widgets/navigation", "navigation_widget" );
        $this->layout->prepare_widget( "widgets/footer", "footer_widget"  );
        $this->layout->prepare_widget( "widgets/twitter", "twitter_widget" );

    }


}


class Public_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();
    }

}

class Admin_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();

            if( !$this->user->has_permissions( PERMISSION_ADMIN ) )
            {
                redirect( base_url(), "location", 303 );    
                die();
            }
    }

}

class Member_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();


            if( !$this->user->has_permissions( PERMISSION_REGISTERED ) )
            {
                redirect( base_url(), "location", 303 );
                die();
            }
    }

}

如您所见,所有子控制器都自动拥有小部件,因为它们扩展了public,admin或member。扩展管理控制器的子控制器会自动检查权限,因此您无需再次执行此操作。您可以将此概念应用于您的应用。

子控制器:(置于正常application/controllers

class Articles extends Member_controller {

    ...

}

将自动确保用户已登录,并且无需执行任何操作即可准备小部件,因为父类的父级已准备好它们。如果逻辑需要在最后进行布局渲染,那么您需要在文章中做的就是调用$this->layout->render

答案 1 :(得分:1)

Codeigniter控制器是在事务脚本模式之后设计的,众所周知,当应用程序增长时,控制器会变得很大并且“不会干”。

为防止出现这种情况,您可以重新实现视图以处理支持布局的两步复合视图模式。寻找布局视图IIRC在codeigniter网站上有一些。

答案 2 :(得分:0)

我写了一篇博文,解释了我在组织CodeIgniter控制器时的设计理念,使它们更加干燥。我喜欢将控制器的索引功能作为公共入口/出口点,以避免重复所有控制器方法通用的操作。

http://caseyflynn.com/2011/10/26/codeigniter-php-framework-how-to-organize-controllers-to-achieve-dry-principles/