УРОК 12. МОДУЛИ ORM И АВТОРИЗАЦИИ В KOHANA

advertisement
УРОК 12. МОДУЛИ ORM И АВТОРИЗАЦИИ В
KOHANA
О чем урок
Сегодня мы, развивая тему работы с базами данных, познакомимся с модулем Kohana,
который имеет название ORM. Термин ORM существует в программировании уже давно,
расшифровывается он как «Object-relational mapping» или «Объектно-реляционное
отображение». ORM реализует давнюю мечту программистов, которые желали какимлибо образом автоматизировать работу с базой данных так, чтобы самим можно было
работать только с объектами программы. А задачи отображения объектов программы в
таблицы базы данных ложились бы на плечи отдельного специально разработанного
модуля. Такие программные модули или библиотеки и принято именовать ORM.
Грамотно применяя возможности модуля ORM, можно полностью избавить себя от
необходимости напрямую выполнять какие-либо SQL-запросы в базу данных.
Второй большой темой сегодняшнего урока станет модуль Авторизации Kohana. Сегодня
каждый второй интернет-ресурс имеет функционал по авторизации пользователей,
личные кабинеты и т.п. Организация авторизации пользователей сводится к решению
стандартного набора задач по организации сессий пользователей, хранению паролей,
работе с ролями и привилегиями (о которых шла речь в 9-м уроке). Хорошая новость в
том, что Kohana предлагает в качестве отдельного модуля подготовленное решение для
организации авторизации пользователей на сайте.
Модуль авторизации Kohana можно назвать базовым. Он требует доработки для
реализации сложной логики разграничений доступа, потребность в которой может
возникнуть на вашем ресурсе. Тем не менее, модуль снимает необходимость в решении
базовых задач по авторизации пользователей.
Модуль авторизации в своей работе опирается на использование модуля ORM, поэтому
сегодняшний урок начнем со знакомства именно с функциональностью ORM.
Смотрите видео:


ORM: [Урок_12_1.exe]
Авторизация: [Урок_12_2.exe]
Исходные коды примеров: [Урок_12_Исходники.rar]
1
Профессионал PHP @ Школа Программирования
Подключение модуля ORM
Для того, чтобы можно было использовать функционал ORM, в файле bootstrap.php нужно
раскомментировать строчку с подключением соответствующего модуля:
Kohana::modules(array(
...
'orm' => MODPATH.'orm',
...
));
Настройка
Использование функционала модуля ORM осуществляется через наследование классами
моделей (в терминологии MVC) класса с названием ORM. То есть для того, чтобы ваши
модели могли использовать возможности ORM, их объявление должно выглядеть
следующим образом:
class Model_User extends ORM
{
...
}
Следующие свойства используются для настройки каждой модели:
Тип
Название
Описание
Значение по умолчанию
string
_table_name
Используемая таблица БД
string
_db
Название БД
default
string
_primary_key
Поле - первичный ключ
id
string
_primary_val
Титульное поле
name
Обратите внимание, что все параметры кроме _table_name имеют значения по умолчанию.
Но в случае, если пользователь явно не указывает значение поля _table_name, оно
формируется на основе названия класса модели. Так например, для класса Model_User
значение поля _table_name по умолчанию будет равно users. Формирование значения
происходит путем добавления буквы «s» к концу названия модели (подразумевается
значащая подстрока без префикса «Model_»).
Поле _table_name определяет таблицу в базе данных, на основе которой будет построена
модель. То есть поля класса модели будут соответствовать колонкам указанной таблицы.
2
Профессионал PHP @ Школа Программирования
Поле _db определяет алиас базы данных, с которой будет происходить взаимодействие в
ходе работы с экземплярами класса модели. Допустимые значения этого поля
определяется в настройках модуля работы с базами данных, о котором шла речь на
предыдущем уроке.
Поле _primary_key определяет первыичный ключ в таблицу _table_name.
И, наконец, поле _primary_val – это просто титульное поле таблицы, которое не имеет
для нас большого интереса.
Основные возможности ORM
Настроив ORM модель на определенную таблицу, впредь мы можем оперировать только с
экземплярами модели, не волнуясь о представлении информации в БД. Всю работу по
получению, изменению, сохранению данных в БД берет на себя модуль ORM.
Создание записи
Создать ORM модель можно двумя способами:
// Обращение к статическому методу factory класса ORM
// В этом случае нам необходимо указать название модели
// Обратите внимание, что под названием модели понимается
// не полное название класса модели, а только значащая его часть
$user = ORM::factory('user');
// Другой способ создание модели –
// обычный вызов конструктора класса модели.
$user = new Model_User();
Если же нам нужно не просто создать пустой экземпляр модели, а загрузить в него данные
конкретной записи из базы данных, нужно указать первичный ключ этой записи:
// Загрузка записи с id = 5
$user = ORM::factory('user', 5);
3
Профессионал PHP @ Школа Программирования
Выборка записей из БД
ORM поддерживает большинство методов класса DB, описанных на предыдущем уроке,
для выборки записей из таблицы БД.
// Извлекаем первого активного пользователя по имени Bob
$user = ORM::factory('user')
->where('active', '=', TRUE)
->where('name', '=', 'Bob')
->find();
// Ищем всех активных пользователей по имени Bob
$users = ORM::factory('user')
->where('active', '=', TRUE)
->where('name', '=', 'Bob')
->find_all();
Функция find_all возвращает массив объектов.
Изменение свойств модели
Как было сказано выше, свойства модели соответствуют колонкам таблицы, к которой она
привязана. Таким образом, для изменения значений свойств модели к ним нужно
обращаться как обычным полям объекта.
$user = ORM::factory('user', 5);
// Выводит имя пользователя
echo $user->name;
// Изменяет имя пользователя
$user->name = 'Bob';
Сохранение записей
Синхронизация с БД и сохранение установленных значений полей модели происходит
после вызова метода save.
// Создаем запись
$user = ORM::factory('user');
$user->name = 'New user';
// в таблицу будет добавлена новая запись
$user->save();
4
Профессионал PHP @ Школа Программирования
// Редактируем запись
$user = ORM::factory('user', 5);
$user->name = 'User 2';
// у записи с id = 5 будет обновлено значение в колонке name
$user->save();
Удаление записей
Для удаления записей используется метод delete.
Расширенные возможности модуля ORM
На манипуляции полями класса возможности модуля ORM не заканчиваются. Часто
встречаются ситуации, когда объекты, которыми мы оперируем в программе, как-то
связаны между собой. Теория реляционных баз данных выделяет три основные вида
связи: один-к-одному, один-ко-многим и много-ко-многим. Каждый из этих видов связей
можно формализовать в модели ORM Kohana с помощью переопределения специальных
полей модели. Кроме того, также с помощью переопределения специальных полей модели
можно ограничить допустимые значения различных свойств модели (например,
необходимо, чтобы длина поля name всегда была не менее 2-х символов и т.п.).
Подробная информация по возможностям модуля ORM представлена в видеоуроке. Там
же вы сможете найти примеры использования функций модуля ORM.
Подключение модуля авторизации
Для того, чтобы можно было использовать функционал модуля Авторизации, в файле
bootstrap.php нужно раскомментировать строчку с подключением соответствующего
модуля:
Kohana::modules(array(
'auth' => MODPATH.'auth',
...
));
// Basic authentication
5
Профессионал PHP @ Школа Программирования
Вам также потребуется создать в базе данных ряд таблиц, которые будут использоваться
модулем авторизации. Скрипт для создания таблиц можно найти в папке с файлами
модуля авторизации: <папка_Kohana>\modules\auth\ mysql.sql
После выполнения этого SQL-скрипта в базе данных появятся следующие таблицы:




users – для хранения данных учетных записей пользователей
user_tokens – для хранения сохраненных сессий пользователей
roles – для хранения ролей, существующих в системе
roles_users – для формализации связей между ролями и пользователями системы
Работа с функциями модуля авторизации
Для работы с функциями авторизации используется экземпляр класса авторизации,
который мы можем получить следующим образом:
$auth_instance = Auth::instance();
Методы класса авторизации
Auth::instance()->login($username, $password, $remember)
Функция, которая проверяет возможность входа пользователя на сайт c логином
$username и паролем $password. Параметр $remember служит для того, чтобы система
запомнила пользователя, и ему не нужно было повторно вводить данные при
последующих заходах на сайт.
Auth::instance()->logout()
Функция logout используется для завершения сессии пользователя.
Auth::instance()->logged_in('my_role')
6
Профессионал PHP @ Школа Программирования
Функция logged_in проверяет, авторизован ли текущий пользователь. Единственный
необязательный параметр функции позволяет задавать название роли, которую должен
иметь пользователь.
Auth::instance()->auto_login()
Функция auto_login позволяет автоматически авторизовываться пользователю в рамках
одной сессии.
Auth::instance()->force_login($username)
Функция force_login производит принудительную авторизацию без пароля, что может
быть полезным, например, при реализации механизма приглашений по «инвайтам»
(специальным ссылкам).
Расширенные возможности модуля Авторизации
Для регистрации новых пользователей или управления ролями используется обычный
механизм работы с ORM-моделями User и Role. Подробнее об этом рассказано в
видеоуроке.
Ссылки
Документация Kohana по модулю ORM(на русском):
http://kohanaframework.org/guide/tutorials.orm
Домашнее задание
Необходимо перенести сайт на платформу Kohana вместе с использованием ORM и
модуля Авторизации.
7
Профессионал PHP @ Школа Программирования
Download