CakePHP4をインストールする(Windows10)

Composerを使ってインストールする必要がある。

前提条件

xammppがインストールしてあること。(php8.0に対応しているバージョン。2021年11月時点での最新版)
phpコマンドが使える状態になっていること。

手順

  1. php_intlを有効にする必要がある。
    php.iniを開き、extension=intlを有効にする。(「;」をはずす)


    補足
    php_intlの実態はphp_intl.dllである。
    php_intl.dllはxamppのパッケージに含まれている。
    場所→ C:\xampp\php\ext\php_intl.dll
  2. 作業はコマンドラインツール(Git Bashなど)で行う。
    Git Bashを起動。
  3. Windows環境でGit bashのターミナルを使うと、ttyなんとかのエラーが出る。 その場合、下記のコマンドを実行すると解決する。
    $ exec winpty bash
  4. インストール先の作業ディレクトリを作成
    インストールとは言ってもダウンロードに近いので適当なディレクトリでよい。 あとで移動できる。
  5. cd コマンドで先ほど作成した作業ディレクトリに移動
  6. Composerを使えるようにする必要がある。
    下記のPHPコマンドにて、composer.pharを入手する。
    $ php -r "readfile('https://getcomposer.org/installer');" | php
    すると作業ディレクトリにcomposer.pharファイルが作成され、Composerがつかるようになる。
  7. CakePHP4をComposerを利用してインストール(ダウンロード)する。
    $ php composer.phar create-project --prefer-dist cakephp/app:4.* my_app_name
    my_app_nameは任意のプロジェクト名しても良い。
    作業ディレクトリ内にmy_app_nameフォルダが作成され、その中にCakePHP4一式(開発環境)が入っている。
    パスとかは固定されないようなのでmy_app_nameフォルダは好きな場所に移動しても多分大丈夫。
  8. xamppを利用しているのなら、my_app_nameフォルダを「C:\xampp\htdocs\」配下に移動し、下記URLにアクセス
    http://localhost/my_app_name
    下記ページが表示されれば成功

  9. my_app_nameフォルダ内が開発環境である。
    my_app_nameの名前を任意プロジェクト名に変更し、Eclipseで開いて開発プロジェクトにしよう。
    終わり

CakePHP4のDB接続

xamppのMySQLである場合
「ルート/config/app.php」と同じディレクトリにある「app_local.php」の両方にDB設定をする。( 参考:app.phpとapp_local.phpについて
app.phpを開き"Datasources"の箇所を以下のように書き換える。

localhostの場合


    'Datasources' => [

        'default' => [
            'className' => 'Cake\Database\Connection', 
            'driver' => 'Cake\Database\Driver\Mysql',
            'host' => 'localhost',
            'username' => 'root',
            'password' => '',
            'database' => 'hoge',
            'url' => env('DATABASE_URL', null),
        ],
        略 ...
	

CakePHP4のDB接続 | さくらインターネットサーバー

app.phpではなくapp_local.phpに記述すると良い。参考:app.phpとapp_local.phpについて

    'Datasources' => [
        'default' => [
            
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'mysql999.db.sakura.ne.jp',
            'username' => 'hoge',
            'password' => 'abcdefg123',
            'database' => 'hoge_animal',
            'url' => env('DATABASE_URL', null),
            
        ],
	

app.phpとapp_local.phpについて

動き

app.phpにapp_local.phpの設定値が上書きされるという仕組みになっている。

違い

app.phpはすべての環境で共通する設定を記述。デフォルトでGitHubの管理対象になっている。
app_local.phpはapp.phpの設定を上書きする。環境ごとに異なる設定を記述。こちらはGitHubの管理対象になっていない。

なぜ2つに分かれているのか?

app.phpにはDBのパスワードも記述している。
しかし、ばれたらまずいパスワードはGitHubで管理してはいけない。
なので本番環境のDBのパスワードはGitHub管理対象外のapp_local.phpに記述するのである。
app.phpにはばれても問題ないlocalhost環境のみ有効なパスワードを記述すればよいだろう。

応用

【localhost環境】
app.php→localhostのDB設定などを記述とよい。基本的に変更はしない。
app_local.php→基本的にapp.phpと同じでよい。開発環境が自分だけ特殊なら、ここに独自の設定値を記述すると良い。

【本番環境】
app.php→localhostのDB設定などを記述とよい。基本的に変更はしない。
app_local.php→本番環境用の設定値を記述する。本番DBのホストやパスワードなど。


SQLを実行する


	$connection = ConnectionManager::get('default');
    $results = $connection->execute('SELECT * FROM nekos')->fetchAll('assoc');
	

1行のみ

	$connection = ConnectionManager::get('default');
	$row = $connection->execute('SELECT * FROM nekos')->fetch('assoc'); 
	

CRUD画面を自動生成する | bake all

下記コマンドを実行する。
$ bin/cake bake all テーブル名

手順

  1. Git Bashなどコマンドラインツールを開く
  2. cd コマンドでプロジェクトのルートへ移動する。
    cd git/crud_base_cake4
  3. bakeコマンドにテーブル名を指定してCRUD画面を自動生成する。
    $ bin/cake bake all nekos
    nekosテーブルに関連したコントローラ、モデル、ビューなどが自動生成される。
  4. 下記URLにアクセスすると簡素なCRUD画面が作成されていることが分かる。
    http://localhost/crud_base_cake4/app/nekos

  5. 対象テーブルに○○_idというフィールドがあれば、そのフィールドのCRUD画面を自動作成する必要がある。 例えばen_sp_idというフィールドであれば、en_spsテーブルを作成し、「$ bin/cake bake all en_sps」を実行してEnSpのCRUD画面も自動生成する必要がある。

セッション書込、読出、削除、存在チェック | Session

セッションに書き込む
$this->getRequest()->getSession()->write('animal_name', 'ネコ');


セッションから読出し
$animal_name = $this->getRequest()->getSession()->read('animal_name');


セッションから削除
$this->getRequest()->getSession()->delete('animal_name');


セッションに値が存在するかチェック

	$res = $this->getRequest()->getSession()->check('animal_name');
	※$resはbool型