Views в MVC

player

Новичок
Views в MVC

Привет,

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

Поэтому хочу узнать, как хитрее реализовать эту модель - откуда лучше вызывать view.
Есть диспетчер, он загружает нужный контроллер. Контроллер работает с объектами модели, и так как один контроллер работает все время с одними и теми же моделями независимо от того, какой ответ нужно послать клиенту, тут проблем не возникает.

Интереснее становится когда нужно те же данные, которые были сгенерированы на уровне данных, передать нужной вьюшке.
Тут есть возможность
1) писать под каждый view свой контроллер (что по моему мнению совсем не рационально - нужно отделять логику вывода данных от обработки)
2) получать в диспетчер результат работы контроллера (в виде данных) и передавать нужной вьюшке (что тоже криво по моему мнению)
3) ваше решение

Всем спасибо
 

rotoZOOM

ACM maniac
Один из вариантов: получать в диспечере (роутере) нужную вьюшку и передавать ее контроллеру.
 

soines

Новичок
Хм.. А разве контроллер решает откуда ( модель ) брать данные и куда ( отображение ) передавать их?
 

soines

Новичок
Блин.. пропустил слово не :) А разве не контроллер. Я к тому что контроллер должен этим заниматься, а не диспетчер.
 

Lightning

Трудоголик
player
Можно нормально сформулировать вопрос?
Интереснее становится когда нужно те же данные, которые были сгенерированы на уровне данных, передать нужной вьюшке.
Какие те же?
 

player

Новичок
Cкажем нужно генерировать страницу статьи N
данные это то что мы берем из базы данных.
Теперь скажем запрос пришел асинхронный. ТЕ ЖЕ данные из базы теперь нужно обернуть в другой view.

Вроде я уже сразу сначала выразился понятно.. во всяком случае rotoZOOM меня правильно понял

Хм.. А разве не контроллер решает откуда ( модель ) брать данные и куда ( отображение ) передавать их?
Контроллер может РЕШАТЬ куда передавать данные.. но писать два разных класса Page_HTML_Controller и Page_AJAX_Controller, которые достают одинаковые данные - бред

Вопрос в том, как лучше сделать отображение максимально независимым от контроллеров и наоборот

Ответ rotoZOOM возможный вариант. Может быть есть еще альтернативы?
 

Fortop

Новичок
player
это всего лишь другой формат, который может указываться в параметрах (а может и не указываться, а определяться).

Конкретно этот view не будет использоваться нигде кроме данного конкретного контроллера.

Рекомендую посмотреть реализацию contextSwitch в ZF

Один контроллер, один экшн, произвольное число view.
 

player

Новичок
HraKK
Наконецто нашел время взглянуть на твою мвс. Выглядит неплохо.
Один вопрос который не ясен из документации:
PHP:
class Modules_Example_Controller_Example extends Core_Controller_Abstract
{
protected function dispatch()     {
         $this->example = true;
          return $this->render();
     }
}
Где хранится текущии View и Engine?

Спасибо
 

HraKK

Мудак
Команда форума
player
View - храниться в текущем контролере, назначить его туда можно при создании:
PHP:
$SomeController = new Modules_Abstract_Controller_Front( new View() );
Если при создании не был указан то при попытки получить его попробует достать ресурс View ( ресурс считай паттерн Registry ). Если такого ресурса не будет то выкинется Exception.

PHP:
/**
	 * Return view instance
	 *
	 * @return Core_View_Interface
	 */
    public function getView()
    {
        if( null === $this->View )
        {
            $this->View = $this->getApplication()->getResource()->getResource( 'View' );
        }
        return $this->View;
    }
То есть пока ты принудительно не назначишь новый View будет использоваться общий лайаут, а например для виджетов я создаю контроллеры с новым View чтоб эти лайауты не пересекались.

Engine - в контроллере опять же хранится алиас доступного engine. Если он не указан, то в менеджере движков Core_Engine, можно назначить engine по умолчанию. И опять же если и подефолту не назначен движок то выкинется Exception.

PHP:
/**
	 * Return engine instance
	 *
	 * @return Core_Engine_Interface
	 */
    public function getEngine()
    {      
        return $this->getApplication()->getEngine()->getEngine( $this->engine );
    }
 

player

Новичок
О, прикольно.
Спасибо, очень гибкии подход, мне нравится.. думаю чтото похожее сделаю
 
Сверху