Codeigniter — делаю мои контроллеры более СУХИМИ

В моей функции контроллера 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); 

Я использую макет из трех столбцов, и приведенный выше код определяет, что отображается в каждом из столбцов. Он работает очень модульно, что позволяет мне быстро настраивать каждую страницу.

Есть ли способ упростить приведенный выше код, возможно, используя массивы, чтобы сократить повторяющийся код, сделав вещи более СУХИМИ??


person hairynuggets    schedule 01.12.2011    source источник
comment
Я никогда раньше не слышал термин DRY, может кто-нибудь уточнить?   -  person David Nguyen    schedule 01.12.2011
comment
@DavidNguyen Ты серьезно? В этом случае en.wikipedia.org/wiki/Don't_repeat_yourself   -  person Damien Pirsy    schedule 01.12.2011
comment
@DavidNguyen, это означает «Не повторяйся», шаблон, при котором вы избегаете спагетти с копипастой.   -  person Esailija    schedule 01.12.2011
comment
Повторяющийся код @Esailija не обязательно является спагетти-кодом   -  person Damien Pirsy    schedule 01.12.2011
comment
Повторяющийся (а затем слегка измененный) код обычно называют спагетти-кодом. Или антипаттерн Большой ком грязи.   -  person hakre    schedule 01.12.2011


Ответы (3)


Контроллеры Codeigniter разработаны по шаблону сценария транзакции, известно, что контроллер имеет тенденцию становиться большим и «не СУХИМ» по мере роста вашего приложения.

Чтобы предотвратить это, вы можете повторно реализовать представление для обработки двухшагового составного шаблона представления, поддерживающего макеты. Ищите представление макета IIRC, некоторые из них есть на сайте codeigniter.

person hakre    schedule 01.12.2011

Вам нужно создать базовые контроллеры, расширяющие 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, если логика требует отрисовки макета в конце.

person Esailija    schedule 01.12.2011

Я написал сообщение в блоге, объясняющее мою философию дизайна по организации контроллеров CodeIgniter, чтобы сделать их более СУХИМИ. Мне нравится, когда функция index моего контроллера служит общей точкой входа/выхода, чтобы избежать повторения операций, общих для всех методов контроллера.

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

person Casey Flynn    schedule 07.12.2011