laravelでの編集機能の実装

1.目的

投稿したものを編集して書き換えることができるようにします。

2.扱うもの

なし

3.手順

①web.phpに以下の内容を追記し編集画面そして投稿内容を更新できるようにします。

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', 'ItemsController@index');
//以下にedit,updateアクションを追記していきます。
Route::resource('/item','ItemsController',['only' =>['create','store','show','destroy','edit','update']]);

Auth::routes();

②ItemsControllerにshowアクション、updateアクションを加え以下のように追記していきます。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Item;
use Validator;

class ItemsController extends Controller
{
   /**
    * Display a listing of the resource.
    *
    * @return \Illuminate\Http\Response
    */
   public function index()
   {
       $items = Item::orderBy('created_at','desc')->get();
       return view('items.index',compact('items'));
       
   }
   /**
    * Show the form for creating a new resource.
    *
    * @return \Illuminate\Http\Response
    */
   public function create()
   {
       return view('items.create');
   }
   /**
    * Store a newly created resource in storage.
    *
    * @param  \Illuminate\Http\Request  $request
    * @return \Illuminate\Http\Response
    */
   public function store(Request $request)
   {
       $validator = Validator::make($request->all(),[
           'name' => 'required',
           'url' => 'required',
           'text' => 'required',
       ]);
       if($validator->fails()){
           return redirect('item/create')
               ->withInput()
               ->withErrors($validator);
       }
       $items = new Item;
       $items->name = $request->name;
       $items->url = $request->url;
       $items->text = $request->text;
       $items->save();
       return redirect('/');
   }
   public function show($id) {
       $item = Item::findOrFail($id);
       return view('items.show')->with('item', $item);
   }
   public function destroy($id){
       $item = Item::findOrFail($id);
       $item->delete();
       return redirect('/');
   }
   
   //以下追記
   public function edit($id){
       $items = Item::find($id);
       return view('items.edit')->with('item', $items);
   }
   public function update(Request $request,$id){
       $validator = Validator::make($request->all(),[
           'name' => 'required',
           'url' => 'required',
           'text' => 'required',
       ]);
       if($validator->fails()){
           return redirect('item/'.$id.'/edit')
               ->withInput()
               ->withErrors($validator);
       }
       $items = Item::find($id);
       $items->name = $request->name;
       $items->url = $request->url;
       $items->text = $request->text;
       $items->save();
       return redirect('/');
   }
   //ここまで
   
   /**
    * Display the specified resource.
    *
    * @param  int  $id
    * @return \Illuminate\Http\Response
    */
   
}

editアクション以下は、idからどの編集かを判断するために、$items = Item::find($id);としています。
そしてreturn view('items.edit')->with('item', $items);でビューを返しています。この時withで指定しないと変数をビューに渡すことができません。

また以下のようにも表記することができます。

return view('items.edit', compact('item'));

updateアクションのほどんどの表記は、storeアクションの記述とほとんど同じです。ただ、$items = Item::find($id);としてidからとってきたものを代入しています。

③app/resources/items以下にedit.blade.phpを作成します。
そして作成したファイルを以下のように編集します。

@extends('layouts.app')
@section('content')
 <div class="card-body">
   
   
   @include('common.errors')
   <form   action="{{ route('item.update' ,$item->id) }}" enctype="multipart/form-data" method="POST"
   class="form-horizontal">
     @csrf
     @method('PUT')
     <div class="form-group">
       <div class="card-title">
         題目
       </div>
       <div class="col-sm-6">
         <input type="text" name="name" value="{{ $item->name }}" class="form-control">
       </div>
       <div class="card-title">
         URL
       </div>
       <div class="col-sm-6">
         <input type="integer" name="url" value="{{ $item->url }}" class="form-control">
       </div>
       <div class="card-title">
         text
       </div>
       <div class="col-sm-6">
         <input type="text" name="text" value="{{ $item->text }}" class="form-control">
       </div>
     <div class="form-group">
       <div class="col-sm-offset-3 col-list">
         <button type="submit" class="btn btn-primary">
           Save
         </button>
       </div>
     </div>
     
   </form>
 </div>
 

@endsection

action="{{ route('item.update' ,$item->id) }}"とすることでupdateに送信しています。
また、更新できるようにするために擬似ホームメソッドを指定しています。

value="{{ $item->name }}"のようにすることで、投稿されている内容を表示します。

④編集画面に遷移できるようにするためにshow.blade.phpを以下のように編集します。

<div>{{ $item->name }}</div>
<div>{{ $item->url }}</div>
<div>{{ $item->text }}</div>
<form action="{{ url('item/'.$item->id) }}" method="post">
 @csrf
 @method('DELETE')
 <button type="submit" class="btn item-destroy">
   削除
 </button>
</form>
//以下追加
<a href="{{ action('ItemsController@edit', $item->id) }}">編集</a>
//ここまで

4.まとめ

これにて編集機能の完成です。
以下のように表示されたらOK!です。
ありがとうございました!!

画像1


この記事が気に入ったらサポートをしてみませんか?