初心者がローカル環境にcakephp4を設定してみた

2020/4/10

初投稿でmarkdownよくわからず、見苦しいところはご了承ください。自分のメモのために。

お仕事させていただいている会社が皆さんMacで、Macへのローカル開発環境構築のマニュアルはあったがWindowsはなく、かつcakePHP4の記事はまだあまりなく苦労したので、メモ書きしておきます。


ローカル開発環境　xampp上に設定。
　※公式ページの<a href="https://book.cakephp.org/4/ja/tutorials-and-examples.html">cakephp4チュートリアル</a>と、<a href="https://dotinstall.com/lessons/basic_cakephp_v2">dotinstall（cakephp3）</a>を参考に行いました。

## 事前準備
・xamppのインストール
https://qiita.com/rana_kualu/items/50f9f5735321fe995ff5
	
・composerのインストール
https://book.cakephp.org/4/ja/installation.html#composer
	
・php7.4のインストール
https://aulta.co.jp/archives/6919

## Cakephp4のプロジェクト作成
（ここではプロジェクト名をnewprojectとします）
　c:\xampp\htdocs\newprojectにて、以下実行

```
$ composer create-project --prefer-dist cakephp/app:4.* newproject（プロジェクト名）
```

※ここでエラーとなった場合は、c:\xampp\php\php.iniの修正
>;extension=intl

↑コメントを外す


http://localhost/newproject/  に接続　cakephp4の画面が表示されたらOK


	
## DB設定

```
$ mysql  -u root
```


→ MariaDBにつながるので、データベース作成
（ここではデータベース名：new_db、ユーザ名：dbuser、パスワード：testで設定）

```
create database new_db;
grant all on new_db.* to dbuser@localhost identified by 'test';
use new_db
```

## config/app_local.phpを修正
DataSourcesのusername,password,databaseを、作成したデータベースの設定に修正

```
    'Datasources' => [
        'default' => [
           'host' => 'localhost',
            /*
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',

            'username' => 'dbuser',
            'password' => 'test',
            'database' => 'new_db',
            /**
             * If not using the default 'public' schema with the PostgreSQL driver
             * set it here.
             */
            //'schema' => 'myapp',

            /**
             * You can use a DSN string to set the entire configuration
             */
            'url' => env('DATABASE_URL', null),
        ],
```

## app.phpの修正
DataSourcesの
``//'encoding' => 'utf8mb4',``
のコメントをはずす
		
## サーバ起動

xamppのappache起動

ブラウザにて、http://localhost 　に接続

※DBが接続成功していることを確認する


			
## 各テーブルのbake（モデルの作成）
mysqlにてcreate table（テーブル作成）後に、bakeする。

```
$ bin/cake bake model （テーブル名）
```

→  /src/Model/Table,Entity配下にphpファイルができる
		

## 基本 controller、viewの作成メモ
	templates配下に、Users　フォルダ作成→index.php新規作成
```
<h1>user info</h1>
<ul>
  <?php foreach ($users as $user) : ?>
    <li><?= h($user->name); ?></li>
  <?php endforeach; ?>
</ul>
```
		
	src/Controller配下に、UsersController.php
```
<?php
namespace App\Controller;
class UsersController extends AppController
{
    public function index()
    {
        $users = $this->Users->find('all');
        $this->set(compact('users'));
    }
}
```

　→ブラウザで確認
　　http://localhost:8765/Users/　

〇ルーティングの設定
　　/Users/ではなく、ただの/で接続できるようにする設定方法
　　    config/routes.php　を修正

```
    // $builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $builder->connect('/', ['controller' => 'Users', 'action' => 'index', 'home']);
```
	

## 独自レイアウトの設定する場合
	
templates/layout配下に　my_layout.php　を新規作成する。

```
<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <title>
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
    <section class="container">
        <?= $this->fetch('content') ?>
    </section>
</body>
</html>
```

レイアウト変えたいController側に以下を追記　例）UsersController.php
        ※setLayoutの行

```
    public function index()
    {
        $users= $this->Users->find('all');
        $this->viewBuilder()->setLayout('my_layout');
        $this->set(compact('users'));
    }
```
	
## Cakephp3と4の違うところ、エラーになるので修正したところ

cakephp4のチュートリアルがまだcakephp4に対応されてない部分があったり、
dotinstallのcakephp3の通りにやっても4ではうまくいかなかったところのメモです。

・``newEntity``でエラーとなり、``newEmptyEntity``　に書き換えればOKだった

・``$this->Form->input('title');``　だとうまくいかず、以下だと上手く動いた
``$this->Form->control('title', ['label' => 'ああああ']);``
``$this->Form->control('title');``

・``$this->request->data``　がエラー　以下でOK
　　``$this->request->getData()``

・``$this->request->session()``がエラー　以下でOK
　　　``$this->getRequest()->getSession()``