Принцип работы Kohana (практика)
Доброго времени суток. Мы продолжаем изучать фреймворк Kohana. В прошлой статье мы рассмотрели принцип работы Kohana, а сегодня давайте применим эти знания на практике. В данной статье мы с Вами научимся изменять контроллер(controller), действия в контроллере(action), а также создавать собственные контроллеры и экшины, создадим модель и вид нашего приложения. Разберем на практике принцип MVC. Так, что кому интересно читаем дальше.
У нас уже есть установленный фреймворк, настроен виртуальный хост. Теперь, если в браузере мы введем адрес нашего сайта (в моем случае это http://books ), то увидим следующее.
Давайте разберемся, как это получилось. Из предыдущего поста Вы знаете, что если в запросе не указаны контроллер и экшен, то будут загружены установки по умолчанию (которые находятся в файле bootstrap.php). Откроем данный файл, который находиться в <Ваш сайт>/application/ и посмотрим какой Controller и Action по умолчанию там прописан. Данная информация находиться в секции Route:
Route::set('default', '(<controller>(/<action>(/<id>)))') ->defaults(array( 'controller' => 'welcome', 'action' => 'index', ));
И, так controller по умолчанию welcome, action по умолчанию index. Откроем файл данного контроллера. Тут следует уточнить, что для каждого контроллера в Kohana существует отдельный файл название, которого полностью совпадает с названием данного контроллера.
Данный файл находиться в <Ваш сайт>/application/classes/controller (дальше вместо <Ваш сайт> я буду ставить просто точку) и имеет название welcome.php. Рассмотрим его содержание:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Welcome extends Controller { public function action_index() { $this->response->body('hello, world!'); } } // End Welcome
Первая строка:
<?php defined('SYSPATH') or die('No direct script access.');
это защита от взлома нашего приложения.
А дальше идет обьявление нашего класса:
class Controller_Welcome extends Controller { public function action_index() { $this->response->body('hello, world!'); } } // End Welcome
Обратите внимание на принцип обьявления класса. Тут мы сталкиваемся с некоторым ограничением Kohana. Это ограничение необходимо для автоматической загрузки классов. Давайте подробно разберем обьявление класса в Kohana:
- Слово class — это служебное слово PHP
- Controller_Welcome — обязательно обратите внимание на регистр символов, данная запись говорит Kohana, что наш Контроллер находиться по адресу ./application/classes/controller и имеет название файла welcome.php. Так, например, если у нас будет обьявлен класс следующим образом:
Class Controller_Example_Hello extends Controller
то это будет указывать Kohana, что наш контроллер будет находиться по адресу ./application/classes/example и файл контроллера будет иметь название hello.php
- extends Controller — указывает, что наш класс унаследует все методы и свойства контроллера Controller, описание которого находиться по адресу /system/classes и файл называется controller
Создание контроллера в Kohana
Создадим свой контроллер и назовем его hello. Для этого:
- Создадим файл в ./application/classes/controller и назовем его hello.php
- Добавим в него следующий код:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller { public function action_index() { $this->response->body('Привет, это наш новый контроллер Hello'); } }
Обратите внимание на обьявление контроллера.
Сохраним файл, обязательно сохраняйте в кодировке UTF-8.
Проверим, в адресной строке введем наш адрес, в моем случае это http://books/index.php/hello и увидим следующее:
И, так наш контроллер сработал. Теперь давайте разберемся с action.
Создание action в Kohana
В нашем файле изменим код на следующий:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller { public function action_index() { $this->response->body('Привет, это наш новый контроллер Hello'); } public function action_test() { $this->response->body('обработан action test'); } }
Обратите внимание на обьявление функции:
public function action_test()
В начале идет слово action, а затем через нижнее подчеркивание название action.
Давайте проверим, что у нас получилось. В адресной строке введем наш адресс, в моем случае это http://books/index.php/hello/test и увидим следующее:
Передача параметра в action
Теперь давайте передадим нашему action test значение переменной. Для этого изменим код файла test.php следующим образом:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller { public function action_index() { $this->response->body('Привет, это наш новый контроллер Hello'); } public function action_test() { $name = $this->request->param('id'); $this->response->body('Привет, '.$name); } }
И в адресной строке введем адрес нашего сайта, в моем случае это http://books/index.php/hello/test/romchik. У нас должно получиться следующее:
Давайте рассмотрим данный адрес чуть подробнее:
- Адреса сайта (обязательно)
- Основного файла Kohana index.php (обязательно, настроив Kohana определенным образом, можно убрать). Как убрать index.php из адреса я расскажу в следующей статье посвященной настройкам Kohana.
- Названия контроллера (не обязательно)
- Название action (не обязательно)
- Параметр (не обязательно)
Но значение адреса можно изменить. Это делается с помощью роутов, о которых мы поговорим в отдельной статье.
Мы с Вами разобрались с контроллерами: как изменять и как создавать. Теперь согласно принципу MVC (Model-View-Controller), давайте создадим вид для нашего приложения и уже в него будем выводить данные, полученные из контроллера.
Создание вида в Kohana
Из предыдущих постов Вы уже знаете, что виды нашего приложения хранятся в папке ./application/views. Создадим в этой папке файл index.php следующего содержания:
<meta charset="utf-8"> <h1>База книг</h1> <hr> <?php echo $content; ?>
Теперь изменим наш контроллер hello следующим образом:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller_Template { public $template = 'index'; public function action_index() { $this->template->content = 'Главная страница'; } }
Немного поясним, что мы сделали:
- Теперь наш контроллер Hello наследует все свойства и методы от класса Template. Данный класс больше подходит для работы с видами.
- В строке
public $template = 'index';
Мы указываем вид по умолчанию index, т.к. мы создали вид index.php в папке ./application/views
- В action index мы строкой
$this->template->content = 'Главная страница';
передаем в наш вид переменную content со значением ‘главная страница’.
Теперь давайте посмотрим, что у нас получилось, введем адрес нашего сайта ( у меня http://books/hello) и у нас должно получиться следующее:
Теперь давайте при переходе в allbooks мы на месте переменной $content должны увидеть другой шаблон. Для этого изменим наш контроллер добавив к нему еще один action с названием allbooks:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller_Template { public $template = 'index'; public function action_index() { $this->template->content = 'Главная страница'; } public function action_allbooks() { $this->template->content = View::factory('allbooks'); } }
И в папке ./application/views создадим файл шаблона allbooks:
<table border="1"> <thead> <th>Название</th> <th>Автор</th> </thead> <tbody> <tr> <td>Книга_1</td> <td>Автор_1</td> </tr> <tr> <td>Книга_2</td> <td>Автор_2</td> </tr> </tbody> </table>
Теперь перейдем на наш сайт и вызовим action allbooks (у меня http://books/hello/allboks) и мы увидим:
Но это противоречит концепции MVC, за обработку данных должен отвечать Controller. Давайте это исправим. Изменим наш контроллер:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller_Template { public $template = 'index'; public function action_index() { $this->template->content = 'Главная страница'; } public function action_allbooks() { $books = array( 'Книга_1' => "Автор_1" , 'Книга_2' => "Автор_2", ); $this->template->content = View::factory('allbooks', array( 'books'=>$books,)); } }
Тут мы для передачи данных в шаблон мы использовали метод factory класса View, у данного метода вторым параметром передается массив данных в шаблон, название которого указывается в первом параметре.
И изменим шаблон allbooks:
<table border="1"> <thead> <th>Название</th> <th>Автор</th> </thead> <tbody> <?php foreach ($books as $book => $author) { ?> <tr> <td><?php echo $book?></td> <td><?php echo $author?></td> </tr> <?php }; ?> </tbody> </table>
Проверим, что получилось. Набрав адрес http://books/hello/allbooks я увидил:
тоже самое, но теперь данные в шаблон передаются из контроллера, что и соответствует концепции MVC.
Теперь у нас возникла другая проблема контроллер обрабатывает данные, согласно MVC, а мы данные формируем в контроллере. Мы будем следовать концепции MVC и согласно ей данные должны формироваться в модели. Давайте создадим модель.
Создание модели в Kohana
Все модели Kohana, которые мы создаем в нашем приложении находяться в ./application/classes/model. Создадим в данной папке модель books. Для этого создадим файл с названием books.php следующего содержания:
<?php defined('SYSPATH') or die('No direct script access.'); class Model_Books extends Model { public function all_books() { return array( 'Книга_1' => "Автор_1" , 'Книга_2' => "Автор_2", ); } }
Как видим класс в моделе обьявляется также, как и у контроллера. Единственное в моделях уже нет action.
Теперь изменим action allbooks у контроллера hello:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Hello extends Controller_Template { public $template = 'index'; public function action_index() { $this->template->content = 'Главная страница'; } public function action_allbooks() { $books = Model::factory('books')->all_books(); $this->template->content = View::factory('allbooks', array( 'books'=>$books,)); } }
В строке:
$books = Model::factory('books')->all_books();
мы вызываем метод factory класса Model в качестве парметра берем название нашей модели и у нашей модели вызываем метод all_books.
Теперь давайте проверим, что у нас получилось:
Мы видим, что все работает. Давайте проверим еще раз. Дописав к массиву в модели еще один элемент:
<?php defined('SYSPATH') or die('No direct script access.'); class Model_Books extends Model { public function all_books() { return array( 'Книга_1' => "Автор_1" , 'Книга_2' => "Автор_2", 'Книга_3' => "Автор_3",); } }
Проверим:
Видим, что у нас появился еще один элемент в таблице.
Теперь наше приложение полностью соответствует концепции MVC: данные формирует модель, контроллер обрабатывает эти данные, шаблон выводит результат.
Мы с Вами разобрали на практике основной принцип работы фреймворка Kohana, научились создавать шаблон, контроллер и модель.
В следующей статье мы поговорим о настройка фреймворка kohana. Так, что не пропускайте выхода новых постов подписавшись на RSS-рассылку данного блога. Вы также можете следить за мной в Twitter или Google+. Много информации по WEB-программированию найдете на странице в facebook.
[…] И если Вы внимательно читали, то я в статье “Принцип работы Kohana (практика)” в качестве примера обьявил […]