【初心者向け】CakePHPの導入手順、ファイル名、フォルダ構成ルールの基本まとめ

CakePHPを学び始めて、導入の手順、ファイル名やフォルダ構成等のルールがごちゃごちゃになってきたので基本事項をまとめました。

※[クイックスタートガイド](https://book.cakephp.org/3/ja/quickstart.html)、[CakePHP の規約](https://book.cakephp.org/3/ja/intro/conventions.html)を簡易的にまとめています。

# 導入手順
導入手順に沿って書いていきます。
※バージョン：CakePHP 3

## ①データベース作成
１.空のデータベースを作成
２.必要なテーブルを作成

```sample.sql
--※サンプルのSQLです。今回の内容に出てこないテーブルも含まれています。

USE cake_cms;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(191) NOT NULL,
    body TEXT,
    published BOOLEAN DEFAULT FALSE,
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (slug),
    FOREIGN KEY user_key (user_id) REFERENCES users(id)
) CHARSET=utf8mb4;

CREATE TABLE tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(191),
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (title)
) CHARSET=utf8mb4;

CREATE TABLE articles_tags (
    article_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (article_id, tag_id),
    FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
    FOREIGN KEY article_key(article_id) REFERENCES articles(id)
);
```


## ②データベースの設定
config/app.php ファイルの中の Datasources.default 配列の値を置き換える

## ③モデルの作成
１.Tableオブジェクト…
★「articles」テーブルを使用するモデルであると解釈される
src/Model/Table/ArticlesTable.php

２.Entityオブジェクト…
データベースの１つのレコードを表し、データに対して行レベルの振る舞いを提供する
★プロパティーを変更できるかを制御する _accessible をセットアップする
src/Model/Entity/Article.php

## ④コントローラーの作成
src/Controller/ArticlesController.php
★www.example.com/articles/index (www.example.com/articles) をリクエストした場合、ArticlesControllerのindexメソッドが呼ばれる

## ⑤テンプレートの作成
src/Template/Articles/index.ctp
http://localhost:8765/articles/index

# CakePHP のファイル構成
![CakePHP導入_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110128/28e0f858-105c-2252-2956-00c35e48b2db.jpeg)

■Model
src/Model/Table/ArticlesTable.php
　★「articles」テーブルを使用するモデルであると解釈される
src/Model/Entity/Article.php
　★プロパティーを変更できるかを制御する _accessible をセットアップ
■Controller
src/Controller/ArticlesController.php
　★www.example.com/articles/index (www.example.com/articles) をリクエストした場合、ArticlesControllerのindexメソッドが呼ばれる
■View
src/Template/Articles/index.ctp
　★index アクションのビューテンプレート
src/Template/Articles/view.ctp
　★view アクションのビューテンプレート
src/Template/Articles/add.ctp
　★add アクションのビューテンプレート
※delete アクションは、ロジックを実行して別のアクションにリダイレクトしているだけなのでビューテンプレートは不要

# CakePHP の命名規約
## ■コントローラーの規約
ファイル名：[複数形、アッパーキャメルケース] + [Controller] + 拡張子[.php]
　例）UsersController.php
　
クラス名：[複数形、アッパーキャメルケース] + [Controller]
　例）UsersController
★基本的に、コントローラーも、モデルもファイル名はクラス名と一致する

URL：http://example.com/users

## ■データベースの規約
テーブル名：複数形でアンダースコア記法
　例）users、articles、article_categories

外部キー：「関連するモデルの(単数形の)名前」+「_id」として認識される※デフォルトの場合
　例）ユーザーが記事を複数持っている 場合、 「articles」テーブルは「user_id」を外部キーとして「users」テーブルのデータを 参照する
　参考）article_categories のような複数の単語のテーブルでは、外部キーは article_category_id のようになる

BelongsToManyの関係で使用されるjoinテーブルの命名：
結合するテーブルに合わせて、 アルファベット順に 並べた名前とする
例）articles_tags（tags_articlesはNG）

## ■モデルの規約
**〇Table**
ファイル名：[複数形、アッパーキャメルケース] + [Table] + 拡張子[.php]
　例）UsersTable.php
　
クラス名：[複数形、アッパーキャメルケース] + [Table]
　例）usersテーブル → UsersTable、article_categoriesテーブル → ArticleCategoriesTable

**〇Entity**
ファイル名：[単数形、アッパーキャメルケース] + 拡張子[.php]
　例）User.php
　
クラス名：[単数形、アッパーキャメルケース]
　例）usersテーブル → Userz、article_categoriesテーブル → ArticleCategory

## ■ビューの規約
ファイル名：コントローラーの関数に合わせたアンダースコア記法（src/Template/コントローラー名/アンダースコア記法_関数名.ctp
　例）ArticlesControllerクラスのviewAll()関数 → src/Template/Articles/view_all.ctp を探す

## ■要約
データベースのテーブル: articles
Tableクラス: ArticlesTable の場所は src/Model/Table/ArticlesTable.php
Entityクラス: Article の場所は src/Model/Entity/Article.php
Controllerクラス: ArticlesController は src/Controller/ArticlesController.php
ビューテンプレートの場所：src/Template/Articles/index.ctp