Разрабатывая новые и новые проекты мы замечаем, что большое количество кода приходится повторять из проекта в проект. Существует ряд типовых задач, с которыми программист сталкивается постоянно. Например валидация введенных пользователем данных с проверкой на правильный URL или email, предотвращение SQL-инъекций, ведение отладочных log-файлов. Конечно же каждый может решать эти типовые задачи по-своему, переносить из проекта в проект свои наработки, развивать свои наработки. Но обычно меня начинает смущать, что масса людей изо дня в день делает одну и ту же работу. Гораздо проще не изобретать велосипед, а воспользоваться готовыми наработками, которые уже кто-то сделал до вас. Таким образом мы приходим на путь использования сторонних библиотек или framework-ов (что более эффективно). Php-разработчики тоже на счастье имеют в своем распоряжении ряд php-framework-ов. Об одном из них и пойдет речь в этой ознакомительной статье. Он называется Kohana и представляет собой ответвление от проекта CodeIgniter.
Kohana построена так, чтобы порльзователь использовал MVC легко и непринужденно. Есть ряд моделей (они служат для обращения к БД), каждая из которых выполняет свои задачи, есть ряд view-файлов, которые представляют собой html-файлы с небольшими php-вставками для вывода информации и есть контроллеры,  которые обрабатывают данные, полученные от моделей, осуществляют необходимую логическую программу и подготавливают данные для view-файлов, которые в свою очередь задают вид страницы.

Но давайте сначала я опишу шаги установки Kohana. Для этого нам понадобится:

Установка состоит из следующих шагов:

  1. Создаем директорию сайта и настраиваем виртуальный хост
  2. Распаковываем файлы дистрибутива в эту директорию
  3. Производим настройки в файле application/config/config.php
    Основная настройка это здесь $config['site_domain'] = ”;
    Сюда можно вписать доменное имя или путь. Если не указывать,
    то доменное имя будет определено автоматически.
  4. example.htaccess переименовываем в .htaccess. Внутри файла
    исправьте RewriteBase /kohana/ на RewriteBase /
  5. Обеспечиваем необходимые права доступа для файлов. Выполните
    find . -type d -exec chmod 755 {} \;
    находясь в основной директории сайта (куда вы распаковали Kohana).
    А для папок application/logs и application/cache должны
    быть обеспечены права на запись.
  6. Вводим адрес вашего сайта в браузере. Вы увидите страницу с проверкой
    соответствия системным требованиям.
  7. Если все в порядке, то удаляем файл install.php
  8. Снова вводим адрес вашего сайта в браузере. Теперь вы видите страницу
    с примером и приветствием
  9. Для работы с БД скопируйте 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.
Теперь вы увидите такую страницу:
Результат работы с Model Kohanaphp
Согласно 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 может упростить вашу повседневную работу.

Tags: , ,

Comments are closed.