Laravel 5 で開発中だけ任意のユーザーに切り替えることが可能になるライブラリを使ってみる

Laravel new で紹介されていた https://laravel-news.com/sudo-su を使って、開発中だけ任意のユーザーに切り替えることが可能になるライブラリを使ってみたメモ。

## 使ってみる

https://github.com/viacreative/sudo-su から README.md 読むと使い方は書いてある。

```bash
$ composer require viacreative/sudo-su
```

して、 ServiceProvider に登録する。

その後、 `$ php artisan vendor:publish` して設定ファイルを書き出す。

で、 layout ファイルに以下を追記。

```php
@if (config('app.debug'))
    @include('sudosu::user-selector')
@endif
```

基本的にはコレで使える。

※ もし、 Model のパスを変更している場合は `config/sudosu.php` の user_model の値を変更しておく。

## 結構怖い

(例えば) `App\User.php` の登録済み一覧を選択してログインとかが可能に。

もちろん、未認証自体でも選択可能。(認証済みで信頼できる権限の時だけ表示とかもできるけど、安易に使うとすると、と、いうか、開発中に便利に使いたい場合ば認証してない状態からユーザー選択できると便利やんね。)

そんなわけで、迂闊に開発環境以外に混ざったら怖い。

## できるだけ、 local でしか使われないようにしてみる

1. `LocalServiceProvider@register` で登録する
2. `LocalServiceProvider@register` の中で、 `app()->isLocal()` で確実に .env の `APP_ENV` が `local` の時にしか `register` されないようにする
3. view でも念のため、 `app()->isLocal()` と `\VIACreative\SudoSu\ServiceProvider` が登録済みか確認する

取り敢えず、この方針で少しは安心感があるのではないかな、と。(あとは、 local 以外の環境で .env をちゃんと管理が必要。)

### まず、 LocalServiceProvider を準備。

※ Barryvdh\Debugbar, Barryvdh\LaravelIdeHelper, Laracasts\Generators も同じ環境でしか使わないつもりなので、同じファイルに書いてある。

```php
<?php

namespace App\Providers;

use Illuminate\Foundation\AliasLoader;
use Illuminate\Support\ServiceProvider;

class LocalServiceProvider extends ServiceProvider
{
    /**
     * localでのみ設定したいサービスプロバイダー
     *
     * @var array
     */
    protected $providers = [
        \Barryvdh\Debugbar\ServiceProvider::class,
        \Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
        \Laracasts\Generators\GeneratorsServiceProvider::class,
        \VIACreative\SudoSu\ServiceProvider::class,
    ];

    /**
     * localでのみ設定したいクラスエイリアス
     *
     * @var array
     */
    protected $aliases = [
        'Debugbar' => \Barryvdh\Debugbar\Facade::class,
    ];

    /**
     * アプリケーションサービスの初期化処理
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * アプリケーションサービスの登録
     *
     * @return void
     */
    public function register()
    {
        /** @var \Illuminate\Foundation\Application $app */
        $app = $this->app;
        if ($app->isLocal()) {
            $this->registerProviders();
            $this->registerAliases();
        }
    }

    /**
     * サービスプロバイダーの登録
     *
     * @return void
     */
    protected function registerProviders()
    {
        if (!empty($this->providers)) {
            foreach ($this->providers as $provider) {
                $this->app->register($provider);
            }
        }
    }

    /**
     * クラスエイリアスの登録
     *
     * @return void
     */
    protected function registerAliases()
    {
        if (!empty($this->aliases)) {
            $loader = AliasLoader::getInstance();

            foreach ($this->aliases as $alias => $facade) {
                $loader->alias($alias, $facade);
            }
        }
    }
}
```

### 次に、 `config/app.php` にて、準備した `LocalServiceProvider` を登録。

```php
// .....snip....
    'providers' => [
    // .....snip....
        // LocalServiceProvider
        App\Providers\LocalServiceProvider::class,
    // .....snip....
    ]
// .....snip........
```

### 最後に layout フィアルで念のため、 `app()->isLocal()` と `\VIACreative\SudoSu\ServiceProvider` が登録済みか確認して `@include('sudosu::user-selector')` を表示するようにする。

例えば、 `resources/views/layouts/app.blade.php` とかで以下を追記する。

```php
// .....sinp.....
    @if(app()->isLocal() and (app()->getProvider(\VIACreative\SudoSu\ServiceProvider::class) instanceof \VIACreative\SudoSu\ServiceProvider))
        @include('sudosu::user-selector')
    @endif
// .....sinp.....
```

これで少し安心な気もする。

けど、やっぱりどっかにミスがあると危険なライブラリな香り。

用法用量をお守り下さい的なやつ。