Cakephp внутреннее перенаправление с контроллера на другой контроллер - PullRequest
4 голосов
/ 20 ноября 2010

Обновление: я написал несколько неправильных утверждений об использовании заголовка в php;поэтому забудьте эту часть:)

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

Некоторые детали:

  1. Redirect не выполняет эту работу, поскольку является прямым перенаправлением (через браузер)
  2. requestAction не позволяет мне правильно получать css и изображения

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

Я думаю, что единственное (правильное) решение - это использовать route.php в / config с Router :: connect и там использоватьлогика, которая была в диспетчере диспетчера.

Ответы [ 2 ]

14 голосов
/ 20 ноября 2010

ummm ... header () - это функция, используемая для перенаправления, если в документации PHP нет ошибок. (http://php.net/manual/en/function.header.php) Ядро в cakePHP использует заголовок для функции перенаправления (см. Строки 721 - 730 файла cake / libs / controller.php).

Так что я не уверен, что вы имеете в виду "как обычный PHP". CakePHP - это PHP, он просто построен на объектно-ориентированном коде. Это не магия и не извращенные способы ведения дел. Таким образом, чтобы сделать перенаправление в торте, вы можете просто использовать:

$this->redirect(array('controller' => 'my_controller', 'action' => 'my_action'));

И он вызовет функцию header ().

Теперь. Если вы полностью отключены от перенаправления (возможно, если вы собираетесь на внешний сайт), вы можете вызвать header () в коде. Просто убедитесь, что вы поставили выход (); после вызова заголовка:

header('Location: http://call/my/url');
exit();

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

2 голосов
/ 21 ноября 2010

Как правило, подключение URL-адресов к контроллерам является задачей маршрутов.Если ваша логика довольно сложна, и обычные маршруты ее не обрезают, вы даже можете написать свой собственный класс анализатора маршрутов, который выполняет более сложную логику (это все в руководстве).

Если эта логика маршрутизации включает запросы к базе данныхили любой другой вид логики контроллера и может привести к очень разным выводам для одного и того же URL-адреса в зависимости от некоторого внутреннего состояния, хотя вы создаете очень RESTless приложение, и я хотел бы представить, что вы должны переосмыслить то, что вы 'пытаюсь сделать.Сказав это, вы можете визуализировать любое представление из любого действия контроллера, используя $this->render().Логика контроллера для каждого представления может быть помещена в AppController или, возможно, (частично) в вызываемые модели из любого места.Таким образом, вместо «перенаправления» на другой контроллер маршрут просто перенаправляет на конкретное действие контроллера, как обычно, это действие динамически вызывает код, который ему нужно вызвать, и затем отображает представление, которое необходимо отрендерить.

Если вычтобы ваше приложение оставалось с тем же URL-адресом, но отображало совсем другое содержимое, вам, вероятно, следует также заняться созданием приложения AJAX.

Вероятно, подходящее для вас решение находится где-то посередине.

...