Вызов контроллера внутри контроллера? - PullRequest
3 голосов
/ 22 сентября 2009

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 22 сентября 2009

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

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

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

3 голосов
/ 22 сентября 2009

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

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

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

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

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

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

1 голос
/ 22 сентября 2009

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

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

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

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

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

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

0 голосов
/ 31 июля 2012

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

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)
    }
}
...