пятница, 8 апреля 2011 г.

Знакомство с W framework'ом

Вступление

Для начала нужно скачать и распаковать W framework в одну из папок на web сервере, скачать framework можно здесь или здесь. Я framework буду располагать в папку, доступную по адресу http://localhost/wframework/ в случае локального web сервера, на удаленном(реальном) web сервере аналогично - framework помещаем в папку, доступную по адресу http://mysite.com/.

В данной стать рассматривается W framework версии - 0.3.0.

Далее, W framework имеет следующий структуру папок и файлов:
  • applications/ - содержит все пользовательские и системные экшены;
  • engine-client/ - содержит клиентскую часть frameworka, которая представлена в виде javascript-плагинов;
  • engine-server/ - содержит серверную часть frameworka, которая представлена в виде php-классов;
  • projects/ - содержит все проекты которые работают на содержимом папок engine-client/, engine-server/ и пользовательском коде, который хранится в папке applications/ в виде экшенов;
  • index.php - php-файл который обрабатывает все запросы W frameworka;
  • index.js.php - php-файл, генерирующий необходимый js-код для работы W frameworka;
  • w.htaccess - переименованный файл конфигурации apacha;
  • LICENSE - файл с текстом лицензии, рекомендуется к ознакомлению;
  • README - краткое описание W frameworka;

    Рекомендуемые права доступа на папки и файлы:
    • applications/     0755;
    • engine-client/    0755;
    • engine-server/   0755;
    • projects/            0777;
    • index.php          0644;
    • index.js.php      0644;
    • ./                        0777;
      Стоит отметить, что имена файлов и папок могут быть абсолютно произвольны, название папок и некоторых файлов нужно задавать в конфигурационных файлах W frameworka. Далее я опишу подробней содержимое файлов и папок frameworka, начну с самого простого, папки engine-server/.

      Также хотелось упомянуть что W framework рассчитан в первую очередь на программиста, хорошо владеющего языками программирования PHP и JavaScript!

      Папка engine-server/

      Папка engine-server/ - содержит php-классы, которые обеспечивают работу самого frameworka и генерация, обработку и передачу данных клиенту в удобном для последнего виде. Классы могут находится в произвольных папках, тут нет ничего особенного, единственное - это правила именования классов - [тип класса(.)имя класса(.)расширение файла], например - abstract.MyClass.php. Также стоит упомянуть, что встроенному авто загрузчику php классов, необходимо что б имя класса совпадало с именем класса в названии файла с учетом регистра.

      Файл index.php

      Файл index.php является базовым файлом frameworka и к нему по умолчанию адресуются все запросы. Далее, файл имеет ряд php констант которые определяют некоторые параметры W frameworka и пути, названия системных папок.
      • D - содержит разделитель для каталогов в путях к папкам или файлам, определяется автоматически, в зависимости от платформы;
      • SD - ...;
      • AP - содержит абсолютный путь к директории, содержащей текущий файл;
      • CHAR - содержит название кодировки, которое используется при отдаче контента клиенту;
      • ENGINE - содержит название(путь к) папки(е), где располагаются классы серверной части frameworka, например ../engine-server, относительно текущей папки;
      • CENGINE - содержит название(путь к) папки(е), где располагаются js-файлы клиентской части frameworka, например ../engine-client, относительно текущей папки, рекомендуется не менять!;
      • APP - содержит название(путь к) папки(е), где располагаются пользовательские экшены frameworka, например ../applications, относительно текущей папки, рекомендуется не подымать выше текущей корневой директории, так как содержит статические файлы!;
      • PRJ - содержит название(путь к) папки(е), где располагаются шаблоны страниц, файлы конфигурации, лог-файлы, какие либо статические файлы и файлы некоторых систем кэширония frameworka, например ../projects, относительно текущей папки, рекомендуется не подымать выше текущей корневой директории, так как содержит статические файлы!;
      • ROOT - произвольная константа, может использоваться для защиты некоторых php-файлов от прямого исполнения;
      • PROJECT - содержит название текущего проекта. В данном случае используется авто определение название текущего проекта, название текущего проекта выделяется из ссылки http(s)-запроса, по умолчанию это содержимое переменной - $_GET['PRJ'], если такая переменная не существует, проектом по умолчанию является проект - "project1";
      Далее, я напишу о том что же далее происходит в файле index.php, на первый взгляд код возможно Вам покажется непонятным но самом деле все происходит следующим образом:
      Некой переменной - $obj присваивается экземпляр класса Prototype(в конструктор класса Prototype передается многомерный ассоциативный массив с произвольными значениями, это тонкости работы php), переменная $obj - является объектом и благодаря реализации php интерфейса ArrayAccess, можно динамически создавать произвольные свойства объекта, хранящемуся в переменной $obj. Далее $obj присваиваем экземпляры необходимых классов, каждый класс который присваивается произвольному свойству $obj должен наследовать класс Object, который обеспечивает передачу ссылки на глобального объекта, который хранится в переменной $obj и доступ к к персональным настройкам каждого класса(также может быть получен доступ и к настройкам других классов), которые хранятся в файле config.php, подробнее про этот файл в одной из следующих статей. Перед присваивание системных и пользовательских классов переменной $obj, в переменную $obj['settings'](по умолчанию) - присваиваем содержимое файла config.php. Файл config.php обычно хранится в папке текущего проекта, и путь к ниму определен в файле index.php. В итоге получается своеобразное объектное дерево,  что-то DOM-дерева в браузерах, к которому есть доступ из JavaScript.

      Достоинствами такого подхода является: вездесущая работа с объектами, что позволяет полностью забыть о статических методах и свойствах. У Вас может возникнуть еще один вопрос, зачем нужен выше написанный абзац? Приведу пример для пояснения: Вы написали сайт, где все данные хранятся БД - MySQL, но вот сложилась такая ситуация, нужно сменить БД на PostgreSQL. Дело в том что в W frameworke нет такого понятий как драйвер БД, модуль, плагин, а экшены вообще предполагают наличие кода написанного процедурным(подходом, стилем) и единственным методом, с помощью которого можно сменить класс для работы с другой БД - является работа с классом от другой БД. Как это выглядит на практике - экземпляр объекта для работы с БД хранится в переменной, для наглядности приведу строку кода - $obj['storage']['db'] = new DBQueryMySQLi($obj); заменяем следующей строкой кода - $obj['storage']['db'] = new DBQueryPostgreSQL($obj);, так же стоит заметить, что классы DBQueryMySQLi и DBQueryPostgreSQL должны наследовать один интерфейс, в W frameworke - это абстрактный класс DBQuery, аналогично можно поступить и с любым другим классом в frameworke. Еще один пример: нужно работать с двумя БД одновременно. Код будет иметь следующий вид: $obj['storage']['db'] = new DBQueryMySQLi($obj);
      $obj['storage']['db1'] = new DBQueryMySQLi1($obj);
      , класс DBQueryMySQLi1 имеет следующий вид - class DBQueryMySQLi1 extends DBQueryMySQLi {}, следует так же отметить, что Вам в файле config.php придется написать еще одну конфигурацию к классу DBQueryMySQLi1, с другими параметрами, так будет обеспечиться работа с 2 БД.

      Файл index.js.php

      Файл index.js.php по своей структуре похож на файл index.php, но в отличии от первого выполняет другую роль, его роль заключается в генерация JavaScript файла, который содержит необходимые настройки, контроллер и в процессе работы js-программы подгружает необходимые w-плагины, написанные на JavaScript, пользовательский js-код и файлы локализации. Этот генерируемый клиентский конфигурационный файл составляется из следующих файлов: index.js - содержит первичные настройки клиентской части frameworka, так же является шаблоном, в который включается содержимое файлов config.js(располагается в папке с текущим проектом) и контроллера(генерируется динамически в файле index.js.php классом CController). Описание этих файлов Вы найдете в одной из следующих статей.

      Так же стоит упомянуть, что такое контроллер, контроллер - это абстрактное понятие, по другому его можно назвать пространством имени(namespace), группирует произвольный набор экшенов по определенным признаком, этим признаком является какая нибудь определенная страница, в разных контроллерах экшены могут повторятся. Например: страница home - контроллер также назовем home, состоит из экшенов head, left, body, foot; а страница catalog - контроллер соответственно cat состоит из head, cat, left, foot.

      Папка engine-client/

      Папка engine-client/ содержит файлы с js-кодом, в предыдущих версия использовалась библиотека jQuery, но в текущей версии я решил отказаться от использования библиотеки jQuery, так как много кто из программистов использует и другие JavaScript библиотеки. В результате я написал JavaScript библиотеку w, так же это является своего рода платформой для создания w-плагинов. w-плагины именуются следующим образом: [w(.)имя плагина(.)расширение файла], например - w.ajax.js. Сама библиотека очень схожа с библиотекой jQuery и именуется следующим образом - w.js.

      Папка applications/

      Папка applications/ содержит экшены, которые доступны в любом проекте, то есть один и тот же экшен можна использовать в нескольких проектах. Каждый экшен располагается в отдельной папке, и я рекомендую именовать экшены следующим образом - [имя проекта(.)тип экшена(.)имя экшена], тут надо пояснить тип экшена - экшены могут быть двух типов, те которые обрабатывают данные(set) и те которые возвращают данные(get), например: project.get.action1 или project.set.actionX. Далее, в папке с экшенов обязательно должен находится файл настроек экшена, название этого файла задается в файле config.php, который располагается в текущем проекте, по умолчанию данный файл называется sett.php. Файл sett.php имеет ряд параметров, которые более подробно будут рассмотрены в одной из следующих статей, среди которых есть такие параметры: model - php-файл который должен возвращать какие либо данные клиенту; view - js-файл, задумывался как файл отвечающий за вид, а вышел клиентский контроллер; l10n - js-файл который отвечает за локализацию проекта, локализация web приложений написанных на W frameworke возможна только на клиенте. Подробнее об этом всем в одной из следующих статей.

      Папка projects/

      Папка projects/ проекты, которые работаю на текущем экземпляре W frameworkа. Каждый проект располагается в отдельной папке и может иметь любое название, с названиями желательно без фанатизма, права на папку с проектом рекомендуется ставить - 0777, так как в эту папку могут записываться(в зависимости от настроек) некоторые системные данные или результаты кэширования, которые имеют непосредственное отношение к текущему проекту. В папку проекта рекомендуется складывать все файлы относящиеся к текущему проекту и канешно же наиболее часто упоминаемый файл config.php. Подробнее о содержимом(при настройках используемых мною, автором), будет написано в одной из следующих статей.

      Заключение

      Так же хотел упомянуть,  папка ./ должна иметь права 0777 потому что в ней могут быть созданы некоторые временные папки, согласно настроек по умолчание, а именно папки для хранения сессий. Дело в том что стандартная сессия - полная хрень, используется альтернативная файловая сессия, которая создает временную папку для хранения файлов в корневой директории.

      Так же если Вы создаете готовое web-приложение на W frameworkе, и Вашим сервером является apache2, рекомендуется раскомментировать файл w.htaccess, то есть переименовать его в .htaccess, если же Вы используете какой либо другой web-сервер, то настоятельно рекомендуется применить какой либо другой способ для защиты php-файлов от прямого исполнения.

      Комментариев нет:

      Отправить комментарий