Принцип работы Kohana (практика)

Ромчик
1

Установка kohanaДоброго времени суток. Мы продолжаем изучать фреймворк Kohana. В прошлой статье мы рассмотрели принцип работы Kohana, а сегодня давайте применим эти знания на практике. В данной статье мы с Вами научимся изменять контроллер(controller), действия в контроллере(action), а также создавать собственные контроллеры и экшины, создадим модель и вид нашего приложения. Разберем на практике принцип MVC. Так, что кому интересно читаем дальше.

У нас уже есть установленный фреймворк, настроен виртуальный хост. Теперь, если в браузере мы введем адрес нашего сайта (в моем случае это http://books ), то увидим следующее.

Controller и action по умолчаниюДавайте разберемся, как это получилось. Из предыдущего поста Вы знаете, что если в запросе не указаны контроллер и экшен, то будут загружены установки по умолчанию (которые находятся в файле 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:

  1. Слово class — это служебное слово PHP
  2. Controller_Welcome — обязательно обратите внимание на регистр символов, данная запись говорит Kohana, что наш Контроллер находиться по адресу ./application/classes/controller и имеет название файла welcome.php. Так, например, если у нас будет обьявлен класс следующим образом:
Class Controller_Example_Hello extends Controller 

то это будет указывать Kohana, что наш контроллер будет находиться по адресу ./application/classes/example и файл контроллера будет иметь название hello.php

  1. extends Controller — указывает, что наш класс унаследует все методы и свойства контроллера Controller, описание которого находиться по адресу /system/classes и файл называется controller

Создание контроллера в Kohana

Создадим свой контроллер и назовем его hello. Для этого:

  1. Создадим файл в ./application/classes/controller и назовем его hello.php
  2. Добавим в него следующий код:
<?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 и увидим следующее:

Создание контроллера в KohanaИ, так наш контроллер сработал. Теперь давайте разберемся с 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 в KohanaПередача параметра в 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. У нас должно получиться следующее:

Передача параметра в actionДавайте рассмотрим данный адрес чуть подробнее:

Разбор URLНаш адрес состоит из:

  1. Адреса сайта (обязательно)
  2. Основного файла Kohana index.php (обязательно, настроив Kohana определенным образом, можно убрать). Как убрать index.php из адреса я расскажу в следующей статье посвященной настройкам Kohana.
  3. Названия контроллера (не обязательно)
  4. Название action (не обязательно)
  5. Параметр (не обязательно)

Но значение адреса можно изменить. Это делается с помощью роутов, о которых мы поговорим в отдельной статье.
Мы с Вами разобрались с контроллерами: как изменять и как создавать. Теперь согласно принципу 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 = 'Главная страница';
    }

}

Немного поясним, что мы сделали:

  1. Теперь наш контроллер Hello наследует все свойства и методы от класса Template. Данный класс больше подходит для работы с видами.
  2. В строке
 public $template = 'index';

Мы указываем вид по умолчанию index, т.к. мы создали вид index.php  в папке ./application/views

  1. В 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",);
    }
}

Проверим:

Создание модели в KohanaВидим, что у нас появился еще один элемент в таблице.
Теперь наше приложение полностью соответствует концепции MVC: данные формирует модель, контроллер обрабатывает эти данные, шаблон выводит результат.
Мы с Вами разобрали на практике основной принцип работы фреймворка Kohana, научились создавать шаблон, контроллер и модель.
В следующей статье мы поговорим о настройка фреймворка kohana. Так, что не пропускайте выхода новых постов подписавшись на RSS-рассылку данного блога. Вы также можете следить за мной в Twitter или Google+. Много информации по WEB-программированию найдете на странице в facebook.

Скачать исходники данного урока Вы можете отсюда или отсюда

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Роуты в kohana | Все о WEB программировании - 22.05.2012 в 15:18

    […] И если Вы внимательно читали, то я в статье “Принцип работы Kohana (практика)” в качестве примера обьявил […]

  • ©2012-2017 По всем вопросам обращайтесь через форму обратной связи

    Яндекс.Метрика