PHP don';不要重复代码(不要重复自己)


PHP don't repeat code ( don't repeat yourself )

我在codeigniter中使用codeignite器(模板)库。我总是在每个函数中重复模板库代码。你能帮我减少代码吗。

public function index(){
    //Load View in template file
        $this->template->title('Contacts')
        ->set_layout($this->admin_home_layout)
        ->set_partial('header', 'admin/admin_share/admin_header')
        ->set_partial('sidebar', 'admin/admin_share/admin_sidebar')
        ->set_partial('footer', 'admin/admin_share/admin_footer')
        ->set_partial('hidenbar', 'admin/admin_share/admin_hidenbar')        
        ->build('admin/admin_home');
    }

我在每个函数中都使用这4行。如何在一个控制器中使用一次,以及如何进入功能。

->set_partial('header', 'admin/admin_share/admin_header')
    ->set_partial('sidebar', 'admin/admin_share/admin_sidebar')
    ->set_partial('footer', 'admin/admin_share/admin_footer')
    ->set_partial('hidenbar', 'admin/admin_share/admin_hidenbar')

我就是这样做的(适用于PHP中任何具有类似视图呈现方式的框架):

假设控制器看起来像这样:

<?php 
class AdminController extends BaseController{
    public function viewData($id){
        // do something
        $this->render('something static 1');
        $this->render('customview');
        $this->render('something static 2');
        $this->render('something static 3');
    }
}
?>

我要做的是创建一个基本控制器来完成渲染任务(以及更多重复的东西):

<?php 
class MyBaseController extends BaseController{
    protected function renderAll($param){
        if(empty($param)){
            return false;
        }
        $this->render('something static 1');
        $this->render($param);
        $this->render('something static 2');
        $this->render('something static 3');
        return true;
    }
}
?>

一旦完成,我将简单地在我的所有控制器中继承新创建的控制器,例如:

<?php 
class AdminController extends MyBaseController{
    public function viewData($id){
        // do something
        $this->renderAll('customview');
    }
}
?>

您可以在任何想要的控制器操作中重复使用它,只需继承自定义的基本控制器类即可。

您可以在构造函数中设置它们:

public function __construct() {
    parent::__construct();
    //Do your stuf here
}

或者你可以为它创建一个函数:

function set_partials() {
    $this->template->set_partial('header', 'admin/admin_share/admin_header')
    ->set_partial('sidebar', 'admin/admin_share/admin_sidebar')
    ->set_partial('footer', 'admin/admin_share/admin_footer')
    ->set_partial('hidenbar', 'admin/admin_share/admin_hidenbar')
}

在第二种情况下,您的索引将如下所示:

public function index(){
    //Load View in template file
    $this->template->title('Contacts')
    ->set_layout($this->admin_home_layout);
    $this->set_partials();
    $this->template->build('admin/admin_home');
}

我建议一个不同的逻辑,只是为您的部分定制一个数组,如下所示:

protected $partials = [
    'header' => 'admin/admin_share/admin_header',
    'sidebar' => 'admin/admin_share/admin_sidebar',
    'footer' => 'admin/admin_share/admin_footer',
    'hidenbar' => 'admin/admin_share/admin_hidenbar'
];

并使用此功能构建布局

public function build_layout()
{
    $this->template->title('Contacts')->set_layout($this->admin_home_layout);
        foreach($this->partials as $k => $partial){
            $this->template->set_partial($k,$partial);
    }
    $this->template->build('admin/admin_home');
}