Вызов контроллера в методе класса

Савелей

Новичок
Вызов контроллера в методе класса

Всем привет!

Есть класс админки "UsersAdmin extends Users"

понадобилось использовать в UsersAdmin отдельный (внешний) класс "Folders"

Folders вызывается примерно так:
PHP:
$Folders = new Folders();
$Folders->set_path('/temp');
$Folders->set_base_table_list('temp');
$Folders->set_base_table_category('temp_cat');

//в данном классе action и есть контроллер, через switch
$Folders->action($_GET['action']);

$Folders->display();


У меня вопрос, можно ли создать метод в UsersAdmin что-то вроде:
PHP:
public function viewFolders() 
{
 $Folders = new Folders();
 $Folders->set_path('/temp');
 $Folders->set_base_table_list('temp');
 $Folders->set_base_table_category('temp_cat');

 //в данном классе, action и есть контроллер, через switch
 $Folders->action($_GET['action']);

 $this->view->content = $Folders->display(false);
}
как это можно назвать:), это нормально или всеже нужно к методам???
 

Савелей

Новичок
Религия кошерная, многое не позволяет:)

Может ссылкой кто поможет, на примерные реализации.
 

Савелей

Новичок
читай выше, ты сам не так давно этот вопрос поднимал, про вызов контроллера в методе, дабы избежать дублирования кода.
 

Духовность™

Продвинутый новичок
Да. Я пока не нашел хорошего решения, но вот что надумал:

У меня контроллеры - это классы, реализующие большие методы (до 100-150 строк кода) отвечающие за генерацию данных для view КОНКРЕТНОЙ страницы. В контроллерах используются объекты элементов сайта - мапперы, доменные модели:

PHP:
class Record_Controller
{
    public function list()
    {
        // навигация
        $navigation = new Navigation(20, 200);
        $start_limit = $navigation->getStartLimit();
        $stop_limit = $navigation->getStopLimit();
        
        // выборка всех записей
        $params = array
        (
            'limit' => array('start' => $start_limit, 'stop' => $stop_limit),
            'order' => array($this->request->sort => $this->request->ad),
        );
        
        // получаем записи 
        $data = $this->mapper->getObjectList_($params)->getDataAsArray();
        
        // отдаем во view список записей
        $this->view->setList($data);
    }
}
тут результат $data отдается в метод view->setList(). setList() что-то делает с данными, какой-нибудь htmlcpesialchars запускает.

объект View у меня - это объект для конкретного класса контроллера, в данном случае _по умолчанию_ view у меня будет экземпляром класса View_Record, реализующий метод setList().

Теперь, допустим, я хочу использовать Record_Controller->list() в методе другого контроллера. Я это делаю заменив view идущий по умолчанию:

PHP:
class other
{
    function foo()
    {
        $c = new Record_Controller();
        // Поскольку из-за моей кривой реализации Record_Controller 
        // САМ инстанцируеет view Other_View (yf основе глобальных всяких переменных),
        // то  я подменяю view на view контроллера Record_Controller - View_Record
        $c->setViewClassName('View_Record');
        $c->run('list'); // запускаем метод Record_Controller->list()
        $record_view = $c->getView(); // получили объект View_Other с данными, сгенерироваными в Record_Controller->list()
        
        // олтдаю в родной view данные из View_Record
        $this->view->setData($record_view->getData());
    }
}
уф...
 

Савелей

Новичок
Спасибо, вот что я искал, еще раз спасибо!

а то постоянно плодить код, не оч. хочется.
 

x-yuri

Новичок
triumvirat а $record_view->getData() возвращает именно данные, а не сгенерированный html-код? можешь привести конкретный пример, когда такое надо?
 

Lightning

Трудоголик
triumvirat
А почему в твоем примере метод list нельзя вынести в отдельный класс?
Мне кажется, что в контроллере инстанцировать другой контроллер для того чтобы использовать несколько его методов - это как-то нехорошо.

-~{}~ 05.03.09 20:20:

Да и еще и View лишний создается
 

Духовность™

Продвинутый новичок
а $record_view->getData() возвращает именно данные, а не сгенерированный html-код? можешь привести конкретный пример, когда такое надо?
именно данные. данные view - это просто массив, в который складируется всё, что скармливается вьюшке.

конкретный пример? ну а если мы захотим использовать другой шаблон под однотипную структуру данных?


А почему в твоем примере метод list нельзя вынести в отдельный класс?
и что с точки зрения ООП этот класс будет из себя представлять? да и на момент реализации метода list я не думал, что он будет использоваться в другом контроллере.

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

Да и еще и View лишний создается
Я далеко не гуру в МВС. Я с трудом осиливал этот "паттерн", прежде чем что-то написать. Я не претендую ни на что. Но то, что я сейчас реализовал, мне лично самому нравится. На слабую хилую троечку.

У меня в системе 3 сущности:

- Модель - классы мепперы.
- Контроллеры - просто классы с именами методов, которые запускаются приложением front:

Article::list ---> /articles/
Article::view ---> /articles/article.html
и т.д.

- View.

View cоздается под каждый контроллер свой. Т.е. под каждый контроллер - свой view.
View инстанцируется в контроллере и контроллер наполняет View.
View может содержать методы, которые занимаются форматированием данных. Например, метод формирует массив перед тем, как он будет доступен в шаблоне:

PHP:
    /*
    * Формирует массив для вывода списка групп.
    * 
    * @param array масив объектов типа Group_Model
    * @return void
    */
    public function makeList(array $groups)
    {
        $this->groups = array();

        foreach ($groups as $id_group => $group)
        {
            $this->groups[] = array
            (
                'id_group' => $group->id,
                'group_name' => $this->goFormat()->run($group->group_name, 'entDec', 'hsc'),
                'group_active' => $group->group_active ? 'yes' : 'no',
                'group_global' => $group->group_global ? 'yes' : 'no',
                'group_name_confirm' => $this->goFormat()->run($group->group_name, 'entDec', 'confirm')
            );
        }
    }
потом view генерирует html примитивным образом:

PHP:
    /*
    * Возвращает сгенерированый HTML-код.
    * 
    * @param void
    * @return string
    */
    public function run()
    {
        $this->html_title = $this->goHtmlTitle()->getTitle();
        extract($this->data->getData());

        ob_start();
        include($this->template_dir.$this->template_file);
        // тут сгенерированный html - либо целой страницы, либо просто блок html кода
        $this->out = ob_get_contents();
        ob_end_clean();
    }
 

Lightning

Трудоголик
и что с точки зрения ООП этот класс будет из себя представлять?
У меня контроллеры - это классы, реализующие большие методы (до 100-150 строк кода) отвечающие за генерацию данных для view КОНКРЕТНОЙ страницы.
Наверное, ты считаешь, что контроллер - это должен быть один класс. У меня так получается только в простейших случаях. В большинстве же случаев логику контроллера я реализую через несколько классов. Например, если некоторые действия контроллера зависят от прав пользователя, я использую паттерн "cтратегия" - уже получается несколько классов. Ну и методы по 100-150 строк кода я стараюсь не писать, потому что я могу в них потом не разобраться ))) Всреднем 20 строчек бывает достаточно, максимум 50.
да и на момент реализации метода list я не думал, что он будет использоваться в другом контроллере.
Естественно. Но почему бы не произвести рефакторинг кода?
 

Духовность™

Продвинутый новичок
Lightning
что бы продолжать дальше разговор, покажи как контроллеры вызываются и приведи реальный пример. на словах не очень понятно. ты пишешь, что
Мне кажется, что в контроллере инстанцировать другой контроллер для того чтобы использовать несколько его методов - это как-то нехорошо.
и одновременно
В большинстве же случаев логику контроллера я реализую через несколько классов
ты про какие классы говоришь?
 

Lightning

Трудоголик
покажи как контроллеры вызываются и приведи реальный пример. на словах не очень понятно.
Получится целая статья ) Может к понедельнику напишу )
Сразу оговорюсь, что я не утверждаю, что нужно делать именно так. Я не гуру в MVC, я просто стараюсь сделать логичный дизайн кода и исключить дублирование логики. Вроде нормально получается.
ты про какие классы говоришь?
В приложении создается экземпляр класса контролера. Контролер может создавать и использовать объекты, которые реализуют части его логики, но сами при этом не используются приложением как самостоятельные контроллеры (но и к модели их тоже отнести нельзя). Такие вещи делаю для того, чтобы избежать дублирования (и как побочный эффект код становится эстетичней). Вроде это не противоречит MVC.
 

x-yuri

Новичок
конкретный пример? ну а если мы захотим использовать другой шаблон под однотипную структуру данных?
почему бы не сделать два вида, а в контроллере выбирать один из них? Еще стоит подумать, нужно ли оно тебе, но если нужно - ок

Наверное, ты считаешь, что контроллер - это должен быть один класс. У меня так получается только в простейших случаях. В большинстве же случаев логику контроллера я реализую через несколько классов. Например, если некоторые действия контроллера зависят от прав пользователя, я использую паттерн "cтратегия" - уже получается несколько классов
т.е. на концептуальном уровне у тебя 1 контроллер, но при реализации ты для удобства разбил его на несколько классов. Т.е. есть основной класс + вспомогательные. Имхо - адекватно
 
Сверху