Тема: mooFrame
Показать сообщение отдельно
Старый 21.08.2011, 01:46   #1
shybovycha
ПроЭктировщик
 
Аватар для shybovycha
 
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений
(для 33 пользователей)
mooFrame

Доброго времени суток, уважаемые!

По известным причинам (по большей части - Magento и фриланс) написал фреймворк на похапэ (блин, как последний школьник! (да простят меня последние)).

В чем же преимущество да и вообще уместность данного средства? mooFrame - прост, как дубина, но при этом достаточен для написания приложений чуть быстрее, нежели на голом похапэ или при использовании различных фреймворков вроде Magento, CodeIgniter, Cake PHP и иже для людей, не желающих в них разбираться (к последним я сам и отношусь - далее - подробнее).

Как-то давно; очень давно; очень-очень давно мне предстояло написать очередной сайт. С нуля и на похапэ (выбора хостинга у меня небыло). Поглядел на один фреймворк, поглядел на второй - ни один не радовал отсутствием необходимости разбираться менее часа. И тогда я написал сайт на "голом" похапэ, проект завалился, мне не заплатили, в общем все было плохо. Но не так давно я увидел Magento и по сей день с ним работаю. Если быть точным, то дорабатываю рашпилем известного калибра. Но как же радует глаз картина, когда любая страничка, практически статического контента содержанием грузится минуту а то и две!.. И вот тогда-то мне в голову начали заползать мыслишки навроде "надо сделать свое, теплое да уютное сЪредство". Прошло несколько недель и наконец я закоммитил на гитхаб ветку под названием "Alpha" (и даже гордо ей логотип прилепил, по-быстрому врезанный в Gimp'е под конец рабочего дня).

В чем же соль сего эпического творения? Ну вот создаете, к примеру, вы приложение на том же Cake PHP или Code Igniter. Что вы первым делом пишете из кода? Верно, что-то вроде `class MooController extends FooFrameworkControllerAbstract...`. А вот контора, которая вас попросила сделать ей сайт, сказала, что окромясь страничек "контакты", "о нас", "прайс-лист" да "главная" им ничего и не нужно. И вот для таких случаев у меня в голове ползало мыслишко "А зачем обязательно иметь класс для одностраничного контроллера?". И таким образом и появилось два правила у mooFrame: "если в файле контроллера есть класс - хорошо. Ну а если нету - не вопрос! Тогда мы просто выполним код этого файла!" и "не нужно ничего наследовать! Достаточно уже иметь обычный класс!".

Следующим нововведением стала система рендеринга. Дело в том, что в Magento, дабы вывести надпись "Hello, World!", вам необходимо создать блок, определить его в XML-файле, создать в нужном месте темплейт, унаследовать класс блока от Mage_Core_Block_Template (или как-то так) и в тимплейте вывести надпись любым доступным методом. Вот у меня и возникло теплое такое воспоминание о тех временах, когда я баловался RoR. И был произведен на свет класс Renderer с двумя методами (идентичными с виду) - render и partial. Оба работают совершенно одинаково (пока) и рисуют указанный файл с указанными параметрами (которые не нужно передавать из класса блока в темплейт посредством довольно-таки странного средства как "реестр Magento"). Но в отличие от моего стажерского подобия фреймворка, равно как и в отличие от RoR, в mooFrame не будет рендериться файл с именем вызванного Action или Controller - здесь вы сами хозяин того, что вы рендерите, а что - нет.

Связующим звеном стал роутер - класс, который принимает запросы пользователя/браузера и передает управление конкретному приложению, контроллеру или Action'у. В DocumentRoot сервера, по правилам mooFrame (по большей части из соображений безопасности) должен находиться лишь один файл - index.php, который передает управление роутеру в две строки кода. Роутер, в свою очередь, рассматривает запрос пользователя и переходит к выполнению одного из двух действий: выдаче содержимого файла и заголовка с его META-info или же поиску необходимого приложения или контроллера/действия (повторюсь, в mooFrame контроллер без класса - это то же, что и контроллер без действий - достаточная единица для передачи управления).

Стоит отметить и "множественность приложений" mooFrame: вы можете иметь несколько приложений с множеством своих собственных контроллеров. Указав в настройках орутинга конкретного приложения, на какие из запросов пользователя и как должно откликаться ваше приложение, вы можете запустить цепочку контроллеров/действий. Причиной сего стала схема роутинга Magento: дабы реализовать подобное у них (разработчиков Magento) есть два пути - определить роутинг "хардкодом" - явно указав, на какие запросы какой контроллер/блок будет вызван или же создав класс-listener (есть некоторое сходство с Java, как я понял) и "слушать" события, которые происходят. Проблемма лишь в том, что далеко не всегда будет "слышен" сигнал о выполнении какого-либо действия.

Последней плюшкой которую я отмечу в данном посте (по крайней мере - последняя, которую я сейчас способен вспомнить и описать) будет работа с базами данных. Для этого во фреймворке предназначен один класс с тремя методами - connect (соединяется с СУБД и возвращает локальное, уникальное, независимое имя соединения, которое и должно использоваться в двух других методах), query (выполняет запрос к указанному именем соединению; в запросе запрещено использовать строки в "чистом" виде - что-либо, указанное меж кавычек одинарных или двойных будет завершать работу метода) и forceQuery (в котором эти самые строки и разрешены). Все хапросы возвращают стандартные массивы стандартных хешей, у которых ключ - имя столбца таблицы. Работа с БД возложена на PDO. Изврат со строками был создан во избежание SQL injections. PDO - во избежание труда. Конечно же, Active Record - привлекательный, весьма даже привлекательный паттерн, но Magento с его реализацией оного моментально отбросила всякое желание реализовывать любые абстракции и модели для БД.

На этом пока закончу описание mooFrame. Детали по установке на Apache и исходные коды можно взять на GitHub.

В данный момент идет бурное обдумывание вопросов реализации модульности ядра, системмы и Store расширений и тестирования системмы (папочку test пока не глядите - файлы там очень уж out-of-date).

Из требований у mooFrame:
  • сервер с поддержкой перенаправления ВСЕХ запросов на index.php
  • PHP 5.1/5.2 и выше
  • PDO
  • (как оказалось) доступ к каталогу одного с DocumentRoot уровня - для размещения всех директорий фреймворка (окромясь www/, index.php откуда должен быть в DocumentRoot, а core/, app/, log/ [права у него должны быть равны a+w] и media/ - уровнем выше от index.php)
  • прямые руки (это - критично важно, как показывает практика!)
Буду крайне благодарен за найденные баги, пожелания, дельные советы, критику и опробывание mooFrame в действии.

На этом пока все. Всем (и себе - в том числе) желаю спокойной ночи.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (21.08.2011)