Соглашения об именах
Соглашение — это правило именования. CakePHP по имени контроллера находит таблицу и шаблон, по имени столбца — связь между таблицами. Пока имена соблюдают правила, настраивать ничего не нужно. Это первое, что стоит выучить новичку.
Один пример целиком
Возьмём статьи блога. Всё, что к ним относится, называется так:
| Что | Правило | Имя |
|---|---|---|
| Таблица в базе | Множественное число, строчные буквы | articles |
| Класс таблицы | Имя таблицы и Table | ArticlesTable |
| Класс записи | Единственное число | Article |
| Контроллер | Множественное число и Controller | ArticlesController |
| Папка шаблонов | Имя контроллера без Controller | templates/Articles/ |
| Адрес | Имя контроллера строчными | /articles |
Где лежат файлы
src/Controller/ArticlesController.php
src/Model/Table/ArticlesTable.php
src/Model/Entity/Article.php
templates/Articles/index.php
templates/Articles/view.phpИмя файла всегда совпадает с именем класса. Шаблон называется так же, как метод контроллера: для метода index() — index.php, для view() — view.php.
Имена из нескольких слов
В базе слова разделяют подчёркиванием, в классах пишут каждое слово с заглавной буквы, в адресе — через дефис:
| Что | Имя |
|---|---|
| Таблица | article_comments |
| Класс таблицы | ArticleCommentsTable |
| Класс записи | ArticleComment |
| Контроллер | ArticleCommentsController |
| Адрес | /article-comments |
Шаблон для метода viewAll() | templates/ArticleComments/view_all.php |
Столбцы таблицы
| Столбец | Что означает |
|---|---|
id | Первичный ключ — номер записи |
created | Дата создания, заполняется сама |
modified | Дата изменения, заполняется сама |
user_id | Ссылка на запись таблицы users |
Внешний ключ — столбец, хранящий номер записи другой таблицы — называют именем этой таблицы в единственном числе с окончанием _id. Таблицу, связывающую две других, называют обоими именами по алфавиту: articles_tags.
Как это выглядит в коде
// src/Controller/ArticlesController.php
namespace App\Controller;
class ArticlesController extends AppController
{
public function index(): void
{
$articles = $this->Articles->find()->all();
$this->set('articles', $articles);
}
}Здесь нет ни имени таблицы, ни пути к шаблону. По имени ArticlesController фреймворк понял, что $this->Articles — это таблица articles, а выводить нужно templates/Articles/index.php.
Если имя нельзя изменить
Чужую базу с таблицей blog_posts подключают настройкой в классе таблицы:
// src/Model/Table/ArticlesTable.php
public function initialize(array $config): void
{
$this->setTable('blog_posts');
}Соглашения можно обойти, но каждое отступление — лишняя строка кода.
Частая ошибка
Таблица article вместо articles или контроллер ArticleController — и CakePHP сообщает, что таблица не существует или шаблон отсутствует. Ошибка выглядит загадочно, хотя причина в одной букве. Прежде чем искать её в коде, сверьте имена с таблицами этого урока.