Laravel + Oracleの環境構築

# はじめに
Laradockを使ってLaravel + Oracleの環境を構築する方法です。

# 手順

以下は`~/laracle` 以下に環境を構築する想定のコードです。

```bash
$ mkdir ~/laracle
```

## OracleのDocker image作成

まず、oracleで配布されているdocker-imageからOracleのimageを作成します。

```bash
$ cd ~/laracle
$ git clone https://github.com/oracle/docker-images.git
```


以下のURLからOracle Databaseのバイナリをダウンロードします。
https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
ダウンロードしたファイルを`~/laracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/`以下の、対応するバージョンのディレクトリへ移動します。

ビルドします。

```
$ cd ~/laracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/
$ ./buildDockerImage.sh -v <oracleのversion> -s -i
```

以下のようにoracleのイメージが表示されていればOKです。

```
$ docker images | grep oracle
oracle/database                      <oracle-version>                    784b3e60b30a        2 days ago          8.43GB
```


## Laradockの設定

Laradockをクローンします。

```bash
$ cd ~/laracle
$ git clone https://github.com/laradock/laradock.git
```

`docker-compose.yaml`のservicesにoracleの設定を追加します。`image`のバージョンはダウンロードしたoracleに合わせてください。

```yaml:~/laracle/laradock/docker-compose.yaml
...
### Oracle ################################################
    oracle:
      image: oracle/database:<oracle-version>
      ports:
        - 1521:1521
      environment:
        ORACLE_SID: ${ORACLE_SID}
        ORACLE_PDB: ${ORACLE_PDB}
        ORACLE_PWD: ${ORACLE_PWD}
        ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET}
      volumes:
        - ${DATA_PATH_HOST}/oracle:/opt/oracle/oradata
      networks:
        - backend
...
```

`env-example`にも以下のコードを追加します。

```bash:~/laracle/laradock/env-example
...
### Oracle ################################################
ORACLE_SID=ORCLCDB
ORACLE_PDB=ORCLPDB1
ORACLE_PWD=secret
ORACLE_CHARACTERSET=AL32UTF8
...
```

`env-example`をコピーし、`.env`の以下の項目の値を書き換えます。

```
$ cp env-example .env
```

```dot:.env
APP_CODE_PATH_HOST=~/laracle/my_project
DATA_PATH_HOST=~/.laradock/my_project
COMPOSE_PROJECT_NAME=my_project
WORKSPACE_INSTALL_OCI8=true
PHP_FPM_INSTALL_OCI8=true
ORACLE_PWD=<Oracleの初期パスワードに設定したい値>
```

下記コマンドでコンテナを立ち上げます。oracle18cのコンテナのログを確認し、`ORACLE_PWD` で設定したパスワードが表示されていることを確認してください。
`DATABASE IS READY TO USE!` が表示されたら初期化は完了なので、ctrl + cで抜けてしまってOKです。

```bash
$ docker-compose up -d workspace php-fpm nginx oracle
$ docker-compose logs -f oracle

Attaching to my_project_oracle_1
oracle_1            | ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: <ORACLE_PWDに設定した値>
oracle_1            |
oracle_1            | LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 09-SEP-2020 07:56:56
...
...
#########################
DATABASE IS READY TO USE!
#########################
..
```

## OracleのUser作成

Laravelで使用するためのユーザーをOracleに作成します。

```bash
$ cd ~/laracle/laradock
$ docker-compose exec oracle bash

# dockerコンテナ内
$ sqlplus system/${ORACLE_PWD}@ORCLPDB1
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB1

SQL> create user laracle_user identified by laracle_pass default tablespace users temporary tablespace temp;
User created.

SQL> grant connect, resource to laracle_user;
Grant succeeded.

SQL> alter user laracle_user quota unlimited on users;
User altered.

SQL> exit
Disconnected from Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
```

作成したユーザーで接続、テーブルの作成などの操作ができることを確認します。

```bash
$ sqlplus laracle_user/laracle_pass@ORCLPDB1

SQL> create table test_table ( id varchar2(8) not null primary key);
Table created.

SQL> insert into test_table (id) values ('01234');
1 row created.

SQL> select * from test_table;
ID
--------
01234

SQL> drop table test_table;
Table dropped.

SQL> exit
Disconnected from Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
```


## LaravelからOracleへの接続

まず、laradockのworkspaceコンテナにアタッチし、Laravelプロジェクトを作成します。

```bash
$ cd ~/laracle/laradock
# コンテナにアタッチ
$ docker-compose exec workspace bash

# プロジェクト作成
$ composer create-project laravel/laravel ./
```

続いて、Oracleに接続するために必要なライブラリのインストールと設定を行います。

```bash

$ composer require yajra/laravel-oci8
```

`config/app.php` に以下を追加します。

```php:config/app.php
Yajra\Oci8\Oci8ServiceProvider::class,
```

下記コマンドを実行して設定ファイルを書き出します。

```php
$ php artisan vendor:publish --tag=oracle
```

最後に`.env` の以下の項目の値を書き換えます。

```bash:.env
DB_CONNECTION=oracle
DB_HOST=oracle
DB_PORT=1521
DB_DATABASE=
DB_SERVICE_NAME=ORCLPDB1
DB_USERNAME=laracle_user
DB_PASSWORD=laracle_pass
DB_CHARSET=AL32UTF8
DB_SERVER_VERSION=18c
```

DBのマイグレートが実行できれば成功です。

```bash

$ artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.08 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.07 seconds)
```