Codeigniter - 使我的控制器更干燥

hai*_*ets 6 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); 
Run Code Online (Sandbox Code Playgroud)

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

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

Esa*_*ija 5

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

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

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();
            }
    }

}
Run Code Online (Sandbox Code Playgroud)

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

一个子控制器:(置于正常状态application/controllers)

class Articles extends Member_controller {

    ...

}
Run Code Online (Sandbox Code Playgroud)

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


hak*_*kre 1

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

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