---
title: PHP frameworks
date: 2009-10-10T10:00
tags: [php]
---

суббота, 10 октября 2009 г. в 23:32:55

Как можно уже заметить в моём блоге, я уделяю дотошное внимание используемому языку и смыслу слов, поэтому термин _фреймворк_ мне не нравится, вместо этого по-моему правильней говорить о **каркасе** или скелете приложения.

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

![](img/Pasted%20image%2020241019201551.png)

[Codeigniter](http://codeigniter.com/) 1.7.6 - легковесный (1 mb) и простой в освоении. За основу берётся MVC-паттерн, популяризированная в ruby on rails. Основное приложение лежит в _application_ папке, делится в свою очередь на контоллеры, шаблоны и модели, кроме того папки - errors, helpers, language, config и hooks.  Классы контроллеров соответсвенно наследуют _Controller_ и по умолчанию запускается index-метод, шаблоны показываются через this->load->view(имя_шаблона, передаваемые_переменные).

Из полезного замечены классы валидации форм, работы с изображениями (imagemagick, watermark), trackback-запросов для статей в блогах, автогенерация кода (scaffolding). Само собой поддержка разных бд (mssql, mysql, postgre, oracle, sqlite). Итого получается достаточно типично - одно приложение, разбитое по контроллерам. Идеальный фреймворк для минималистов типа меня.

Сайт очень позитивный - вики, видео примеры, форумы и багтрекер.

![](img/Pasted%20image%2020241019201601.png)

[Symfony](http://www.symfony-project.org/) 1.3a от Sensio Labs позиционируется как более тяжёлый каркас (15 mb!). Та же MVC, но теперь с использованием ORM ([Propel](http://propel.phpdb.org/trac/) или [Doctrine](http://www.doctrine-project.org/)). Из ещё полезных фишек - кеширование шаблонов, scaffolding, многоязычность, чпу, недоступность исполняемых файлов от публичного каталога апача (как следствие - безопасность), настройка среды где проект вертится (development, testing, production). В минусы я бы отнёс привязку к JS библиотеке (Prototype), достаточная тяжеловесность по оперативке и времени из-за отсутсвия lazy loading классов (sic!) и опять же ORM.

Ещё одной особенностью является использование **YAML** в качестве файлов настроек. Если смотреть пример установки тестового (sandbox) приложения то видно что есть работа с консолью по автогенерации файлов моделей. Приложения в свою очередь состоят не только из моделей (обеспечивающим интерфейсы к бд), но и из модулей (с CRUD-действиями и интерфейсами).

По запуску процесса мне показалось очень сложным. Надо прописывать настройки в .yml файлах, что-бы сгенерировать всей файлы. Потом по идее грузится front controller, который вызвает модуль и в нём уже метод (по умолчанию - executeIndex) и вызывает шаблон indexSuccess.php

Сайт тоже достаточно путанный и быстрого погружения не даёт, а если распечатать примеры создания приложения, то из них получится более 10 страниц текста.

![](img/Pasted%20image%2020241019201610.png)

[CakePHP](http://cakephp.org/) 1.2.6 позиционируется как клон RoR и пожалуй с него слизан был Codeigniter (в том числе и поддержка старого php 4 ). Понимание как работает CakePHP это по сути понимание как работают остальные похожие каркасы или почему они работают неправильно. Почему именно это решение не стало очень популярным - сложно сказать, может дело в названии и не все такие сладкоежки.

"Пирожок" в общем быстрей чем Codeigniter и Yii, весит 7 мб и в общем предполагает тоже определённые названия классов (AppController, AppModel). В шаблон данные из контроллера передаются через $this->set(). Что понравилось - есть возможность юнит тестирования, очистки данных (Sanitize::paranoid), автогенерации кода (Cake bake), использования модели как дерева (и его показ методом generatetreelist)

![](img/Pasted%20image%2020241019201624.png)
[Zend Framework](http://framework.zend.com/) 1.9 скачать проблематичней - надо регистрироваться на сайте этой Zend-компании которая и имеет то преимущество что выпускает свой IDE, Optimizer и сервер. IDE у них глючный, поэтому к каркасу приложений я так же скептически отношусь. И не зря - этот монстр выпускается в двух версиях и минимальная из них весит 20 мб! Названия классов всюду фигурируют с Zend префиксом. В общем сразу видно отношение к разработчикам.

В плюсы - большая независимость классов. Можно взять тот же Zend_DB и использовать только его в своём проекте, подобно библиотеке PEAR, ещё в Zend_DB уже есть выборка данных методами fetchPairs, fetchAll (которые я давно использую в своём движке), переводы в зависимости от числительности (Zend_Translate::plural), интеграцию с PHPunit, разделение на приватный и публичный каталог, ограничение прав (Zend_Acl).

По структуре.. Контроллеры наследуют **Zend_Controller_Action** и по умолчанию запускают _indexAction_ метод. Данные в шаблон передаются через переменную контроллера $this->view. Шаблоны хранятся в .phtml файлах.

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

Поскольку ZF достаточно популярен, то с документацией и обучением проблем не встанет, разве что постигать надо достаточно много. Наверняка используется в больших проектах 

![](img/Pasted%20image%2020241019201638.png)

[Akelos](http://www.akelos.org/) в основном продвигает [Bermi Fermer](http://www.bermilabs.com/en/team/bermi-ferrer) и сразу признаётся в том что это максимально полный клон RoR и весит приличные 9 мб. Запуск очень аналогичен вышеназванным каркасам, поэтому я не удивляюсь что контроллер наследует **ApplicationController** и по умолчанию тоже вызывается index-метод. Переводы в контроллере можно получить через AK::t() метод, что странно и непропорционально относительно названий других объектов и методов.

Данные в шаблон летят через $this->saveAttribute(). Вобщем ничего отличительного что вы в руби не видели. Интересная выборка с использованием ActiveRecord и множественностью ассоциаций между моделями (has_one, belongs_to). Использование AdoDB в качестве адаптера к базе данных, хранение сессий в базе.

Минусы - интеграция с Prototype.js и scriptaculous, отсутствие документации, хранение переводов в ассоциативном массиве, практически нулевая популярность и сообщество разработчиков. Вряд ли пока стоит брать на вооружение.

![](img/Pasted%20image%2020241019201651.png)

[Yii PHP Framework](http://www.yiiframework.com/) 1.0.9 на удивление хорошо [документируется в рунете](http://yiiframework.ru/doc/guide/ru/basics.mvc), целиком объектный и [хвастающийся](http://www.yiiframework.com/performance) что он быстрей даже чем CodeIgniter, хотя скорость по идее зависит от многих вещей кроме скелета. Развился из [Prado](http://www.pradosoft.com/), весит неплохие 7 мб.

По запуску - вызывается контроллер который наследует **CController**, потом в зависимости от запрашиваемого URL вызывается более низкий класс который наследует **CAction**. Для всяких дополнительных проверок на права можно использовать фильтры - CFilter. Модели могут быть двух типов - Active Record либо CFormModel. Шаблоны показываются в контроллере через $this->render().

Префикс "C" как и с "Zend" даёт какую-никакую совместимость но и добавляет шума. В целом мне показался каркас удобней чем Symfony, но чуть более корпоративный чем CodeIgniter.

Читайте также

- [CodeIgniter vs CakePHP](http://setti.biz/574/)

## Related

- [CSV - кодировки, импорт и экспорт](/ru/blog/tech/backend/php/csv-kodirovki-import-i-eksport/)
- [Drupal 7](/ru/blog/tech/backend/php/drupal-7/)
- [Mysql import - export](/ru/blog/tech/backend/DB/mysql/mysql-import-export/)
