LaravelのAuthでユーザー登録時に、画像を登録したい。


Model

やること

$fillableを記述する。

User.php
    protected $fillable = [
        'name',
        'email',
        'password',
        'avatar_file_name',// ⬅追加(画像のパス名カラム)
    ];

 前知識として

Eloquentモデルにおけるfillable属性
ホワイトリストのこと。
指定したカラムのみが、Modelに持たせることができる。

見れば分かる$fillableの機能⬇


protected $fillable = ['title', 'body'];

$book = new Book([
    'name' => 'Soseki Natsume',
    'title' => '猫',
    'body' => '吾輩は猫である',
    'published' => '1990'
]);

$book->getAttributes(); 
 ['name' => 'Soseki Natsume', 'title' => '猫',]

$bookには$fillableで指定したカラム以外は入っていないことが分かる

使い所

//この一文でfillabeに指定しているカラムは全て格納される。
//idなどは、書かなくてよいはず
Book::create($request->all());

参考

属性 機能 説明 
$guard ブラックリスト 禁止したもの以外は入れる。
$fillable ホワイトリスト 許可したもの以外は入れない。

View

やること

formタグに、enctype="multipart/form-data"を追加する。
(form要素で enctype属性の値を"multipart/form-data"にする。)
ただのURLエンコード➡マルチパート(メディア送信に対応)

register_blade.php

<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data">
      @csrf

前知識として

form要素は、enctype属性を指定できる。
enctype属性で、送信時のMIMEタイプを指定できる。

MIMEタイプ=メディアタイプ
Multipurpose Internet Mail Extensions
文書、ファイル、またはバイト列の性質や形式を示す標準

概要
application/x-www-form-urlencoded URLエンコード (デフォルト)
multipart/form-data マルチパート

URLエンコード:(あ → %E3%81%82)

Controller

やること

使用するクラスを増やす。

RegisterController.php
:
:
use Illuminate\Http\File;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
:
:

画像保存用のメソッドを追加する。

RegisterController.php
    private function saveAvatar(UploadedFile $file): string
    {
        $tempPath = $this->makeTempPath();
        Image::make($file)->fit(200, 200)->save($tempPath);
        $filePath = Storage::disk('public')
            ->putFile('avatars', new File($tempPath));
        return basename($filePath);
    }

   private function makeTempPath(): string
   {
       $tmp_fp = tmpfile();
       $meta   = stream_get_meta_data($tmp_fp);
       return $meta["uri"];
   }

バリデーターを追記する。

RegisterController.php
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'introduction' =>['required', 'string', 'max:255'],
            'avatar' => ['required', 'image'],
        ]);

createアクション内に画像保存の処理を追加する。

RegisterController.php
    protected function create(array $data)
    {

            $fileName = $this->saveAvatar($data['avatar']); //⬅privateで定義したメソッド呼び出し

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'avatar_file_name' => $fileName, //⬅カラムに画像名追加
        ]);
    }