Недавно я решил пересесть с фреймворка CodeIgniter на CakePHP. Такой выбор был сделан по двум причинам: во-первых, некоторые читатели моего блога смогли меня убедить в полезности этого шага, во-вторых в Интернете полным полно утверждений, что CakePHP - это мега крутое приложение с невероятными возможностями.
Переход состоялся, но не так гладко как хотелось. Вот одна из проблем - по умолчанию CakePHP считает, что каждый модуль имеет собственную таблицу в базе данных. При этом имя таблицы совпадает с именем самого модуля. Но иногда встречаются ситуации когда модуль не имеет данных, которые нужно сохранять в базе. В таком случае необходимо дополнительно указать, что у модуля нет собственной таблицы. О том как это сделать и какие трудности у меня возникли далее в этом посте.
После недолгих изысканий выяснилось, что для указания таблицы с данными используется специальная переменная $useTable. Если значение переменной не задано (равно null), то фреймворк подставляет его самостоятельно. В случае, если имя таблицы в базе отлично от имени самого модуля, необходимо самостоятельно задать значение переменной $useTable. Если таблицы нет, то нужно присвоить переменной значение false.
Важный момент, при создании модуля через “CakePHP console” невозможно создать модуль без привязки к таблице. Точнее возможность есть, только реализована она некорректно. Поясню более детально. Допустим мы создаем модуль “test”, тогда в консоли будет задан следующий вопрос:
Given your model named ‘test’, Cake would expect a database table named tests
Do you want to use this table? (y/n)
Т.е. либо фремворк попытается самостоятельно определить имя таблицы, либо, при получении отрицательного ответа на вопрос, предложит вам задать имя самостоятельно:
What is the name of the table (enter “null” to use NO table)?
Если при ответе на данный вопрос ввести “null” (как сказано в подсказке), то в модуль будет добавлена следующая строка:
Что CakePHP понимает как необходимость обратиться к таблице с именем “null”, такой таблице в базе, естественно нет, в результате выдается ошибка.
Или вот еще одна особенность, связанная с привязкой модуля к контроллеру. Контроллер автоматически пытается найти принадлежащий ему модуль, но тут есть одна деталь, если имя контроллера заканчивается на ’s’, то CakePHP обрежет эту букву и получившееся имя будет воспринимать как название модуля. Например: если имя контроллера - blogs, то имя модуля - blog. Чтобы указать имя модуля в явном виде, нужно в контроллере задать переменную $uses и присвоить имя нужного модуля.
На самом деле, великое множество разных предположений, которые делает CakePHP, с одной стороны, конечно, ускоряют процесс разработки. Но с другой стороны, если где-то возникает ошибка, требуется очень много времени, чтобы разобраться, а почему собственно фреймворк делает что-то так, а не иначе. Плюс остается небольшой страх, что не зная какой-то особенности, в результате может получиться приложение которое будет функционировать не как ты задумал, а как бог на душу положит.
Например, на то, чтобы понять, почему модуль созданный чере “CakePHP console”, категорически отказывается работать, у меня ушло больше половины рабочего дня. А всего-то надо было заменить $useTable = ‘null’; на $useTable = false;.
Так что пока CodeIgniter как-то ближе, и намного понятнее!

VasiaVC
Гость
по началу всегда так - потом привыкаешь. Я вот к ZendFramework привыкнуть не мог.
[YS.PRO]
Гость
От себя выскажу лишь, что самое мега крутое в мире PHP - это Symfony framework ). Евгений, попробуй, гарантирую, что тебе понравится 100%.
Это своего рода клон RoR на php.
Snowcore
Гость
Присоединяюсь к Symfony однозначно! Обязательно попробуй!
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Хе. Ребята, я прямо как та белка с орехом из ледникового периода. Только я с фреймворками ношусь
Symfony я пытался смотреть, но тогда мне показалось, что от CodeIgniter она ничем не отличается. Правда, смотрел поверхностно.
[YS.PRO]
Гость
Symfony сильно отличается от CodeIgniter, ибо я их оба рассматривал. Symfony поддерживает новейшие технологии (PHP5, etc.), ООП реализация на высоте.
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Не знаю, не знаю… Имхо никаких преимуществ над CodeIgniter нет. Я смотрю не с позиции технологичности, а с позиции удобства работы.
[YS.PRO]
Гость
Как знаешь… чего стоит scaffolding, CRUD, propel
Evgeny Sergeev
Гость
http://www.webpagedesign.com.au/2008/05/18/free-web-template-greefies/
Андрей
Гость
Дружище, в нужном контроллере укажи
var $uses = array();
И будет тебе счастье!!
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Андрей, я уже давно разобрался с этим вопросом, но все равно спасибо за участие!
Вадим
Гость
Symfony рулит, имхо, всем советую)