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

/**
 * 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);
            }
        }
    }

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

Спасибо.

РЕДАКТИРОВАТЬ:

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

-1
Run 10 Мар 2011 в 17:53
1
MVC не означает «Мой самый код». Эта катастрофа совершенно не связана с архитектурным шаблоном MVC.
 – 
tereško
7 Сен 2014 в 12:33
Почему враждебный тон? Я согласен, что вопрос здесь неосведомлен / дезинформирован, но, возможно, ОП просто пытался понять более широкий шаблон, общий для фреймворков, насколько это было возможно. Такое отношение не является конструктивным.
 – 
DeaconDesperado
9 Сен 2014 в 13:02
Посмотреть профиль пользователя. Это должно объяснить враждебность.
 – 
tereško
9 Сен 2014 в 13:09
Я посмотрел, и я должен что-то упустить, не могли бы объяснить?
 – 
DeaconDesperado
9 Сен 2014 в 13:13

1 ответ

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

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

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

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

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

-1
DeaconDesperado 10 Мар 2011 в 18:14
Спасибо за ответ. Я не уверен насчет буферизации - я думал, что это может ускорить загрузку сайта - я думаю, что я должен просто избавиться от нее! Благодарность!
 – 
Run
10 Мар 2011 в 18:12
Я добавил ссылку на хороший учебник по маршрутизации mod_rewrite.
 – 
DeaconDesperado
10 Мар 2011 в 18:15
Мне грустно от минусов без комментариев. Я понимаю, что ОП спрашивал о шаблонах, внутренних для фреймворков, которые, как правило, непопулярны здесь, но почему зомби минусует через 3 года после факта?
 – 
DeaconDesperado
9 Сен 2014 в 13:01