Сен 15 2008

Соглашения в CakePHP

Раздел: Веб-разработкаМета @ 21:45

Соглашения (conventions) — это то, что принято называть «автомагией», когда достаточно выполнить одно-два простых условия, чтобы Кейк автоматически выполнил целый ряд действий, существенно ускоряющих разработку. Авторы CakePHP являются большими фанатами соглашений и стараются их использовать по-максимуму, вместо привычных опций конфигурации. Конечно, в самом начале работы с Кейком вам придется их изучать, но тут главное вникнуть в смысл — соглашения используются очень логично. К тому же, все разработчики на CakePHP уже изучившие правила работы с соглашениями, смогут быстро разобраться в вашем исходном коде, а вы — в их.

Соглашения CakePHP включают в себя лучшую практику веб-разработки, наработанную годами. Хотя создатели платформы и рекомендуют им следовать, но это вовсе не требование, а совет. Вы всегда можете отказаться от их использования.

Имена файлов и названия классов.

Два простых правила: отдельные слова в именах файлов должны разделяться подчеркиванием, а в именах классов — начинаться с большой буквы. Например, класс может называться ArticlesController, тогда соответствующий этому классу файл должен называться articles_controller.php. Однако, название класса не всегда полностью содержится в имени файла. Так, класс EmailComponent находится в файле email.php, а HtmlHelper — в файле html.php.

Модели и база данных

Имена классов для моделей должны быть в единственном числе и с БольшойБуквы. User и RegisteredUser — названия классов, подходящие для соглашений. Имена таблиц в базе данных должны быть во множественном числе и с подчеркиванием. Для приведенных выше классов, соответствующие имена таблиц должны быть users и registered_users.

Внешние ключи для связей типа hasMany, belongsTo и hasOne по-умолчанию разпознаются как имя связанной модели в единственном числе с символом подчеркивания и меткой id в конце. Например, если у пользователя (класс User) есть много статей (класс Article), то таблица articles будет связана с таблицей users через поле user_id.

Названия вспомогательных таблиц для связей типа hasAndBelongsToMany (HABTM) должны состоять из имен обеих связываемых таблиц в алфавитном порядке, разделенных символом подчеркивания. Например — authors_books.

В каждой таблице с которой взаимодействует CakePHP должен быть единственный первичный ключ, для однозначной идентификации каждой записи. Обычно это целочисленное поле «id». Кейк не поддерживает составные первичные ключи. Если вы хотите работать со вспомогательными объединяющими таблицами, то либо используйте обычный SQL в функции модели query(), либо добавьте в такую таблицу первичный ключ и создайте для нее модель.

Соглашения в контроллерах

Имена классов контроллеров должны быть во множественном числе, с БольшойБуквы и заканчиваться на Controller. UsersController и LatestNewsController — соответствующие имена. Первой функцией в контроллере должна быть index(). Когда пользователь запрашивает контроллер, но не указывает действие (action), то запрашивается действие по-умолчанию — index(). Например, запрос http://localhost/pages/ вызовет функцию index() контроллера PagesController, а запрос http://localhost/pages/view/ - функцию view(). Видимостью функций извне можно управлять с помощью подчеркиваний. Если добавить подчерк перед именем функции, то эта функция будет доступна изнутри приложения, но ее нельзя будет вызвать через веб.

Имена контроллеров, состоящие из нескольких слов, вызываются запросом, в котором все кроме первого слова также с большой буквы. Например — http://localhost/latestNews/.

Соглашения в представлениях (views)

Представления — это шаблоны, которые размещаются в папках, соответствующих имени контроллера и сохраняются в файлы, соответствующие имени функций этого контроллера. Например, представление для функции getLatest() контроллера NewsController, должно находится в файле /app/views/news/get_latest.ctp.

Пример соглашений

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

  • Таблица в базе данных — articles
  • Имя класса модели Article, модель сохранена в файл /app/models/article.php
  • Имя класса контроллера ArticlesController, сохранен в /app/controllers/articles_controller.php
  • Шаблон представления в файле /app/views/articles/index.ctp

При запросе адреса http://localhost/articles/ CakePHP автоматически обратится к функции index() контроллера ArticlesController, в функции будет сразу же доступна модель Article (привязанная к таблице в базе данных) и автоматически же будет отображена в соответствующем представлении. Для работы всего этого вам не придется ни прописывать связей, ни include’ов — все будет загружено Кейком.

Полный список всех соглашений:

  • Имена таблиц во множественном числе и в нижнем регистре.
  • Имена моделей в единственном числе и с БольшойБуквы.
  • Имена файлов моделей в единственном числе и с подчеркиваниями между словами.
  • Имена контроллеров во множественном числе, с БольшойБуквы и с Controller в конце.
  • Имена файлов контроллеров во множественном числе, с подчеркиваниями и controller в конце.
  • Связи должны использовать имена моделей и идти в порядке своих внешних ключей.
  • Внешние ключи должны быть в единственном числе вида связаннаятаблица_id.
  • Вспомогательные таблицы должны состоять из названий связываемых таблиц во множественном числе, разделенных подчеркиванием.
  • Поля во вспомогательных таблицах должны называться также как и другие внешние ключи — связаннаятаблица_id.
  • Если в таблице есть поля с именами created и modified — то эти поля будут заполнены автоматически при использовании функции save() модели.
  • Названия компонентов должны быть с БольшойБуквы, имена файлов — через подчеркивание.
  • Также и хелперы.
  • Если в таблице есть поля name или title — их значения будут автоматически отображаться в описании при использовании scaffolding’а.
  • Поле с именем name будет автоматически использовано при построении выпадающих списков с помощью функции generateList().

Теги:

Напиши комментарий!