«CakePHP - первое, второе и третье впечатления» — 2010-12-11, purple
Как я говорил уже ранее, я начал использовать фреймворк CakePHP.
По сути, после Kohana Framework, CakePHP кажется просто раем.
Тем не менее, были и проблемы, например, в документации сказано, что тайтл документа в Layout задается через setTitle(), но в реалии в версии 1.3 нужно это делать через метод set().
Также по началу были проблемы с ORM кейка - вся работа происходит с массивами, которые при сложных запросах к базе имеют немалый уровень вложенности и ассоциаций. После коханы это было немного дико, но потом соориентировался и теперь все пучком.
Хочу заметить, что в кейке есть некоторые проблемы в работе с релейшенами (зависимостями) таблиц базы - типы hasAndBelongsToMany (HABTM) и hasMany.
Дело в том, что кейк автоматически делает join для связей типа hasOne, но в случае если имеются две вышеперечисленные связи, то кейк не джоинит таблицы, а разделяет на несколько запросов, которые внутри своего ядра потом связывает. Это очень неудобно, ведь в большинстве случаев необходимы cross table запросы к базе, а без join'а это получается говно плохой код с костылями. Поэтому, очень много погуглив вопросы людей с google groups и stackoverflow, понял, что путь кейка в данном случае - использовать unbindModel/bindModel для форсирования джоинов, и contain behavior для фильтрации результирующих данных. Было бы неплохо авторам кейка реализовать в следующей версии фреймворка в методах семейства find() опциональный параметр, который позволял бы задавать, джоинить таблицы при HABTM/hasMany связях, или нет, ибо код вырастает в несколько раз. Ведь использовать фильтры contain неудобно - вытягиваются все данные из базы по запросу из find, несмотря на условия фильтров, а это грузит базу, лишние запросы, да и некрасива последующая обработка полученного массива foreach'ем.
Что касается официальной поддержки, то она весьма скудна - на ask.cakephp.org редко когда дождешься ответа на поставленный вопрос, поэтому мой вам совет - используйте официальный кейковский google groups, там отвечают буквально в течение получаса. На stackoverflow, кстати, тоже почему то мало работающих с кейком.
Вердикт: CakePHP очень автоматизированный, удобнейший фреймворк, в котором хотя и есть недостатки, но достоинства, несомненно, преобладают.
Кстати говоря, сейчас я пишу два проекта на кейке - один по работе, а второй свой.
PS
Чуть не забыл, foreign keys и индексы задавать в базе необязательно - кейк сам видит связи между таблицами, если их имена заданы по конвенции. Если же вам не нравится конвенция кейка - то можете прописать все связи вручную в моделях одноименных таблиц, иначе через консольную утилиту 'cake bake'.