// codeart.ru / Вопрос/Ответ / CakePHP. Как создать модуль без привязки к таблице в базе данных Форум

CakePHP. Как создать модуль без привязки к таблице в базе данных rss подписка

Автор: Evgeny Sergeev

Недавно я решил пересесть с фреймворка 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” (как сказано в подсказке), то в модуль будет добавлена следующая строка:

var $useTable = ‘null’;

Что CakePHP понимает как необходимость обратиться к таблице с именем “null”, такой таблице в базе, естественно нет, в результате выдается ошибка.

Или вот еще одна особенность, связанная с привязкой модуля к контроллеру. Контроллер автоматически пытается найти принадлежащий ему модуль, но тут есть одна деталь, если имя контроллера заканчивается на ’s’, то CakePHP обрежет эту букву и получившееся имя будет воспринимать как название модуля. Например: если имя контроллера - blogs, то имя модуля - blog. Чтобы указать имя модуля в явном виде, нужно в контроллере задать переменную $uses и присвоить имя нужного модуля.

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

Например, на то, чтобы понять, почему модуль созданный чере “CakePHP console”, категорически отказывается работать, у меня ушло больше половины рабочего дня. А всего-то надо было заменить $useTable = ‘null’; на $useTable = false;.

Так что пока CodeIgniter как-то ближе, и намного понятнее!

  1. Блог журналиста
  1. по началу всегда так - потом привыкаешь. Я вот к ZendFramework привыкнуть не мог.

  2. От себя выскажу лишь, что самое мега крутое в мире PHP - это Symfony framework ). Евгений, попробуй, гарантирую, что тебе понравится 100%.
    Это своего рода клон RoR на php.

  3. Присоединяюсь к Symfony однозначно! Обязательно попробуй!

  4. Хе. Ребята, я прямо как та белка с орехом из ледникового периода. Только я с фреймворками ношусь :-)

    Symfony я пытался смотреть, но тогда мне показалось, что от CodeIgniter она ничем не отличается. Правда, смотрел поверхностно.

  5. Symfony сильно отличается от CodeIgniter, ибо я их оба рассматривал. Symfony поддерживает новейшие технологии (PHP5, etc.), ООП реализация на высоте.

  6. Не знаю, не знаю… Имхо никаких преимуществ над CodeIgniter нет. Я смотрю не с позиции технологичности, а с позиции удобства работы.

  7. Как знаешь… чего стоит scaffolding, CRUD, propel

  8. Дружище, в нужном контроллере укажи

    var $uses = array();

    И будет тебе счастье!!

  9. Андрей, я уже давно разобрался с этим вопросом, но все равно спасибо за участие!

  10. Symfony рулит, имхо, всем советую)

Leave a Reply

« О многоязычных (IDN) доменах Что-то странное творится с моим WordPress-ом »

 

столик для ноутбука раскладной с охлаждением | Компьютерная помощь спб .