Русскоязычный форум, посвященный фреймворку Kohana http://forum.kohanaframework.su/ |
|
Не могу разобраться с наследованием классов http://forum.kohanaframework.su/viewtopic.php?f=31&t=637 |
Страница 1 из 2 |
Автор: | nkl [ 15 май 2013, 05:16 ] |
Заголовок сообщения: | Не могу разобраться с наследованием классов |
Наконец-то, благодаря урокам Морковина я таки разобрался с тем, как сделать авторизацию на кохане. Но теперь возникает другая проблема... У меня есть контроллер Basic, который проверяет, авторизован пользователь или нет, он расширяет Controller_Template, вот его код: Код:
По логике, этот контроллер наследуют все остальные контроллеры. Кроме того, у меня есть 2 части приложения: административная и пользовательская. Я делаю базовый контроллер для админки, вот его код: Код:
Как вы видите, строка public $template = 'admin/basicview'; определяет базовый вид админки. Потому как базовые ВИДы админки и пользовательской части разные. По аналогии, делается и базовый контроллер пользовательской части: Код:
Но почему-то возникает ошибка Цитата: ErrorException [ Warning ]: Attempt to assign property of non-object APPPATH/classes/Controller/Admin/Basic.php [ 9 ] 4 5 public $template = 'admin/basicview'; 6 7 public function before() 8 { 9 $this->template->title = '1'; 10 $this->template->header = '1'; 11 $this->template->content = '1'; 12 $this->template->footer = '1'; 13 $this->template->styles = array('reset','style','admin_menu'); 14 $this->template->scripts = array('admin_menu'); APPPATH/classes/Controller/Admin/Basic.php [ 9 ] » Kohana_Core::error_handler(arguments) SYSPATH/classes/Kohana/Controller.php [ 69 ] » Controller_Admin_Basic->before() {PHP internal call} » Kohana_Controller->execute() SYSPATH/classes/Kohana/Request/Client/Internal.php [ 97 ] » ReflectionMethod->invoke(arguments) SYSPATH/classes/Kohana/Request/Client.php [ 114 ] » Kohana_Request_Client_Internal->execute_request(arguments) SYSPATH/classes/Kohana/Request.php [ 990 ] » Kohana_Request_Client->execute(arguments) DOCROOT/index.php [ 118 ] » Kohana_Request->execute() Как буд-то объекта $this->template не существует вовсе. Что я делаю не так? |
Автор: | nkl [ 15 май 2013, 05:42 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
Таки разобрался. Походу в самом начале нужно было ввести parent::before(); а не как у меня. Теперь код выглядит так: Базовый контроллер Basic.php: Код:
Базовый контроллер админки Controller_Admin_Basic: Код:
Видите что теперь написано parent::before(); и все работает! Ведать у Морковина старая версия KO разжевывается. А в этом уроке черным по белому написано: Цитата: Теперь самое интересное — специальный метод before(). Этот метод не нужно вызывать. Он запускается автоматически самым первым при обращении к классу, в котором он прописан или к классам, которые наследуют этот класс. Следующая строка parent::before(); необходима, чтобы метод before() класса-родителя Controller_Template не перетирался (а он там есть, будьте уверены, как есть он и в классе Controller).
|
Автор: | WinterSilence [ 15 май 2013, 11:44 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
сам то ты хоть понял почему нужно в данном случае parent::before(); в начале писать или опять методом тыка? В данном описании от твоего Морковина никаких ошибок нет, типичный пример полиформизма. кстати зачем тебе $session->set('auth_redirect', $_SERVER['REQUEST_URI']); ? |
Автор: | nkl [ 16 май 2013, 08:47 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
Вай молодец! Хороший вопрос задал. Заставляет мозгами пораскинуть. И честно говоря я это методом тыка допер, просто посмотрел как этот before() на нашем сайте делается. Может подскажешь, почему так работает, а как в первом случае (return parent::before(); в конце метода) нет? Позвольте предположить: метод before() как конструктор, вызывается автоматически, а следовательно, он выполняется "перетерев" before() из контроллера Basic и Template соответственно. Следовательно, before() от других классов не унаследован, а значит переменная $template в этом контексте ничего не значит. А если сказать БЕФОРУ, что перед тем как выполниться, нужно унаследовать родительские БЕФОРЫ, то переменной $template как раз и становиться объектом, через который можно обращаться к ВИДу. Так? Код:
А это устанавливает в переменную сессии auth_redirect, куда обращался юзверь, что бы потом, после авторизации его на это же место и вернуть. |
Автор: | WinterSilence [ 16 май 2013, 16:30 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
nkl> так, но гадать и тыкаться можно долго, быстрее посмотреть всю цепочку кода от родительского класса controller до твоего класса, чтобы понимать цепочку действий. пересмотри логику auth_redirect мне кажется ты не понимаешь, что делаешь. что произойдет если твой auth_redirect ведет на auth или на вызываемую страницу? |
Автор: | nkl [ 16 май 2013, 16:35 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
auth не от кого не наследуется, он сам по себе, поэтому в нем никаким образом значение переменной сессии auth_redirect не присваивается, а сразу же после того как отработал контроллер авторизации, auth_redirect удаляется. |
Автор: | WinterSilence [ 16 май 2013, 16:59 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
nkl> тогда ты еще пока не перестал быть, как ты выразился, быдлокодером т.к. данный код должен вызываться 1 раз в конкретном контроллере аутентификации, а не тащится по во всем контроллерам системы |
Автор: | nkl [ 17 май 2013, 00:22 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
А если так? Код:
|
Автор: | WinterSilence [ 17 май 2013, 01:25 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
nkl> ой болбес.. если продолжишь гадать и не думать головой, то я прекращу тебе подсказывать прекрати гадать постоянно, старайся всегда понять что ты пишешь и к каким результатам оно приводит. ладно практика контрольных вопросов с тобой работает, продолжим её) как сделать чтобы данный код выполнялся всего 1 раз на 1 странице сайта? |
Автор: | nkl [ 17 май 2013, 08:04 ] |
Заголовок сообщения: | Re: Не могу разобраться с наследованием классов |
Что то я не совсем понял. Мне нужно унаследовать этот класс Basic, всеми контроллерами, в которых мне нужно проверить, авторизован ли пользователь. Что тут не правильно? Алгоритм простейший. Авторизовался? -> Да -> ОК. Нет ->Тогда авторизуйся. А права доступа уже на уровне наследников проверять. Я тут на форуме фразу одну не понял, которую Вы высказали. Что значит инкапсулировать действие? |
Страница 1 из 2 | Часовой пояс: UTC + 4 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |