Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 14 ноя 2018, 23:32

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Уроки по созданию своей CMS
СообщениеДобавлено: 28 май 2013, 14:01 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Создание небольших проектов (блог или сайт-визитка) освещено довольно хорошо, поэтому решил начать цикл мини уроков по созданию больших проектов на базе Kohana.

Исходного кода будет не много: я хочу в первую очередь донести идею, иначе, как мне кажется, это приведет к бездумному копипасту :cry:. Уроки будут снабжаться схематическими\упрощенными исходниками, для иллюстрации описанного, но использовать их "как есть" скорее всего не получится. Результатом данных уроков станет работоспособная основа для Вашей CMS.

Основные моменты:
- Максимально возможное использование функционала и архитектуры Kohana (за основу взята последняя на данный момент версии 3.3).
- Упор на масштабируемость т.е. расчет на развитие\расширение системы: разграничение на приложения и модули.
- Ориентированность на ООП (абстрагирование, инкапсуляция, наследование и полиморфизм), использование шаблонов проектирования, прежде всего MVC и HMVC, а также Facade, Factory, Builder, Singleton, Observer.
- Безопасность: разграничение доступа, валидация\фильтрация данных, шифрование сессии и cookie, использование капчи, CSRF и меток(token).
- Использование шаблонизатора(на примере Smarty 3.1 или Fenom 1.3), позволяющего отделить прикладную логику и данные от представления в духе концепции MVC.

Если какие-то момент Вам не понятны, не расстраивайтесь и продолжайте читать, скорее всего ответы на них встретятся позднее!
Если всё же вопросы остались, то старайтесь задавать их в ЛС\ICQ, а не писать в самой теме. FAQ по актуальным вопросам будет добавляться к тексту уроков.

Уроки рассчитаны на людей, имеющих хотя бы небольшой опыт разработки проектов на основе Kohana 3.х. Это подразумевает, что Вы хорошо знакомы с OOП программированием и шаблонами проектирования.

Проект доступен по адресу https://github.com/WinterSilence/kohana-cms/

Список полезных материалов:
Конфигурирование Apache http://perishablepress.com/stupid-htaccess-tricks/
ООП в PHP http://www.php.net/manual/ru/language.oop5.php
Шаблоны проектирования http://ru.wikipedia.org/wiki/%D0%A8%D0% ... 0%B8%D1%8F
Kohana API http://kohanaframework.org/3.3/guide-api
Статьи по работе с Kohana:
http://kerkness.ca/kowiki/doku.php
http://kohana3.ru/
http://habrahabr.ru/search/?q=kohana
http://wadya.pp.ua/?s=Kohana
http://cyberapp.ru/category/php/kohana/
http://brotkin.ru/tag/kohana-3-3/

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Последний раз редактировалось WinterSilence 28 авг 2013, 09:53, всего редактировалось 7 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 28 май 2013, 14:02 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Урок 1. Базовая архитектура CMS

CMS будет состоять из следующих частей:
- Пользовательская(frontend), доступная посетителям сайта.
- Административная(backend), необходимая для управления контентом.
- Консольная(cli), для использования консольных приложений(автозапуск через crontab).

Наиболее логичным является размещение частей в соответствующих приложениях (application).
Базовый функционал, на котором строятся приложения, будет размешен в модуле common.
Независимые части кода, разместим в отдельных модулях: пагинатор(paginator), капча(captcha) и т.д.

Файловая структура частей CMS аналогична приложению application, входящему в дистрибутив Kohana.
В последующих статьях структура будет расширена и расписана более подробно, не забывайте добавлять новые каталоги и файлы!

Структура каталогов:
Код:
frontend/ // Общедоступная часть
   cache/
   classes/
   config/
   i18n/
   logs/
   messages/
   views/
   media/
   bootstrap.php // Персональный загрузчик frontend
   
backend/ // Админка
   ...

cli/ // консольные приложения
   cache/
   classes/
   config/
   i18n/
   logs/
   messages/
   bootstrap.php // Персональный загрузчик cli

modules/
   common/ // Общие файлы, ядро CMS
   auth/
   cache/
   ...

media/ // Публичный медиа контент (js, css, fonts)
   
system/ // Ядро Kohana

vendor/ // Сторонние библиотеки, используемые в нескольких приложениях\модулях
   smarty/       // Шаблонизатор
   swiftmailer/  // Почтовик
   ...

.htaccess     // Настройки HTTP-сервера Apache
index.php     // Точка входа приложения frontend
admin.php     // Точка входа приложения backend
cli.php       // Точка входа приложения cli
bootstrap.php // Обобщенный загрузчик, используемый во всех приложениях

Такая архитектура обеспечивает независимость приложений, что хорошо как с точки зрения масштабирования - изменения в одной части не повлияют на другие, так и безопастности - код изолирован, но при этом обеспечен доступ из backend'а к frontend'у.
Модуль common подключается во всех приложениях и содержит классы, отвечающие за ядро(основную логику работы) нашей системы, а также расширения(extends) системных классов и модулей. Таким образом мы избегаем излишнего повторения кода.
Все классы, явно не относящиеся к CMS, группируются в модули - это позволяет при необходимости легко заменять их на более функциональные.

.htaccess Основные моменты по настройке сервера:
Прямой доступ к служебным папкам и файлам закрыт по соображениям безопастности. Сервер настраивается таким образом, чтобы доступ к приложениям был только через специальные "точки входа": cli.php, admin.php, index.php. Таким образом, при вводе в браузере `http://site.ru/admin/product/list/` в точку входа `http://site.ru/admin.php` передается путь `/product/list/`, это приводит к вызову метода action_list() контроллера Controller_Page_Product `/backend/classes/Controller/Page/Product`. Используются ссылки в ЧПУ формате http://ru.wikipedia.org/wiki/%D0%A7%D0%9F%D0%A3_%28%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%29

Код:
# Включаем режим изменения ссылок
RewriteEngine On

# Корень сайта
RewriteBase /

# Не отображать системные файлы
<Files .*>
   Order Deny,Allow
   Deny From All
</Files>

# Защита важных директорий от прямого доступа
RewriteRule ^(?:frontend|backend|cli|modules|system|vendor)\b.* index.php/$0 [PT,L]

# Перенаправление в приложение cli для ссылок начинающихся на console/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^console/(.*) cli.php/$1 [PT,L]

# Перенаправление в приложение backend для ссылок начинающихся на admin/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^admin/(.*) admin.php/$1 [PT,L]

# Все остальные ссылки ведут в frontend
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]

Здесь приведен только основной код .htaccess, полную версию можно найти в исходниках нашей CMS (ссылка в конце).
Рекомендую взять за основу Вашего .htaccess вариант https://github.com/WinterSilence/YiiBoi ... /.htaccess
Естественно, его придется скорректировать с учетом выше описанного и удалить лишний код, для ускорения загрузки.
Грамотная настройка сервера позволит значительно ускорить работу приложений и избежать массы проблем как с безопасностью, так и с отображением контента.

index.php\admin.php\cli.php Точки входа(гейты) в приложение:
Параметры из второстепенных точек (admin.php\cli.php) передаются в основную (index.php), содержащую обобщенный код загрузки приложений.
Основная точка является модифицированным вариантом index.php, входящего в дистрибутив Kohana.

admin.php Пример точки входа(гейта) в приложение backend:
Код:
$application = 'backend'; // Название\директория приложения
$app_alias   = 'admin/';  // Aлиас(синоним) названия приложения, используется в ссылках
require_once 'index.php'; // Подключаем основной загрузчик

index.php Основные изменения:
Добавлено несколько констант и функций для минимизации и упрощения кода. Добавлены в начале т.к. используются повсеместно.
В зависимости от параметров точки входа выбирается загружаемое приложение.
Введены дополнительные константы для упрощения доступа к важным директориям.
Начальные настройки даты\времени, языка и сервера для удобства вынесены в config.php.
Загрузчик(bootstrap) разбит на две части: обобщенную(располагается в корне) и текущего приложения(находится в директории приложения).

Код:
/**
 * Короткие варианты системных констант
 */
define('DS',  DIRECTORY_SEPARATOR);
define('EOL', PHP_EOL);

/**
 * Конструкция empty() не позволяет использовать в качестве значения методы\функции,
 * кроме этого она не верно работает с объектами-массивами, например ArrayObject
 */
function is_empty($value)
{
   return (empty($value) OR ($value instanceof Countable AND count($value) == 0));
}
/**
 * Короткая версия для конструкций вида:
 * `if (is_null($var)) $var = $value;` и `if ( ! isset($var)) $var = $value;`
 */
function set_if_null( & $var, $value)
{
   return (is_null($var) ? ($var = $value) : $var);
}
/**
 * Короткая версия для конструкции `if (empty($var)) $var = $value;`
 */
function set_if_empty( & $var, $value)
{
   return (empty($var) ? ($var = $value) : $var);
}

// Задаем директорию приложения
$application = (isset($application) ? $application : 'frontend');
// Используется для определения текущего приложения в модулях
define('APP', $application);
// Алиас для использования в ссылках
define('APP_ALIAS', (isset($app_alias) ? $app_alias : '/'));

...

// Директория медиа файлов: js,css  и т.д.
$media = 'media';

if ( ! is_dir($media) AND is_dir(DOCROOT.$media))
   $media = DOCROOT.$media;

define('MEDIAPATH',  realpath($media).DS);

// Код для директории со сторонними библиотеками аналогичен коду для media:
$vendor = 'vendor';
...

...

// Обобщенный загрузчик для всех приложений CMS
require_once DOCROOT.'bootstrap'.EXT;
// Загрузчик самого приложения
require_once APPPATH.'bootstrap'.EXT;

...

// Код, относящийся к запуску через консоль, перенесен в точку входа cli.php
if (PHP_SAPI !== 'cli')
{
   echo Request::factory(TRUE, array(), FALSE)
      ->execute()
      ->send_headers(TRUE)
      ->body();
}

Такой подход позволяет минимизировать код, а также ускорить загрузку страниц т.е. уменьшить нагрузку на хост.

На этом первая часть заканчивается, в следующей речь пойдет о создании набора базовых контроллеров и немного о модуле common. ;)

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Последний раз редактировалось WinterSilence 28 авг 2013, 09:55, всего редактировалось 7 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 03 авг 2013, 19:38 
Не в сети
Зеленый

Зарегистрирован: 28 май 2012, 16:04
Сообщения: 4
на этом первая часть заканчивается, как в прочем и весь курс.
Де это и не мудрено далеко не всем хватает энтузиазма до конца, :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 03 авг 2013, 23:05 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
manchi интереса к теме нет, т.ч. не вижу смысла её продолжать, появятся люди напишу еще пару обзоров.

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 07 авг 2013, 02:32 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
WinterSilence ты не прав.
Люди всегда есть. И те кто не привык надо не надо что-либо комментировать, и те кто не регистрируется, а читает как гость. Так что это ты зря. Продолжай


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 08 авг 2013, 18:29 
Не в сети
Бывалый

Зарегистрирован: 14 июн 2013, 17:19
Сообщения: 82
Больше правда меня интересует техники программирования, чем написания CMS. Просто если бы я пользовался CMS, то оставался бы на Joomla и Modx. Здесь же нужно только сделать админку.

Так что если хочешь, продолжай, я послушаю лекции на примере создания крупного проекта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 09 авг 2013, 14:32 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Sergey ок! спс за поддердку!

arhont твой псевдо заумный бред меня достал честно говоря порядком, если не ясно значение аббревиатуры CMS, то просто закрой варежку.

ок, готовлю продолжение)

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 11 авг 2013, 14:45 
Не в сети
Бывалый

Зарегистрирован: 09 авг 2012, 13:17
Сообщения: 43
WinterSilence, видел твои наработки на гитхабе, модуль корзины взял себе для дальнейшего использования), правда еще только заглянул, подробно не смотрел. И репо с описанной структурой вроде встречал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 13 авг 2013, 18:28 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Урок 2. Базовые контроллеры

Начнем имеено с контроллеров потому, что большинство проектов из тех, что я видел, имеют проблему именно с ними. Весь их функционал собран в лучшем случае в одном базовом контроллере, а в худшем вообще дублируется в каждом контроллере. Как результат проблемы при модернизации и необходимость писать много рутинного кода.

Создадим для нашей CMS набор базовых контроллеров, размещенных в модуле common, содержащем общий для всех приложений функционал.
Они будут наследоваться контроллерами приложений, это обеспечит общую "базу" для всех частей системы.

Необходимо реализовать генерацию путей к файлам, связанных с контроллером (Виды, конфиги, переводы) для их авто загрузки.
Путь к файлу(или ИД записи в БД) можно создавать на основе имени класса-контроллера - Controller_Widget_News `/widget/news` или по данных запроса(request) - `$request->directory().'/'.$request->controller().'/'.$request->action()`.

Также стоит добавить вспомогательные параметры и методы-обёртки которые упростят процесс написания кода, например:
Код:
public function session($group = NULL)
{
   return Session::instance($group);
}

Они аналогичны методу redirect класса Kohana_Controller и не идут в разрез с концепцией MVC т.к. непосредственно в них работа с данными не производится.

Учесть все возможные нюансы слишком сложно, поэтому стоит принять ряд допущений, облегчающих работу, например:
- Пути и структура CMS аналогична структуре данных дистрибутива и урока 1 (и последующих уроков)
- Конфиги/Виды/переводы (пока что!) загружаются из файлов
- Контроллеры могут иметь персональные Виды, конфиги и переводы(i18n) по адресу: `директория/контроллер` (`widget/news`, `page/news` , 'ajax/news')
- Контроллеры страниц могут иметь дополнительные файлы Видов, конфигурации и перевода по адреcy: `директория/контроллер/экшен` (`page/news/list`, `page/news/add`)
- Модели могут иметь персональные конфиги, переводы(i18n) и сообщения(message) по адресу: `model/имя_модели`.
- Подключены модули Kohana: auth, cache, database, orm. А также ряд сторонних: assets, message, email и собственно сам common :) (ссылки на них будут позднее)
- Основные конфиг группы контроллеров: site(общие настройки), meta_tags, contacts(email, телефон, icq и т.д.), assets(js,css), breadcrumbs(навигационная цепочка), paginate(постраничная навигация)
- В последующих уроках список допущений может быть расширен или скорректирован

Список контроллеров, их назначение и функционал:
Controller_Basic extends Controller - Базовый
Наследуется остальными, поэтому логично добавить вначале аутентификацию\авторизацию т.к. если пользователь не пройдет проверку, то дальнейшее выполнение не имеет смысла.
Также стоит разместить здесь авто загрузку конфигурации контроллера.
Для удобства добавить параметры и методы-обертки для работы с данными запроса, сессией, кешем, конфигурацией и т.д.

Controller_Ajax extends Controller_Basic - AJAX запрос
Логично вначале проверять тип запроса(is_ajax) и данных ответа т.к. в случае ошибки, то дальнейшее выполнение не имеет смысла.
Нужно добавить HTTP заголовки(headers), чтобы не было проблем c результатом(отключить кеш, задать тип данных).
Желательно добавить авто конвертацию результата в нужный формат(html\json\xml).

Controller_Layout extends Controller_Basic - База для визуальных контроллеров
Нужно реализовать кещирование контента, при наличии кеша можно пропустить выполнение action и возможно before\after.
Виды(View) должны загружаться автоматически, кроме тех случаев, когда он задаются вручную.
При внешнем вызове (если он разрешен) результат "оборачиваем" в Вид(View) `layout/skeleton`(каркас html документа).
Т.к. на его основе строятся виджеты и страницы, использующие js\css, желательно подключить assets модуль для объединения и минимизации их контента.

Controller_Widget extends Controller_Layout - Виджет
Виджет — это небольшой информационный блок, размещенный в основном шаблоне страницы. Обычно он содержит данные или сервис другого сайта, например, новости, последние сообщения на форуме, случайный анекдот и т.д.
Отличия от Controller_Layout минимальны: используется только один action метод - action_index или его алиас - action.

Controller_Page extends Controller_Layout - Страница\Раздел
Использует 2 Вида: один содержит непосредственно контент страницы, а второй - шаблон, в который оборачивается контент. В данном шаблоне размещаются виджеты и сниппеты. Т.к. большинство страниц (а иногда и все) используют один и тот же шаблон, то его имя задается только вручную. Для frontend Я обычно использую 3 шаблона: для главной, для ошибок и общий - для всех остальных.
Сниппет — небольшой фрагмент html текста, пригодный для повторного использования. Они обычно используются для более лёгкой читаемости кода, который без их использования выглядит слишком перегруженными деталями, или для устранения повторения одного и того же общего участка кода.
Желательно сделать кеширование конфигурации, чтобы сразу загружать из кеша объединенный вариант вместо нескольких конфиг файлов.

https://github.com/WinterSilence/kohana ... roller/CMS

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Последний раз редактировалось WinterSilence 28 авг 2013, 09:52, всего редактировалось 6 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Уроки по созданию своей CMS
СообщениеДобавлено: 13 авг 2013, 18:30 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Прочёл по диогонали, но так и не встретил зачем кстати лого делать виджетом?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group