0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

Model

やること###

$fillableを記述する。

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

 前知識として

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

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

.php

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

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

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

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

使い所

.php
//この一文で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, //⬅カラムに画像名追加
        ]);
    }

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?