1
2

More than 3 years have passed since last update.

【Laravel】画像登録はModelでやると簡潔

Last updated at Posted at 2019-10-28

この記事の意図

Laravelは柔軟性があるフレームワークでどこでも(いいすぎかも)画像登録ができます。
その場合にどこで画像登録するのがいいの?ということがあるので、今回はModelでやることにします。

画像登録をModelでやるメリット

  • Controllerが整理でき、可読性が上がる
  • FormRequestでのvalidateが重要になるのでさらに可読性があがる
  • Modelに集約しやすくなる

サンプルコード

User Model

User.php
<?php

namespace App\Models;

use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable,SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'img',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
        'updated_at',
        'deleted_at',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function setImgAttribute($value)
    {
        $extension = $value->getClientOriginalExtension();
        $this->attributes['img'] = "storage/" . $value->storeAs(
            "users/{$this->id}",
            "img.{$extension}"
        );
    }
}

UserController

UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Requests\User\UpdateRequest;
use App\Models\User;

class AuthorController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(['auth', 'verified']);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  UpdateRequest  $request
     * @param  User  $user
     * @return \Illuminate\Http\Response
     */
    public function update(UpdateRequest $request, User $user)
    {
        DB::beginTransaction();
        try {
            $user->fill($request->all())->save();
            DB::commit();
        } catch (Exception $e) {
            DB::rollback();
            return back()->withInput()->with('error', "登録に失敗しました!\n{$e->getMessage()}");
        }
        return back()->with('success', '登録に成功しました!');
    }
}

UpdateRequest

UpdateRequest.php
<?php

namespace App\Http\Requests\Users;

use Illuminate\Foundation\Http\FormRequest;

class UpdateRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'img' => "nullable|file|image",
        ];
    }

    /**
     * Japanes attributes name when error
     * overide
     *
     * @return void
     */
    public function attributes()
    {
        return [
            'img' => "ユーザー画像",
        ];
    }
}

まとめ

どうでしょうか非常にシンプルです。もちろん状況によってこういう書き方でないほうがいい場合もあると思います。(たぶん)
状況に合わせていい選択ができるとよいですよね。ではまた!

1
2
1

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
1
2