Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Вызов из контроллера другого контроллера
http://forum.kohanaframework.su/viewtopic.php?f=31&t=233
Страница 1 из 2

Автор:  andrey55555 [ 03 июл 2012, 16:55 ]
Заголовок сообщения:  Вызов из контроллера другого контроллера

Всем доброго дня!

Есть следующий вопрос.

Я хочу сделать так, что бы страница собиралась как конструктор из нескольких элементов (например: меню, левый блок, правый блок, центральная часть).
Для каждого такого элемента логично было бы написать свой контроллер и при формировании страницы подключать требуемые контроллеры.
То есть есть страница http://mysite/page/index. Она формируется контроллером Page, функцией action_index(). Хочу сделать так, чтобы внутри action_index() вызывались (подключались) другие контроллеры, отвечающие за формирование элементов страницы. Как-то так:

    class Controller_Page extends Controller_Common {

    public function action_index()
    {

    вызов контроллера меню;
    вызов контроллера левого блока;
    вызов контроллера центральной части;
    вызов контроллера правого блока;

    }

Как правильно реализовать вызов контроллеров?

Какие есть способы обращения из контроллера к другому контроллеру?

В моем случае через «роуты» наверное не получиться, так как контроллеры элементов страницы не имеют самостоятельного адреса в URL. Адрес URL у страницы один: http://mysite/page/index.

Автор:  mamahtehok [ 03 июл 2012, 18:49 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();


т.е. для вашего случая будет что то типа

Код:
$menu = Request::factory('menu')->execute()->body();
$sidebar = Request::factory('sidebar')->execute()->body();
$content = Request::factory('uri')->execute()->body();

$this->template->body = View::factory('index')->set('menu',$menu)->set('sidebar',$sidebar)->set('content',$content);

Автор:  andrey55555 [ 03 июл 2012, 20:00 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

mamahtehok писал(а):
Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();



А роут надо писать? Разве Request::factory('uri') работает не с URL?

И еще вопросы.
Где должны быть расположены файлы 'menu', 'uri', 'sidebar'? В [url]application\classes\controller\[/url]?
Как должны называться внутри файлов 'menu', 'uri', 'sidebar' функции (методы) ?

Автор:  andrey55555 [ 04 июл 2012, 00:35 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

Цитата:
Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();


Спасибо "mamahtehok", работает!
Только я не понял как оно работает без роута :o .
И где все же должны быть расположены файлы 'menu', 'uri', 'sidebar'? В application\classes\controller\? Или kohana их найдет и в другой папке, нпример: application\classes\controller\page\?

И как можно обращаться к функциям (методам) внутри файлов 'menu', 'uri', 'sidebar' ?
У меня сейчас работает с единственным методом:
    public function action_index()

А как вызывать другие функции (методы)?

Автор:  Wapruks [ 04 июл 2012, 09:05 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

если вызываемый контроллер лежит в application\classes\controller\page\ то и подключаешь как

$menu = Request::factory('page/menu')->execute()->body();

Автор:  andrey55555 [ 04 июл 2012, 13:07 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

Wapruks писал(а):
если вызываемый контроллер лежит в application\classes\controller\page\ то и подключаешь как

$menu = Request::factory('page/menu')->execute()->body();


Пробовал - не работает.

Работает если только 'menu' лежит в application\classes\controller\

Или надо еще роут писать?

И как подключать другие методы?

Автор:  mamahtehok [ 04 июл 2012, 13:27 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

Requests работает с uri т.е. для него необходимы роуты. Если вас это не устраивает то можно использовать стандартный способ для пхп

Код:
$class = new Controller_My();
$class->method();

Автор:  andrey55555 [ 04 июл 2012, 14:14 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

mamahtehok писал(а):
Requests работает с uri т.е. для него необходимы роуты. Если вас это не устраивает то можно использовать стандартный способ для пхп

Код:
$class = new Controller_My();
$class->method();


Спасибо, "mamahtehok" за ответ! Все четко и ясно!

Лично я нашел несколько способов подключения необходимых контроллеров (классов) внутри другого контроллера:
1. Стандартный способ для пхп
Код:
$class = new Controller_My();
$class->method();


2. Подключение необходимого контроллера (класса) как хелпера
Достаточно расположить файл необходимого класса в application\classes\ и сразу использовать
Код:
Controller_My::method();

kohana сама его найдет и подключит.

3. Подключение необходимого контроллера (класса) как модели (очень похоже на Стандартный способ для пхп)
Код:
$class = new Model_My();
$class->method();


Ну и последний способ, как вы предлагали через Requests. Этот способ у меня то же сработал даже без роутов :o
Наверное по тому, что файл контроллера лежал в application\classes\controller\ и имел единственный метод index.

После всего у меня возникли еще вопросы.
1. Как все же идеологически правильно подключать необходимые контроллеры (классы) внутри другого контроллера?
2. Обязательно в названии класса должно присутствовать слово Controller?
3. В чем разница между просто классом, контроллером, хелпером и модулем (если писать свой модуль)? Разъясните, пожалуйста, в чем тут нюанс?

Автор:  mamahtehok [ 05 июл 2012, 13:51 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

1. Идеологически правильно все же через хелперы или внутренние реквесты.
2. Controller должно присутствовать обязательно в классе который реализует контролер, так же как в класе реализующем модель дложно присутствовать Model_
3. класс базовая единица ООП (подробно можно причитать в учебнике по php), контроллер это класс, в соответствии с парадигмой mvc обеспечивающий коммуникации между пользователем моделью и представлением, хелпер класс предоставляющие функции для решения каких то задач например хелпер arr собирает функции для работы с массивами. модуль это приложение реализующее коакой-то конкретный функционал например антентификации пользователя или работы с БД. Как-то так.

Автор:  andrey55555 [ 05 июл 2012, 14:59 ]
Заголовок сообщения:  Re: Вызов из контроллера другого контроллера

Спасибо, "mamahtehok" за Ваш ответ!

Ситуация проясняется :D

В моем случае контроллеры, отвечающие за формирование элементов страницы не имеют самостоятельных адресов URL, поэтому, как я понял, они должны быть оформлены в виде хелперов. То есть как обычные классы для пхп, и лежать они должны кучей в application\classes\.

Скажите, а где можно настроить, чтобы хелперы kohana искала не только в application\classes\, а например и в application\classes\page\?
Такое можно сделать?

Страница 1 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/