Как организовать бизнес-логику в проекте Kohana 3
Вопрос
Мне нужны советы, учебные пособия и ссылки о том, как настроить веб-приложение среднего размера с помощью Kohana 3.В прошлом я реализовал шаблоны MVC, но никогда не работал с «формализованной» структурой MVC, поэтому я все еще разбираюсь в терминологии - играю с базовыми примерами, создаю представления и шаблоны и так далее.
Я продвигаюсь довольно хорошо, но хочу создать реальный веб-проект (один из моих собственных, который я планирую уже довольно давно) в качестве объекта обучения.
Лучше всего я учусь на примерах, но документация на основе примеров сейчас немного скудна для Kohana 3 — они сами так говорят на сайте.Хотя я не беспокоюсь об изучении фреймворка по ходу работы, я хочу с самого начала убедиться, что база кода правильно структурирована, т.е.Контроллеры хорошо разделены, названы правильно и в соответствии со стандартами, и, что наиболее важно, бизнес-логика разделена на модели соответствующего размера.
По своей сути мое приложение можно описать как бизнес-каталог с набором функций поиска и листинга, а также областью входа для каждого владельца записи.О фактической административной базе данных уже позаботились.
Предположим, у меня уже есть весь API — список всех компаний, редактирование компании, список компаний по названию улицы, создание предложения для входа в систему как компания и т. д., и я просто ищу, как вписать эту функциональность в шаблон MVC и в структуру приложения Kohana, которую можно легко расширить.
Знаете ли вы реальные примеры приложений с «нагруженными базами данных», таких как каталоги, онлайн-сообщества...с зоной входа, созданной на Kohana 3, желательно с открытым исходным кодом, чтобы я мог взглянуть, как они это делают?
Существуют ли соглашения или лучшие практики о том, как структурировать расширяемую область входа для конечных пользователей в проекте Kohana, который может обрабатывать не только страницу бизнес-каталога, но и другие продукты на отдельных страницах?
Знаете ли вы какие-нибудь хорошие ресурсы по созданию сложных приложений с помощью Kohana?
Создавали ли вы что-то подобное и могли бы дать мне рекомендации по структуре проекта?
Награда
Я награждаю @antpaw, потому что он предоставил мне приложение Kohana с некоторой бизнес-логикой, которая дает мне множество примеров.Приветствуем @Pixel Developer за ваш отличный вклад – как это часто бывает, мне хотелось бы разделить награду!
Решение
я бы использовал модуль аутентификации, который поставляется с Kohana для входа в систему.Это даст вам таблицу ролей, в которой вы сможете настроить возможные параметры разрешений и позже связать их с пользователями.После этого вы можете проверить внутри __constructor() или action_function() каждого контроллера, имеет ли пользователь требуемую роль, например.с помощью функции ->has().Вам также следует использовать модуль ORM, это просто здорово, поскольку между таблицами существует множество связей.Также чрезвычайно полезным может оказаться метод __get() внутри объекта ORM.
Также довольно легко расширить функцию контроллера, установив для нового параметра значение NULL и проверив его в операторе if.напримервам нужна только одна функция для редактирования старой записи или добавления новой.
public funciton action_manage($id = NULL)
{
$entry = ORM::factory('entry', $id); // if id is null a new entry will be returned
}
Также важно структурировать представления по подпапкам, чтобы избежать беспорядка в каталоге представлений.
Другие советы
Здесь много вопросов, на которые нужно ответить, я постараюсь изо всех сил.
Знаете ли вы реальные примеры приложений с «нагруженными базами данных», таких как каталоги, онлайн-сообщества...с зоной входа в систему, созданной на Kohana 3, где я мог бы взглянуть, как они это делают?
Есть несколько примеров приложений.Вуди Гилк (основатель Kohana) опубликовал код на своем личном сайте github.Для области входа он назначает значение cookie.Kohana 3 / 2.4 подписывает файлы cookie, что делает их безопасными и устраняет необходимость в сеансах.Возможно, это не всем придется по вкусу, поэтому вы всегда можете использовать встроенную библиотеку аутентификации, которая использует как сеансы, так и файлы cookie.
Вот еще несколько проектов, которые могут вас заинтересовать:
Существуют ли соглашения или лучшие практики о том, как структурировать расширяемую область входа для конечных пользователей в проекте Kohana, который может обрабатывать не только страницу бизнес-каталога, но и другие продукты на отдельных страницах?
Если я правильно вас понимаю, вы хотите создать поле входа для каждой из этих страниц?С Kohana 3 это легко, поскольку мы можем воспользоваться преимуществами ЧАС в ХМВК.Сэм де Фрессьине написал статью, подробно описывающую все это, в блоге iBuilding Tech Blog. Масштабирование веб-приложений с помощью HMVC.
Затем вы можете выполнить внутренний запрос к контроллеру входа или действию и выгрузить ответ на страницу просмотра.
$login = Request::factory('login')->execute()->response;
$login теперь содержит форму входа, которую вы можете разместить где угодно.Возможно, вы захотите вернуть другой ответ, если запрос является внутренним, поэтому этот фрагмент кода может быть полезен:
if (Request::instance() !== $this->request)
{
print 'Internal called made with Request::factory';
}
Знаете ли вы какие-нибудь хорошие ресурсы по созданию сложных приложений с помощью Kohana?
Не будет документации, показывающей, как создавать сложные приложения.По мнению сообщества Kohana, вы являетесь разработчиком PHP и должны быть в состоянии решить эти проблемы самостоятельно.Если вы не можете, то вам не следует использовать Kohana.
Создавали ли вы что-то подобное и могли бы дать мне рекомендации по структуре проекта?
Как только вы поймете, как Kohana 3 находит файлы, все станет легко понять.
|- classes
|-- controller
|-- model
|- views
Например:
Controller_Mathew extends Controller
Будет искать файл с именем mathew.php
в:
classes/controller
Для указания более глубоких каталогов можно использовать символы подчеркивания.Пример:
Controller_Mathew_Davies extends Controller
будет искать файл с именем davies.php
в:
classes/controller/mathew/
Как видите, подчеркивания в имени контроллера действуют как разделители каталогов.Это справедливо для моделей и ванильных классов.