Разрабатывая новые и новые проекты мы замечаем, что большое количество кода приходится повторять из проекта в проект. Существует ряд типовых задач, с которыми программист сталкивается постоянно. Например валидация введенных пользователем данных с проверкой на правильный URL или email, предотвращение SQL-инъекций, ведение отладочных log-файлов. Конечно же каждый может решать эти типовые задачи по-своему, переносить из проекта в проект свои наработки, развивать свои наработки. Но обычно меня начинает смущать, что масса людей изо дня в день делает одну и ту же работу. Гораздо проще не изобретать велосипед, а воспользоваться готовыми наработками, которые уже кто-то сделал до вас. Таким образом мы приходим на путь использования сторонних библиотек или framework-ов (что более эффективно). Php-разработчики тоже на счастье имеют в своем распоряжении ряд php-framework-ов. Об одном из них и пойдет речь в этой ознакомительной статье. Он называется Kohana и представляет собой ответвление от проекта CodeIgniter.
Kohana построена так, чтобы порльзователь использовал MVC легко и непринужденно. Есть ряд моделей (они служат для обращения к БД), каждая из которых выполняет свои задачи, есть ряд view-файлов, которые представляют собой html-файлы с небольшими php-вставками для вывода информации и есть контроллеры, которые обрабатывают данные, полученные от моделей, осуществляют необходимую логическую программу и подготавливают данные для view-файлов, которые в свою очередь задают вид страницы.
Но давайте сначала я опишу шаги установки Kohana. Для этого нам понадобится:
- Дистрибутив Kohana на официальном сайте или здесь
- Apache c mod_rewrite и mod_php (Возможна работа с Nginx, Lighttpd и MS IIS)
- PHP version >= 5.2.3
- СУБД (MySql или PostgreSQL)
Установка состоит из следующих шагов:
- Создаем директорию сайта и настраиваем виртуальный хост
- Распаковываем файлы дистрибутива в эту директорию
- Производим настройки в файле application/config/config.php
Основная настройка это здесь$config['site_domain'] = ”;
Сюда можно вписать доменное имя или путь. Если не указывать,
то доменное имя будет определено автоматически. - example.htaccess переименовываем в .htaccess. Внутри файла
исправьте RewriteBase /kohana/ на RewriteBase / - Обеспечиваем необходимые права доступа для файлов. Выполните
находясь в основной директории сайта (куда вы распаковали Kohana).
find . -type d -exec chmod 755 {} \;
А для папок application/logs и application/cache должны
быть обеспечены права на запись. - Вводим адрес вашего сайта в браузере. Вы увидите страницу с проверкой
соответствия системным требованиям. - Если все в порядке, то удаляем файл install.php
- Снова вводим адрес вашего сайта в браузере. Теперь вы видите страницу
с примером и приветствием - Для работы с БД скопируйте system/config/database.php как application/config/database.php и настройте параметры соединения с БД в этом файле.
Итак посмотрим в папку application/controllers/examples.php. Там есть пара существующих контроллеров.
- examples.php
- welcome.php
Пока нас интересует первый из них. Это контроллер. Ниже приведен его урезанный вариант
class Examples_Controller extends Controller { /** * Displays a list of available examples */ function index() { // Get the methods that are only in this // class and not the parent class. $examples = array_diff ( get_class_methods(__CLASS__), get_class_methods(get_parent_class($this)) ); sort($examples); echo "<strong>Examples:</strong>\n"; echo "<ul>\n"; foreach ($examples as $method) { if ($method == __FUNCTION__) continue; echo '<li>'. html::anchor('examples/'. $method, $method)."</li>\n"; } echo "</ul>\n"; echo '<p>'.Kohana::lang('core.stats_footer')."</p>\n"; } function user_agent() { foreach (array('agent', 'browser', 'version') as $key) { echo $key.': '.Kohana::user_agent($key).'<br/>'."\n"; } echo "<br/><br/>\n"; echo 'done in {execution_time} seconds'; } }
Итак, это и есть контроллер в терминах MVC. Если мы введем в браузере адрес https://tests.com/examples (измените доменное имя на то, которое создавали для этого примера), то мы получим список примеров. Этот список генериуется в методе index(). Здесь первый принцип. Когда мы вводим в браузере адрес https://tests.com/examples, то фреймворк ищет в папке controllers файл exapmles.php, в этом файле класс Examples_Controller унаследованный от Controller (если не найдет, то выдаст ошибку, что страница не найдена) и, если больше ничего не указано, то ищет метод index() и выполняет его код. Если пользователь введет адрес https://tests.com/examples/user_agent, то будет выполнен код метода user_agent(). Так же через строку браузера можно в методы передавать параметры. Формат будет таков
https://mydomain.test/controller_name/method_name/param1/param2/param3,
где param1, param2 и param3 - значения передаваемых параметров. Это второй принцип.
Между делом замечу, что здесь мы видим различные возможности фреймворка Kohana, как, например, генерация кода ссылок (html::anchor), вывод информации об используемой памяти и времени работы (Kohana::lang(’core.stats_footer’)) и вывод информации о браузере (Kohana::user_agent).
Теперь познакомимся с видом. Для этого создадим в контроллере examples метод viewExample(). Код метода приведен ниже
1 2 3 4 5 6 | public function viewExample() { $view = new View('view_example'); $view->header = 'Test View'; $view->msg = 'This is test for view file'; $view->render(TRUE); } |
Далее в папке application/views создадим сам view-файл и назовем его view_example.php. Скопируем туда следующий код:
1 2 3 4 5 6 7 8 9 | <html> <head> <title><?=$header?></title> </head> <body> <h1><?=$header?></h1> <?=$msg?> </body> </html> |
Откройте в браузере следующий URL https://tests.com/examples/viewExample, где tests.com замените на доменное имя, которое вы создали. Вы должны увидеть страницу с нашими заголовками и текстом This is test for view file.
Теперь поясню, что здесь для чего. Во второй строке метода viewExample() контроллера examples идет подключение view-файла. Обратите внимание, что расширение php при подключении не указывается. Далее строками 3 и 4 мы передаем переменные во view-файл. И наконец строкой 5 выводим результат в браузер. Вы можете подключать сколько угодно view-файлов в любом методе контроллера, а так же вы можете подключать view-файлы в других view-файлах.
Рассмотрим код view_example.php. Как мы видим он представляет собой html-документ (согласно MVC) с небольшими php-вставками. В этих вставках в строках 3, 6 и 7 происходит как раз вывод переменных, которые были переданы из контроллера.
Теперь рассмотрим модель. Создайте, пожалуйста, тестовую БД следующим скриптом
-- -- База данных: `kohana_test` -- CREATE TABLE IF NOT EXISTS `persons` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `f_name` VARCHAR(15) COLLATE utf8_unicode_ci NOT NULL, `l_name` VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ; INSERT INTO `persons` (`id`, `f_name`, `l_name`) VALUES (1, 'John', 'Tester'), (2, 'Homer', 'Simpson'), (3, 'Igor', 'Telmenko');
Теперь код нашего метода контроллера examlpes надо перевести к такому виду:
1 2 3 4 5 6 7 8 9 10 11 | public function viewExample() { $view = new View('view_example'); $view->header = 'Test View'; $view->msg = 'This is test for view file'; $personModel = new Person_Model(); $persons = $personModel->getPersons(); $view->persons = $persons; $personWithId1 = $personModel->getPerson(1); $view->singlePerson = $personWithId1; $view->render(TRUE); } |
Создайте в папке application/models файл person.php. Это будет файл модели. Скопируйте туда следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php defined('SYSPATH') or die('No direct script access.'); class Person_Model extends Model { public function __construct() { parent::__construct(); $sql = "SET NAMES utf8"; $this->db->query($sql); } public function getPerson($id) { $sql = 'SELECT * FROM `persons` WHERE id = ? LIMIT 1'; $query = $this->db->query($sql, array($id)); return $query->current(); } public function getPersons() { $sql = 'SELECT * FROM `persons`'; $query = $this->db->query($sql); return $query->result_array(); } } ?> |
View-файл изменим следующий образом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <html> <head> <title><?=$header?></title> </head> <body> <h1><?=$header?></h1> <?=$msg?> <ul> <?foreach($persons as $person):?> <li> <? echo $person->f_name.' '.$person->l_name?> </li> <?endforeach;?> </ul> Person with id=1 is <? echo $singlePerson->f_name.' '.$singlePerson->l_name?> </body> </html> |
Не забудьте, что для работы данного примера у вас должны быть корректные настройки подключения к БД в файле application/config/database.php.
Снова вызовите адрес https://tests.com/examples/viewExample.
Теперь вы увидите такую страницу:
Согласно MVC всю работу с БД надо производить в модели. В функции viewExample() в строке 5 создается экземпляр модели. В строках 6-9 происходит обращение к методам модели и передача данных в файл вида.
Класс модели у нас описан в application/models/person.php. Как видно он наследуется от класса Model. Внутри методов модели операции с БД происходят через объект $this->db. Вопросительный знак в sql-запросе в строке 12 будет заменен переменной $id, которая передается в строке 13.
$query->current() - это ссылка на текущую строку выборки из БД, а $query->result_array() это массив строк результата выборки.
Как видно в 10 и 14 строках view-файла мы можем обращаться к каждому полю строки выборки через свойство объекта строки (стрелочка).
Вот так это работает. Теперь вы знаете как сделать в Kohana свой контроллер, свои вид и модель и заставить их взаимодействовать.
Загляните теперь в папку system/libraries. Там вы увидите файлы
- Controller.php
- Model.php
- View.php
От первого наследуются наши контроллеры, от второго модели. Третий нужен нам, чтобы подключать view-файлы.
В корневой папке есть application и system. В первой папке находятся ваши контроллеры, виды и модели, а во второй папке находятся системные (править в ней код не рекомендуется).
Вот мы и познакомились с этим замечательным php-framework-ом. В следующих статьях я буду знакомить вас с возможностями Kohanaphp шаг за шагом. Подпишитесь на новости и вы не пропустите новую информацию о том, как Kohana может упростить вашу повседневную работу.