Архив за год: 2008

yii framework

На днях прочитал заметку о фреймворке yii.
Решил подробнее с ним ознакомтся.
Сразу отмечу никаких реальных приложений (за исключением hello world) я на нем не писал (да и не успел бы…так как узнал о его существовании совсем недавно)….
Так же сразу оговорюсь…до этого момента я имел дело лишь с CI и совсем немного с Kohana, так что сравнивать кроме как с этими двума фреймворками — больше не с чем…

Большинство выводов, которые будут привидены в этой небольшой статье основаны только на подробнейшей документации по данному фреймворку, но никак не на его реальном использовании.

И так поехали…Что мне понравилось
1) Генерация кода — некоторые скажут что это бесполезная функция, однако не имея таковой в CI,  пользоваться ей в Yii было приятно. Для генерация всего и вся используется скриптик yiic (так же есть что-то  типа интерактивного шела), с помощью которого можно сгенерировать многое, от моделей и контроллеров, до «скелета» целого приложения и CRUD операций с данными в БД.
2) Контроллеры (controllers) — понравилось что в контроллере можно назначать действие по умолчанию, в CI и Kohana — действие по умолчанию — index.
3) Действия (actions) — действием может быть как метод контроллера (стандартный вариант) так и отдельный класс. Действие оформленное в виде отдельного класса позволяет использовать свои возможности в любом месте приложения — иногда может оказаться полезным.
4) Представления (view) — как и раньше это просто HTML файлы со вставками php кода. Понравилось что по умолчанию yii ищет view-файлы в подкаталоге, имя которого совпадает с ID контроллера (например для контроллера userController, view — файлы будут искаться в каталоге …view/user/…). Так же порадовало наличие Layout — общего view для всех страниц приложения — часто приходится делать это ручками.
5) Фильтры (Filter) — вот что действительно мне очень понравилось. Фильтры позволяют выполнить произвольный код перед и/или после того как будет выполнено действие контроллера, при необходимости фильтр может отменить выполнение действия. Фильтром может служить как метод контроллера так и отдельный класс, кроме того можно явно указать какие действия контроллера необходимо «фильтровать» а какие нет. Фильтров для конкретного действия может быть сколько угодно. Очень удобно применять один и тот же фильтр для всех контроллеров приложения, например для проверки авторизации пользователя.
Судя по официальному сайту реализация фильтров была позаимствована из symfony — так как я не знаком с данным фреймворком — ничего по этому поводу сказать не могу.
6) Модели (models) — модели используют ORM для взаимодействия с БД, для меня, писавшего некоторое время на CI и не видевшего ORM раньше — данный подход показался довольно интересным. Кроме ORM можно использовать DAO (в терминах yii), этот метод позволяет sql- писать запросы «ручками».
7) Пути и пространства имен. yii позволяет создавать алиасы для реальных путей  файловой системы.
Есть возможность импортировать отдельные классы и даже целые каталоги классов, используя синтаксис очень напоминающий JAVA.

Напимер:
Yii::import(‘system.web.CController’);
Yii::import(‘system.web.*’);
8) Система кеширования — позволяет кэшировать как отдельные переменные и фрагменты страниц, так и целые страницы.
Вот наверное и все что мне запомнилось после беглого прочтения документации, однако на самом деле возможности фреймворка не ограничиваются этим списком.
Я не упомянул здесь развитую систему «логирования» (кстати у меня так и не получилось записать сообщение в лог файл — может ручки кривые))), систему роутинга и многие другие возможности.
Кроме того базовые возможности фреймворка можно расширить использованием сторонних библиотек.
На первый взглад фреймворк очень достоин дальнейшего изучения и приминения на деле (если не будет серьезных ошибок)!

обсудить на форуме

MySQL WorkBench обновился

Давно пользуюсь данным инструметом для проектирования структуры БД.

Сегодня (06.12.2008) вышла новая версия 5.0.28.

Изменения:

— исправлено 16 ошибок

— в таблицах сделано отображение таких атрибутов столбцов как, auto increment, not null, Unsigned.

Подробности

Отображение атрибутов столбцов не включено по умолчанию. Для включения, необходимо зайти в настройки (Tools->Options…) перейти на вкладку Diagram и установить флажок Show Table Column Flags

После этого, таблицы на диаграмме, будут отображать соответствующие атрибуты.

Немного обновил свой блог!!!

Давненько я не заходил сюда!

Наконец-то обновил WordPress, поставил несколько дополнительных плагинов, изменил шаблон блога!

Есть несколько интересных статеек в черновиках….думаю скоро выложу.

Firebug и отсутствие места на диске C:.

Наткнулся на интересное сообщение Firebug, которое выдается каждый раз когда на диске C (Windows) нет свободного места….

Поначалу не вчитывался в текст сообщения, думал ошибки в моих скриптах или библиотеках….

Будьте внимательнее!

Codeigniter vs Kohana

VS

Раунд 1 MVC.

Kohana

При объявлении собственного конструктора в контроллере, необходимо вызвать конструктор базового класса, так как Kohana основан на ООП и PHP 5 синтаксис этого вызова следующий:

parent::__construct()!

в отличии от

parent::Controller()

в Codeigniter.

В отличии от Codeigniter, Kohana требует что бы в наименование класса контроллера присутствовал постфикс «_Controller», не указав который, при обращении к контроллеру получаем сообщение об ошибке «Fatal error: Cannot redeclare class ».

На мой взгляд, это не совсем удобно, так как разработчик может иметь собственные правила именования классов, которые ни как не пересекаются с правилами Kohana. Однако это позволяет избежать конфликтов имен, в тех случаях, когда класс контроллера и, например, модели, называется одинаково.

Для обозначения методов, доступных только внутри контроллера (не доступных с сайта), Codeigniter предлагает использовать префикс «_» в названии метода.

Пример:

   public function _some_action() - метод недоступный для вызова через URL сайта.

Kohana предлагает два варианта решения этой проблемы (один из которых наиболее интуитивен, по моему мнению), а именно:

можно объявить метод как privateтакой метод недоступен через URL сайта

Пример:

  private function some_action() -  приватный метод контроллера.

как и в Codeigniter можно объявить закрытый метод с префиксом «_»

Пример:

 public function _some_action()

— так же приватный метод.

Можно комбинировать два этих способа и объявить метод следующим образом:

 private function _some_action()

Контроллер в Codeigniter может содержать еще две функции, аналога которых пока нет в Kohana:

_remap($method) — данная функция предназначена для локального роутинга, т.е. перенаправления на другие контроллеры приложения. В качестве параметра ей передается запрошенный в URL метод.

_output($out) — функции передается обработанное отображение, предназначенное для отсылки браузеру. Данная функция может быть использована для конечной обработки вывода.

Отображения (VIEW)

В обоих фреймворках отображения (или предстваления, или view) — это просто PHP сценарии, содержащие в основном HTML-код. Однако способ работы с отображениями кардинально отличается в этих фреймворках.

Codeigniter

Для загрузки файла отображения из контроллера используется вызов метода:

  $this->load->view(«view_file»);

view_fileимя файла отображения без расширения «php».

В Codeigniter одновременно с загрузкой происходит и вывод отображения в браузер пользователя.

Для передачи параметров в представление, используется следующий вызов:

 $this->load->view(«view_file»,$some_data);

где $some_dataассоциативный массив содержащий параметры для отображения.

Пример:

 $some_data['user_fname'] = 'Андрей';
 $some_data['user_lname'] = 'Опейкин';

Если файл отображения будет содержать следующий код:

<html>

<body>

<h1>Привет $user_fname $user_lname!</h1>

</body>

</html>

То «отрендеренное» отображение (страничка, которую увидит пользователь) будет выглядеть так:

<html>

<body>

<h1>Привет Андрей Опейкин!</h1>

</body>

</html>

Кроме ассоциативного массива в качестве второго параметра метода, можно передавать объект, свойства которого, заменяют соответствующие переменные в отображении.

На мой взгляд недостатком такого подхода является то, что при загрузке отображения, автоматически происходит его отправка в браузер пользователя. Для перехвата вывода необходимо использывать метод контроллера _output() — описанный ранее, так же получить (а не вывести в браузер) полностью готовое отображение можно передав третий параметр в метод загрузки представления:

 $page = $this->load->view(«view_file»,$some_data,TRUE); // содержимое присваивается переменной $page

Kohana

Для загрузки файлов отображений существует два способа:

Использование конструктора класса View

Пример:

 $view = new View(«view_file»);

Вызов статичного метода (метод фабрики)

Пример:

 $view = View::factory(«view_file»);

В обоих случаях «view_file» — имя файла отображения.

Использование любого из этих способов, приводит лишь к созданию объекта отображения, вывод содержимого отображения в браузер пользователя НЕ происходит.

Воспользуемся примером отображения, описанного выше.

Для передачи параметров в отображение используется объектный подход.

 $view->user_fname = 'Андрей';
 $view->user_lname = 'Опейкин';

Так же можно передать параметры методом set();

 $view->set('user_fname','Андрей');
 $view->set('user_lname','Опейкин');

Установка параметров отображения так же как и создание объекта отображения НЕ приводит к пересылке информации пользователю.

Для отправки вывода пользователю необходимо вызвать метод render() отображения

 $view->render(TRUE);

На мой взгляд подход Konaha удобнее и практичнее.

Модели (Models)

В обоих фреймворках использование моделей НЕ является обязательным. При желании можно обойтись контроллерами и представлениями.

Kohana

Как и в случае с контроллерами, требует, чтобы класс модели имел определенный постфикс — «_Model».

Пример:

 class User_Model extends model

.........

}

Для загрузки модели из контроллера, необходимо просто создать экземпляр класса модели:

 $user = new User_model();

После этого можно обращаться ко всем методам и свойствам данного объекта.

Если в конструкторе модели вызывается родительский конструктор, т.е. конструктор имеет вид:

 public function __construct(){
 parent::_construct();
  ...............................
}

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

 $this->db

Codeigniter

Для загрузки класса модели необходимо использовать следующий код:

 $this->load->model(«model_name») ;

После этого к методам модели можно обращаться следующим образом:

 $this->model_name->some_method();

Объект для работы с базой данных НЕ создается автоматически при загрузке модели, для того что бы объект все таки создался, необходимо передать значение TRUE в качестве третьего аргумента:

 $this->load->model(«model_name»,'',TRUE) ;

Второй аргумент определяет псевдоним модели, по которым она будет доступна в контроллере.

Вся информация о фреймворке Kohana взята из соответствующей документации. Могут быть некоторые неточности, так как документация еще находится в процессе разработки и описывает далеко не все возможности и API этого фреймворка.