いまさらCakePHP2.xの環境構築

# CakePHP2.xの環境構築

PHPド素人の個人的めも

## 前提条件
- 開発環境はDockerで構築した。
- comporser は今回使わず、プラグインのインストール等はGitを利用。
- 以下各種プラグイン等Gitで取得しているが、ホスト側、ゲスト側のどちらで取得しても特に問題ない。
- ただし、現状DockerコンテナのPHP5.3.3にはGitをいれていないので、ホスト側MacでGitコマンドを利用している。
- このあたりは、大人の事情で本番環境にレンタルサーバーの利用を想定しており、開発環境でGit等で取得したソースコードをプラグイン含めて全てFTPでアップする予定。

## ローカルに用意するサーバー構成

- centos6.9
- Apach
- PHP5.3.3
- mysql5.7

## CakePHPの配置
- github [cakephp/cakephp](https://github.com/cakephp/cakephp/)から取ってくる。
- ブランチを`2.x`に切り替えてzipでダウンロード（Gitでとってもよかった）
- zipを解凍して適当な場所に配置。フォルダを任意のプロジェクト名に変更してプロジェクトルートとした。場所や名称はなんでもいい。

## 初期設定
- セキュリティ設定、salt的なやつを設定する >> `app/Config/core.php`
- `database.php`の記述`host`にはIPアドレスではなく、ホストのコンテナ名を記述する

```php:app/Config/database.php
<?php
class DATABASE_CONFIG {
	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'db', # << コンテナ名
		'login' => 'root',
		'password' => 'password',
		'database' => 'room_guid',
		'encoding' => 'utf8'
	);
}
```

## ブラウザアクセスでエラー表示

- php.iniの設定でエラー  
 [[PHP]php.iniのtimezoneを設定する] (https://qiita.com/maximum80/items/d8c841ccdaf6f8106b3f) << こちらを参考にして解消



# テンプレートエンジンの導入

CakePHPでtwigを使うための`TwigView`というプラグインをいれて、その中に別途Twig本体を入れる仕組みらしい。

## 導入手順
- [predominant/TwigView](https://github.com/predominant/TwigView)から、GitHubのマスターブランチを取ってくる。  
- 以下、Readmeの通りにする

- プラグインをダウンロード  

```shell
$ cd app/Plugin
$ git clone git://github.com/predominant/TwigView.git TwigView        
　
# app/Plugin/TwigView/vendor/配下にTwig本体を入れるらしい
$ cd TwigView/
$ git submodule update --init
```
上記リポジトリのreadme.mdに使い方がのっている  

- プラグインの利用を許可する`bootstrap.php`はすでにPlugin配下のものを全て読み込むように設定済み

```php:app/Config/bootstrap.php
CakePlugin::loadAll();
```

- AppControllerの設定

```php:app/Controller/AppController.php
class AppController extends Controller {
     public $components = array('DebugKit.Toolbar');
     public $viewClass = 'TwigView.Twig'; # << ここと
     public $ext = '.twig';               # << ここ！！
     ...
```

- TwigViewのキャッシュファイル保持位置の設定追加

```php:app/Config/core.php
define('TWIG_VIEW_CACHE', APP . 'tmp');
```
ページにアクセスした時点で、`app/tmp/ce/`配下にキャッシュが保存されるみたい

# マイグレーションの導入

## プラグインCakeDC Migrationの導入

- マイグレーションファイルの書き方は[公式ドキュメント CakeDC/migrations](https://github.com/CakeDC/migrations/blob/master/Docs/Documentation/Migrations.md)を参照

- Gitでとってきて`app/Plugin/Migrations/`に配置

```sh
$ cd app/Plugin/
$ git clone git://github.com/CakeDC/migrations.git Migrations
```

## 初期マイグレーションの作成

- `app/`の下で以下の各コマンドを実行する。
- 空のマイグレーションファイルをコマンドで生成する
`Console/cake Migrations.migration generate` を実行して対話形式の質問には全てNo（n）で答えて最後にマイグレーションファイル名を入力する。
以下の例では`create_user`とした。

```shell
    [root@28124f4a27e3 app]# Console/cake Migrations.migration generate
    Cake Migration Shell
    ---------------------------------------------------------------
    Do you want to compare the schema.php file to the database? (y/n)
    [y] > n
    Do you want to compare the database to the schema.php file? (y/n)
    [y] > n
    Do you want to preview the file before generation? (y/n)
    [y] > n
    Please enter the descriptive name of the migration to generate:
    > crate_user
    Generating Migration...
    　
    Done.
```
これで`app/Config/Migration/1542953578_crate_user.php`が作成される。
このファイルにDBの定義を記述する
[公式ドキュメント CakeDC/migrations](https://github.com/CakeDC/migrations/blob/master/Docs/Documentation/Migrations.md)に書き方（DBの定義方法）がのっている

## マイグレーションの実行

マイグレーションコマンドについても[CakeDC/migrations](https://github.com/CakeDC/migrations/blob/master/Docs/Documentation/Examples.md)にかかれている

- `app/`の下で以下の各コマンドを実行する。

- DBを全てリセット（Drop）最初にやっておく
`Console/cake Migrations.migration run reset`

- マイグレーションファイルで未実行のものを全て実行する
`Console/cake Migrations.migration run all`

- 未実行のファイルから、バージョンを指定して実行する（対話形式）
`Console/cake Migrations.migration run`

## スキーマファイルの更新

- スキーマファイルでDBを作ったり、DBからスキーマファイルを作ったりできる。
- 今回はRails風にDBの作成はマイグレーションを利用し、更新されたDBからスキーマファイルを作成する。
そのため基本的にはDBの定義全体を確認するためのものとして利用する。
- スキーマファイルは`app/Config/Schema/schema.php`にある（最初はないのでつくる）
- `app/`の下で以下のコマンドを実行する
`Console/cake schema generate -f` 

    ```
    [root@28124f4a27e3 app]# Console/cake schema generate -f
    
    Welcome to CakePHP v2.10.13 Console
    ---------------------------------------------------------------
    App : app
    Path: /var/www/html/app/
    ---------------------------------------------------------------
    Cake Schema Shell
    ---------------------------------------------------------------
    Generating Schema...
    Schema file exists.
     [O]verwrite
     [S]napshot
     [Q]uit
    Would you like to do? (o/s/q)
    [s] > o
    Schema file: schema.php generated
    ```
`-f`オプションで、モデルの有無に関係なくDBにあるテーブルを全て書き出す

# その他Plugin
とりあえずGithubからzipでとってきて解凍して`/Plugins/`配下にほりこむ。

## Debug Kit

### 導入方法
- ファイルダウンロード>解凍>配置 `/Pulugin/DebugKit`
- 設定ファイルで以下をコメントインして全てのプラグイン`/Plugin/`配下を読み込む

```php:app/Config/bootstrap.php
CakePlugin::loadAll(); // Loads all plugins at once
```
- AppControllerに設定記述

```php:app/Controller/AppController.php
class AppController extends Controller {
  public $components = array('DebugKit.Toolbar');
  ...
```

# 参考にしたサイト

## 基本的な内容
- [ざっくりCakePHP2.×入門](https://qiita.com/kazukichi/items/2ef6f81e11709f1a75bd)
- https://webcake.stars.ne.jp/event/cakephp2-8hours-seminar.html
- [CakePHP2を学ぼう！優しいCakePHP超入門！スクリーンショット多め](https://webcake.stars.ne.jp/event/cakephp2-8hours-seminar.html)
- [CakePHP 2.x Cookbook](https://book.cakephp.org/2.0/ja/contents.html)


## プラグイン周り
- [CakePHP DebugKit の導入手順](https://qiita.com/BUN/items/403cccad9eaa831e6fd8)
- [【CakePHP2.3】必須プラグイン(DebugKit)](http://blog.livedoor.jp/spyder_5615/archives/25579823.html)
- [CakePHP2系にTwigを導入](http://pplace.jp/2012/07/814/)
- [cakephp2.5系のブログチュートリアル＋Twigテンプレート組み込み](http://m-shige1979.hatenablog.com/entry/2014/07/30/080000)
- [CakePHPでTwigView使う時FormやHtmlヘルパーが使えない](http://d.hatena.ne.jp/stealthinu/20130511/p1)
- [cakephp2 チーム開発のためのマイグレーション](https://qiita.com/non0311/items/523492c4e1e0e6c88caf#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%96%B0%E8%A6%8F%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [CakePHP 2.x系におけるSchemaについて](https://qiita.com/KNaito/items/de47d123405bea5a2efe)
- [CakePHP2系でマイグレーションを利用する方法](https://www.ryuzee.com/contents/blog/6108)
- [CakePHP 2.x Cookbook スキーマの管理とマイグレーション](https://book.cakephp.org/2.0/ja/console-and-shells/schema-management-and-migrations.html)
- [公式ドキュメント CakeDC/migrations](https://github.com/CakeDC/migrations/blob/master/Docs/Documentation/Migrations.md)
- [CakePHP 2系のCakeDC Migrationsプラグインのマイグレーションファイルの作成について](https://qiita.com/KNaito/items/6e6c2a98a98c9f445c5e) << 仕組みについてわかりやすくかかれている