Laravel6.x 画像をリサイズしてアップロードする方法

 `Auth`の認証機能で作成された新ユーザー登録に画像のアップロード機能を追加していきます。画像アップロード処理は`Intervention Image`ライブラリを使用して画像をリサイズして保存する方法をやっていきます。
画像保存するにあたってusersテーブルにimg_nameカラムを追加する
[Intervention Imageについて](http://image.intervention.io/)


## 実装環境
* PHP 7.3
* Laravel 6.20.26

## 1.Intervention Imageをインストール
まずはライブラリをcomposerを使用してインストール

```
$ composer require intervention/image
```

次に `config/app.php ` でプロバイダーとエイリアスに追加する。

```PHP:config/app.php
'providers' => [
    Intervention\Image\ImageServiceProvider::class, 
],

'aliases' => [ 
     'Image' => Intervention\Image\Facades\Image::class,
],
```

## 2.画像アップロード処理
img_nameカラムを追加したので`App\User.php`で追加したカラムも保存できるよいうに`$fillable`にカラム名を追記する。

```PHP:app/User.php
protected $fillable = [
        'name', 'email', 'password', 'img_name',  //img_name追加
];
```

新規登録の処理が書いてある`app/Http/Controllers/Auth/RegisterController.php`にアップロード処理を追記する。

```PHP:app/Http/Controllers/Auth/RegisterController.php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\Facades\Image;  //Intervention Imageライブラリ：追記

class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest');
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], 
        ]);
    }

    protected function create(array $data)
    {


        if (isset($data['img_name'])) {
            $img_file = $data['img_name'];
            //画像がアップロードされたのか確認
            if ($img_file->isValid()) {
                //画像の拡張子取得
                $extension = $img_file->extension();
                //ファイル名作成
                $img_name = uniqid(mt_rand()) . '.' . $extension;
                //画像を編集して、保存
                $img = Image::make($img_file->getRealPath());
                $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name);
            } else {
                $img_name = '';
            }
        } else {
            $img_name = '';
        }

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'img_name' => $img_name,
        ]);
    }
}
```
###解説
validatorメソッドに画像のバリデーション追記。

```php
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], 
        ]);
    }
```

createメソッドに画像をリサイズして保存する処理を追記。
Laravelは画像のアップロードした際`/storage/app/public`配下にファイルが保存されるようになっているので、`/storage/app/public`配下にimagesディレクトリを作成してそこに保存するよいうにする。
また、サイトのページに公開する際は`publicフォルダ`が読み込まれるので`publicフォルダ`内に画像ファイルがなくてはいけない。
`/storage/app/public`から`public`にシンボリックリンクを作成することで画像表示できるよいうになる。
[php artisan storage:link](https://readouble.com/laravel/6.x/ja/filesystem.html)をコマンドプロンプトで実行する。

```php
 protected function create(array $data)
 {


        if (isset($data['img_name'])) {
            $img_file = $data['img_name'];
            //画像がアップロードされたのか確認
            if ($img_file->isValid()) {
                //画像の拡張子取得
                $extension = $img_file->extension();
                //ファイル名作成
                $img_name = uniqid(mt_rand()) . '.' . $extension;
                //画像を編集して、保存
                $img = Image::make($img_file->getRealPath());
                $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name);
            } else {
                $img_name = '';
            }
        } else {
            $img_name = '';
        }

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'img_name' => $img_name,
        ]);
    }
}

```