Laravel CollectiveのPATCHとupdateメソッド

Laravel Collectiveで、編集する際は、Controllerから送られてきた$idに対し、Form::Model($user, [‘method’=>’PATCH’, …と書くだけ。

AdminUsersController.php

public function edit($id)
    {
        $user = User::FindOrFail($id);
        $roles = Role::lists('name', 'id')->all();
        return view('admin.users.edit', compact(['user','roles']));
    }

View: index.blade.php
{{route(‘admin.users.edit’, $user->id)}}で、Editページへのリンク

<tr>
			  <td>{{$user->id}}</td>
			  <td><img height="50" src="/{{$user->photo ? $user->photo->file : ''}}"></td>
			  <td><a href="{{route('admin.users.edit', $user->id)}}">{{$user->name}}</a></td>
			  <td>{{$user->email}}</td>
			  <td>{{$user->role->name}}</td>
			  <td>{{$user->is_active == 1 ? 'Active' : 'No Active'}}</td>
			  <td>{{$user->created_at->diffForHumans()}}</td>
			  <td>{{$user->updated_at->diffForHumans()}}</td>
			</tr>

edit.blade.php
->create.blade.phpをコピー
collectiveは、Form::Model($user, [‘method’=>’PATCH’, ‘action’=>[‘AdminUsersController@update’,$user->id], ‘files’=>true])と書く

{!! Form::Model($user, ['method'=>'PATCH', 'action'=>['AdminUsersController@update',$user->id], 'files'=>true]) !!}
        {{ csrf_field()}}
 
        <div class="form-group">
            {!! Form::label('name', 'Name') !!}
            {!! Form::text('name', null, ['class'=>'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('email', 'Email') !!}
            {!! Form::email('email', null, ['class'=>'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('role_id', 'Roles') !!}
            {!! Form::select('role_id',$roles, null, ['class'=>'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('is_active', 'Status') !!}
            {!! Form::select('is_active',array(1 => 'Active', 0 =>'Not Active'), null, ['class'=>'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('password', 'password') !!}
            {!! Form::password('password', null, ['class'=>'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::label('photo_id', 'Photos') !!}
            {!! Form::file('photo_id', null, ['class'=>'form-control']) !!}
        </div>
        
        <div class="form-group">
            {!! Form::submit('Create Post', ['class'=>'btn btn-primary']) !!}
        </div>
    {!! Form::close() !!}

### 画像の表示
画像がないときは、placehold.itの画像を表示する🤩

<div class="col-sm-3">
        <img src="{{$user->photo ? '/'.$user->photo->file : 'https://placehold.it/400x400'}}" alt="" class="img-responsive img-rounded">
    </div>

AdminUsersController.php

public function update(UsersRequest $request, $id)
    {
        //
        $user = User::findOrFail($id);
        $input = $request->all();

        if($file = $request('photo_id')){
            $name = time(). $file->getClientOriginalName();
            $file->move('images', $name);

            $photo = Photo::create(['file'=>$name]);

            $input['photo_id'] = $photo->id;
        }

        $input['password'] = bcrypt($request->password);
        $user->update($input);
        return redirect('/admin/users');
    }

$ php artisan make:request UsersEditRequest

Request/UsersEditRequest.php

public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required',
            'role_id' => 'required',
        ];
    }

AdminUsersController

use App\Http\Requests\UsersEditRequest;
public function update(UsersEditRequest $request, $id)
    {
        //
        $user = User::findOrFail($id);
        if($request->password == '' ){
            $input = $request->except('password');
        } else {
            $input = $request->all();
            $input['password'] = bcrypt($request->password);
        }

        if($file = $request->file('photo_id')){
            $name = time(). $file->getClientOriginalName();
            $file->move('images', $name);

            $photo = Photo::create(['file'=>$name]);

            $input['photo_id'] = $photo->id;
        }

        $user->update($input);
        return redirect('/admin/users');
    }

img src=”{{$user->photo ? ‘/’.$user->photo->file : ‘https://placehold.it/400×400’}}” alt=”” class=”img-responsive img-roundedの書き方は面白い。placeholdは画像化してimgフォルダに格納して呼び出していましたが、CDNのような使い方ができるのであれば、その方が楽。