Вызов контроллера внутри контроллера?


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

Допустимо ли вызывать контроллер комментариев непосредственно из контроллера элементов и профилей, или вместо этого лучше всего вызвать модель комментариев?

Я спрашиваю, потому что в Кохане представление не является синглетным классом, поэтому если бы я вызвал контроллер внутри другого контроллера я получаю два представления. С другой стороны, если бы я просто вызвал модель, в контроллере элементов и профилей был бы дубликат кода.

Все вы, эксперты MVC, помогите! =)

4 3

4 ответа:

В общем, я бы выбрал подход "жирной модели".

Я не уверен, какой код вы действительно боитесь дублировать.

Есть несколько способов сделать это:

Первый способ: - Опросите вашу модель комментариев, чтобы вернуть некоторые комментарии. - Передайте данные комментария в ваше представление. - Рендеринг комментариев в представлении, возможно, с помощью некоторого помощника представления

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

Я предпочитаю второй путь. У некоторых людей есть проблема с тем, чтобы позволить своему слою просмотра разговаривать с моделью (только для чтения!), но я не из их числа.

Если вы используете Kohana 3, Вы можете воспользоваться функцией HMVC. Вы можете выполнять контроллеры внутри контроллеров.

Http://forum.kohanaphp.com/comments.php?DiscussionID=2768

Проверьте приведенную выше ссылку для некоторых примеров

Я бы сказал, что это зависит от того, что возвращает ваш контроллер.

Если ваш контроллер может возвращать DTOs / Models, то, конечно, вызов контроллера-хорошая идея.

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

Однако, если ваш контроллер не может вернуть raw данные, то это определенно prolematic, потому что вы получаете html (или другую разметку) в ответ. Это означает, что вы должны будете передать этот html непосредственно в представление, которое вы хотите, или извлечь данные из него. И то и другое-плохая идея.

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

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

Если вы пытаетесь вызвать статический метод, вы можете просто вызвать функцию напрямую. Например:

class Controller_User extends Controller {
    public static function format_user($user){
        return array("data" => $user->getData());
    }
}

class Controller_Foo extends Controller {
    public function action_index(){
        $user = get_user_data_some_how();
        $user_data = Controller_User::format_user($user)
    }
}