HMVC в Zend Framework

Можно ли использовать шаблон HMVC в Zend Framework? Он реализован в Kohana 3 по умолчанию, и мне он очень нравится, поэтому теперь я хочу использовать его в Zend Framework.

Изменить

Я хочу сделать возможным: 1) включить полный запрос (например, контроллер/действие) в другой запрос 2) сделать прямой вызов контроллера/действия, как указано выше.

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

Изменить 2

Чтобы быть более ясным: у меня есть объект страницы, который содержит несколько элементов. Эти элементы могут быть простыми элементами (текст, изображение и т. д.) и специальными элементами, которые являются вызовами контроллера: действия. Каждая страница может содержать «неограниченное количество» (специальных) элементов. Я просто хочу пройтись по этим элементам, определить, с каким элементом я имею дело, и добавить результат этого элемента к содержимому моего представления.

Нравится:

foreach($Page->Elements AS $Element) {
    switch(get_class($Element)) {
        case "Base\TextElement":
            // Add text element to content
            ...
            break;
    case "Base\SpecialElement":
            // Get result of the controller:action call
            break;
        case "Base\ImageElement":
            // Add image element to content
            ...
            break;
        default:
            echo "No case defined for ".get_class($Element);
            die;
    }
}

person Rene Terstegen    schedule 14.10.2010    source источник
comment
в некоторой степени вы можете использовать помощник Zend View framework.zend.com/ manual/en/zend.view.helpers.html позволяет вызывать контроллер из представления и взаимодействовать с ним, но я не эксперт по HMVC :)   -  person Hannes    schedule 14.10.2010
comment
Я хочу включить controller_actions на другие страницы, а также на главную страницу. Насколько я знаю, это невозможно с помощниками (за исключением случаев, когда вы хотите сделать это грязно).   -  person Rene Terstegen    schedule 14.10.2010
comment
Я не очень хорошо знаком с HMVC, но разве стек действий не делает это без особой эффективности? Это может представлять интерес: stackoverflow.com/questions/1558909/   -  person Tim Lytle    schedule 14.10.2010


Ответы (2)


Все зависит от того, что вы пытаетесь сделать.

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

Второй подход — это хелперы представлений с вызовом моделей и действий в контроллерах напрямую. Вы можете использовать помощники действий (и их статический вызов) для доступа к логике контроллера.

Также см. этот пост в блоге:

Использование помощников действий для реализации Полезные виджеты - phly, boy, phly

person takeshin    schedule 14.10.2010
comment
Боюсь, этого недостаточно. Посмотрите на модификацию в моем исходном посте - person Rene Terstegen; 19.10.2010
comment
@Stegeman: я не смотрел на реализацию Kohana, но стек действий ZF - это то, что вам нужно. Однако этого следует избегать (уже обсуждалось, почему), и опубликованное мной решение является рекомендуемой заменой стека действий. - person takeshin; 20.10.2010
comment
Я попробовал, но не смог заставить его работать. Запустил другую угрозу по этому поводу: stackoverflow.com/questions/ 3979234/ - person Rene Terstegen; 20.10.2010
comment
Если я правильно понимаю, я не могу решить на уровне страницы, какой виджет я хочу отображать? - person Rene Terstegen; 25.10.2010
comment
@Stageman Вам нужно изучить запрос, чтобы определить модуль/контроллер/действие или URL-адрес и добавить на его основе условие, отображать или нет виджет (это обычно практикуется и в плагинах контроллера). - person takeshin; 25.10.2010

Поскольку шаблон Kohana HMVC в конечном счете дает вам способ внутреннего обслуживания HTTP-запросов, вы можете создать адаптер Zend_Http_Client, который делает то же самое. Однажды я написал код для проверки концепции; см. https://github.com/ithinkihaveacat/zend-http-client-adapter-internal.

Пример вызова HelloController из IndexController:

class IndexController extends Zend_Controller_Action
{

    public function indexAction()
    {
        $client = new Zend_Http_Client("http://api.local/hello/?name=Clem");

        $client->setAdapter(new Http_Client_Adapter_Internal(
            $this->getFrontController()
        ));

        $response = $client->request();
        echo $response->getBody();
    }

}

Как видите, вместо Request::factory($url) Коханы вам нужно создать клиент (я думаю, имя хоста api.local не используется, но необходимо для удовлетворения некоторых утверждений), а затем установить его адаптер. Эти два шага, очевидно, могут быть выполнены функцией-оболочкой.

person mjs    schedule 24.04.2011