Как улучшить класс, который имеет слишком много повторяющихся переменных? - PullRequest
0 голосов
/ 10 марта 2011

Я создаю свой сайт, это мой контроллер страницы,

/**
 * this file handles the retrieval and serving of page
 */ 
class controller_core 
{
    public $connection = null;
    public $page_model = null;
    public $authentication_admin = null;
    public $authentication_member = null;
    public $constant = null;

    public function __construct($connection)  
    {  
        $this->connection = $connection;
        $this->page_model = new __page_model($connection);
        $this->authentication_admin = new __authentication_admin($connection);
        $this->authentication_member = new __authentication_member($connection);
        $this->constant = new __constant_model($connection);
    } 

    public function render_page($authenticated_admin, $authenticated_member, $backbone)
    {
        # ob_start - Turn on output buffering. It lets you put output into a buffer instead of sending it directly to the client.
        # in computing, a buffer is a region of memory used to temporarily hold data while it is being moved from one place to another.
        ob_start();

        # set variable for users
        $user_primary = null;
        $user_secondary = null;
        $user_tertiary = null;
        $user_quartary = null;

        # set variable for members
        $member_primary = null;
        $member_secondary = null;
        $member_tertiary = null;

        # store the db connection object in the variable
        $connection = $this->connection;

        # determine it is a root user or a sub user from the class of authentication_admin
        $category_admin = $this->authentication_admin->get_admin_category($authenticated_admin);
        $category_member = $this->authentication_member->get_member_category($authenticated_member);

        # set either one of the user type to true
        switch($category_admin) 
        {
            case 'user_primary':
                $user_primary = true;
                break;
            case 'user_secondary':
                $user_secondary = true;
                break;
            case 'user_tertiary':
                $user_tertiary = true;
                break;
            case 'user_quartary':
                $user_quartary = true;
                break;
        }

        # set either one of the user type to true
        switch($category_member) 
        {
            case 'member_primary':
                $member_primary = true;
                break;
            case 'member_secondary':
                $member_secondary = true;
                break;
            case 'member_tertiary':
                $member_tertiary = true;
                break;  
        }

        # get the constant values from the class of constant
        $cst_value_site_title = $this->constant->get_constant('site_title')->cst_value;
        $cst_value_site_slogan = $this->constant->get_constant('site_slogan')->cst_value;
        $cst_value_meta_description = $this->constant->get_constant('meta_description')->cst_value;
        $cst_value_meta_keywords = $this->constant->get_constant('meta_keywords')->cst_value;


        # if $_REQUEST pg exists
        if(isset($_REQUEST['pg_url']))
        {
            # show the requested page
            # always send the value of $authentication_admin to the class of page:
            # if $authentication_admin has a value, you can see this page even if it is hidden
            # if $authentication_admin has a value, you can see this page only if it is published
            $page = $this->page_model->get_page($_REQUEST['pg_url'],$category_admin);
            $parent = $this->page_model->get_parent($page);

            # store the date into the variable
            $parent_id = $page->parent_id;
            $tmp_path = $page->tmp_path;

            # get the main template/ html document
            include $backbone;
            //print_r($authentication_admin);
        }
        else
        {   
            # if no special page is requested, we'll show the default page
            $page = $this->page_model->get_page(DEFAULT_PAGE,$category_admin);
            $parent = $this->page_model->get_parent($page);

            #store the date into the variable
            $parent_id = $page->parent_id;
            $tmp_path = $page->tmp_path;


            #get the main template/ html document
            include$backbone;
            #print_r($parent);
        }

        #Return the contents of the output buffer.
        return ob_get_contents();

        #Clean (erase) the output buffer and turn off output buffering.
        ob_end_clean();
    }
}

ниже - это класс, который расширен от родительского класса контроллера выше, но вы можете видеть, что я повторяю некоторые (много!) Переменных из родительского класса,

class controller_extended extends controller_core
    {
        function __construct($connection) 
        {
            parent::__construct($connection);
        }

        public function render_page($authenticated_admin, $authenticated_member, $backbone) 
        {
            # set variable for users
            $user_primary = null;
            $user_secondary = null;
            $user_tertiary = null;
            $user_quartary = null;

            # set variable for members
            $member_primary = null;
            $member_secondary = null;
            $member_tertiary = null;

            # store the db connection object in the variable
            $connection = $this->connection;

            # determine it is a root user or a sub user from the class of authentication_admin
            $category_admin = $this->authentication_admin->get_admin_category($authenticated_admin);
            $category_member = $this->authentication_member->get_member_category($authenticated_member);

            # if $_REQUEST tag_name exists 
            if(isset($_REQUEST['tag_name']))
            {
                # get the value from the request
                if(isset($_REQUEST['pg_url'])) $pg_url = $_REQUEST['pg_url'];
                if(isset($_REQUEST['tag_name'])) $tag_name = $_REQUEST['tag_name'];
                if(isset($_REQUEST['str_id'])) $str_id = $_REQUEST['str_id'];

                # show the requested page
                # always send the value of $authentication_admin to the class of page:
                # if $authentication_admin has a value, you can see this page even if it is hidden
                # if $authentication_admin has a value, you can see this page only if it is published
                $page = $this->page_model->get_page($pg_url,$category_admin);
                $parent = $this->page_model->get_parent($page);

                if(empty($str_id))
                {
                    # get the included template
                    switch($pg_url) 
                    {
                        case 'publications':
                            $tmp_path = 'resources_publication_subitem.php';
                            break;
                        case 'tender-opportunities':
                            $tmp_path = 'resources_tender_opportunitie_subitem.php';
                            break;
                        case 'research-topics':
                            $pg_url = $tag_name;
                            $tmp_path = 'item_content_research_topics.php';
                            break;
                        case 'videos':
                            $tmp_path = 'video_tagged.php';
                            break;
                        case 'forum':
                            $tmp_path = 'forum_subitem.php';
                            break;  
                        case 'ener-exchange':
                            $tmp_path = 'exchange_subitem.php';
                            break;
                    }
                }
                else
                {
                    # store the date into the variable
                    $parent_id = $page->parent_id;

                    # get the included template
                    switch($pg_url) 
                    {
                        case 'forum':
                            $tmp_path = 'item_forum.php';
                            break;  
                        case 'ener-exchange':
                            $tmp_path = 'item_exchange.php';
                            break;
                    }

                }

                # get the main template/ html document
                include $backbone;

            }
            else
            {
                parent::render_page($authenticated_admin, $authenticated_member, $backbone);
            }
        }
    }

Как можно обойти эту повторяющуюся переменную? Может я неправильно сделал контроллер?

Спасибо.

EDIT:

извините за непонятность. метод render_page в моем расширенном классе переопределяет метод render_page в родительском классе, поэтому я не могу использовать ключевое слово parent для получения переменных, которые я храню в методе render_page. что мне с этим делать? спасибо.

1 Ответ

0 голосов
/ 10 марта 2011

Трудно понять, для чего предназначены некоторые из этих переменных при развертывании, но просто взглянув на то, что здесь, есть несколько вещей, которые вы могли бы рассмотреть.

Вы можете поместить переключатель для определения уровня пользователя в защищенный метод родительского класса. Таким образом, логика для проверки уровня пользователя может быть вызвана render_page в любом из дочерних контроллеров. Вы можете передать значение из get_admin_category и вернуть строку, чтобы оператор switch можно было использовать повторно.

Кроме того, какова цель буферизации вывода в вашем примере? Я вижу, вы включаете свой шаблон в последний раз на include $backbone, но по какой причине вы делаете буферизацию? В большинстве выпущенных MVC контроллер выполняет некоторую предварительную обработку, вызывает методы модели и упорядочивает данные, а затем просто передает их представлению, которое является единственным представлением клиенту (например, я знаю, что CodeIgniter выполняет это, передавая ' массив вывода в представление, которое может содержать значения для вывода через эхо и т. д.). Не должно быть необходимости задерживать вывод на клиент, поскольку в большинстве MVC это происходит только после загрузки представления.

Начиная с использования вами суперглобального $ _REQUEST, вы полагаетесь на это при выполнении маршрутизации запросов к реальным сценариям на сервере (я могу ошибаться в этом, просто пытаясь интерпретировать то, что дано.) Многие MVC также будет использовать mod_rewrite () для выполнения всей маршрутизации к одной точке входа (Front Controller), а затем полагаться на сценарий для обработки всей маршрутизации, вызывая дочерние конструкторы из путей в URL. Это прекрасный учебник для упражнений, а не для развертывания, в целях: http://www.phpaddiction.com/tags/axial/url-routing-with-php-part-one/

Если вы делаете это как упражнение в понимании паттерна Front Controller, существует множество отличных фреймворков, на которые вы могли бы взглянуть и научиться некоторым трюкам. CodeIgniter и Kohanna - отличные, относительно легкие, которые позволяют легко заглянуть под капот. Очевидно, что Zend очень популярен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...