laravelでマルチドメイン対応

#laravelプロジェクトでマルチドメイン対応の備忘録
概要：アンケートページのドメインとそれ以外のドメインで分けたい。

##マルチドメインとは
一つのサーバーで複数のドメインを管理する運営方法。
メリット：複数のドメインを一つのサーバーで管理できるのは楽。サーバー費用が削減できる
https://sakuramarina.com/episode_11/

##やり方の概要
①　.envファイルにドメインを設定する
②　config/app.phpでドメイン名を定義
③　ミドルウェアの作成
④　app/Http/kernel.phpでミドルウェアの登録
⑤　web.phpでrouteをミドルウェアごとにまとめる

## 1.envファイルにドメインを設定する
どこでもいいので、ドメインを設定します。
今回はステージングの環境なのでlocalの値です。

```php:.env

MAIN_DOMAIN=127.0.0.1
SURVEY_DOMAIN=localhost

```
## 2.ドメインを定義する

```php:app.php
return 
[
'main' => env('MAIN_DOMAIN', '127.0.0.1'),
'survey' => env('SURVEY_DOMAIN', 'localhost'),
]
```
## 3.ミドルウェアの作成
ミドルウェアとはリクエストをコントローラに渡す前のクッションのようなものと認識しています
https://codezine.jp/article/detail/11643

ミドルウェアの作成は以下のコマンド
`php artisan make:middleware Survey`

app.phpのsurveyキーは`app.survey`
 `request()->getHost()` 現在のURLのドメインを取得できる
https://stackoverflow.com/questions/39835650/how-do-you-get-the-http-host-with-laravel-5
現在のドメインがlocalhost以外だったら403を返す。

```php:Middleware/Survey.php
<?php

namespace App\Http\Middleware;

use Closure;

class Survey
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    
    public function handle($request, Closure $next)
    {
        if (config('app.survey') !== request()->getHost())
        {
            return \abort(403);
        }
        return $next($request);
    }
}

```
現在のドメインが127.0.0.1以外だったら403を返す。

```php:Middleware/Main.php
<?php

namespace App\Http\Middleware;

use Closure;

class Main
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(config('app.main') !== request()->getHost())
        {
            return \abort(403);
        }
        return $next($request);
    }
}

```

.envの値はconfigを使ってあげる必要がある
https://hiroto-k.hatenablog.com/entry/2018/03/28/213000


## 4.app/Http/kernel.phpでミドルウェアの登録

```php:Kernel.php
protected $routeMiddleware = [
 'domain.survey' => \App\Http\Middleware\Survey::class,
 'domain.main' => \App\Http\Middleware\Main::class,
]
```

## 5.web.phpでrouteをミドルウェアごとにまとめる

```php:web.php
Route::group(['middleware'=>['domain.main']],function()
{
  //ここにmainで使用するルートを書く
});

Route::group(['middleware'=>['domain.survey']],function()
{
  //ここにsurveyで使用するルートを書く
});
```

##詰まったところ
middlewareで期待した条件分岐にならなかったので、`var_dump(config('app.main'))`などとして中身を確認するとenvの値が反映されていなかった。app.mainはenvで設定したMAIN_DOMAIN=127.0.0.1なのに、中身は127.0.0.1:8000になっていた。最初envの設定は127.0.0.1:8000としていて途中で書き換えたが、環境変数はそのままキャッシュを持っていたためだった。
対応方法:envの値を反映させるために

```
php artisan config:cache
```

を行った。
https://qiita.com/kawax/items/ea881a6c18b8d4e94d83

##ミドルウェアでテストを通してあげる場合
ミドルウェアにテスト環境でのロジックを書いていないので、このままではテストを行うと全て403で返ってきてしまします。
なので、if文に追加してあげます。

```php:Survey.php

    public function handle($request, Closure $next)
    {
        if (
            config('app.survey') !== request()->getHost() &&
            config('app.env') !== 'testing'  //追加
        )
        {
            return \abort(403);
        }
        return $next($request);
    }
```

```php:Main.php

    public function handle($request, Closure $next)
    {
        if(
            config('app.main') !== request()->getHost() &&
            config('app.env') !== 'testing'  //追加
            )
        {
            return \abort(403);
        }
        return $next($request);
    }
```
app.envはenvファイルで定義されています。
testingはvalue値

```php:phpunit.xml

<php>
 <env name="APP_ENV" value="testing">
 ///省略
</php>
```