PHP Laravel 6 추천 영화 투고 사이트 작성 과정 6 : 삭제 기능 작성 편

17363 단어 PHPLaravel6

라우팅



destroy를 사용합니다.
| DELETE    | recommends/{recommend}      | recommends.destroy | App\Http\Controllers\RecommendController@destroy                       | web          |

컨트롤러



모델의 델리트 메서드를 사용합니다.
edit 등과 달리, 델리트용 페이지를 준비할 필요가 없기 때문에 index로 리디렉션시킵니다.

recommend/app/Http/Controllers/RecommendController.php
public function destroy(Recommend $recommend)
    {
        $recommend->delete();
        return redirect()->route('recommends.index');
    }

index에서 destroy로 삭제할 데이터 보내기



destroy는 POST나 PUT과 마찬가지로 form 태그로 보내야 합니다.
이번에는 삭제 시 확인 메시지를 표시하도록 했습니다.

recommend/resources/views/recommends/index.blade.php
<table>
 <thead>
   <tr>
     <th>タイトル</th>
     <th>画像:現在は空</th>
     <th>URL</th>
     <th>操作</th>
   </tr>
 </thead>
 @foreach($recommends as $recommend)
   <tr>
     <td>{{$recommend->title}}</td>
     <td>{{$recommend->image_file_name}}</td>
     <td>{{$recommend->url}}</td>
     <td><a href="{{route('recommends.show', $recommend->id)}}">詳細</a></td>
     <td><a href="{{route('recommends.edit', ['recommend' => $recommend])}}">編集</a></td>
     <td>
      <form method='POST'action="{{route('recommends.destroy', ['recommend' => $recommend])}}">
     @csrf
     @method('DELETE')
     <button onclick="return confirm('本当に削除しますか?')" action="submit">削除</button>
     </td>
  @endforeach
 </table>

플래시 메시지 추가



몇 가지 방법이있는 것 같지만, 이번에는 가장 쉬운 것 같은 체인 메소드로 with 추가

recommend/app/Http/Controllers/RecommendController.php
public function destroy(Recommend $recommend)
    {
        $recommend->delete();
        return redirect()->route('recommends.index')->with('status', '削除しました');
    }

다음으로, 플래시를 표시하는 view를 작성해 갑니다.



투고·편집·삭제시에 표시시키고 싶기 때문에, 전용의 view 파일을 작성해, 표시시키고 싶은 view 파일에 include 시킵니다.
이번에는 _additonal 디렉토리에 alart.blade.php라는 view 파일을 만들었습니다.



view 파일의 내용에 대해서는, if 문으로 status 의 유무를 판단해, 경고를 표시하도록(듯이) 합니다.



status의 유무를 판단하는 방법은 session 메소드를 사용했습니다.

recommend/resources/views/_additional/alart.blade.php
@if(session()->has('status'))
<div>{{session('status')}}</div>
@endif

위를 view에 include



recommend/resources/views/recommends/index.blade.php
<div class="card-body">
    <table>
    @include('_additional.alart')
        <thead>
            <tr>
                <th>タイトル</th>
                <th>画像:現在は空</th>
                <th>URL</th>
                <th>操作</th>
            </tr>
        </thead>
        @foreach($recommends as $recommend)
        <tr>
            <td>{{$recommend->title}}</td>

            <td>{{$recommend->image_file_name}}</td>
            <td>{{$recommend->url}}</td>
            <td><a href="{{route('recommends.show', $recommend->id)}}">詳細</a></td>
            <td><a href="{{route('recommends.edit', ['recommend' => $recommend])}}">編集</a></td>
            <td>
                <form method='POST' action="{{route('recommends.destroy', ['recommend' => $recommend])}}">
                    @csrf
                    @method('DELETE')
                    <button onclick="return confirm('本当に削除しますか?')" action="submit">削除</button>
            </td>
            </form>
        </tr>
        @endforeach
    </table>
</div>


새 게시물 및 편집에도 플래시 메시지를 표시합니다.



update와 create에 같은 처리를 합니다.

recommend/app/Http/Controllers/RecommendController.php
public function update(Request $request, Recommend $recommend)
    {
        $recommend->update($request->all());
        return redirect()->route('recommends.show', compact('recommend'))->with('status', '編集しました');
    }

recommend/app/Http/Controllers/RecommendController.php
public function store(Request $request)
    {
        Recommend::create($request->all());
        return redirect()->route('recommends.index')->with('status', '投稿しました');
    }

recommend/resources/views/recommends/show.blade.php
<div class="card">
    <div class="card-header">{{ __('Login') }}</div>
    @include('_additional.alart')
    <div class="card-body">
        <table>
            <tr>
                <th>タイトル</th>
                <td>{{$recommend->title}}</td>
            </tr>
            <tr>
                <th>画像</th>
                <td>{{$recommend->image_file_name}}</td>
            </tr>
            <tr>
                <th>URL</th>
                <td>{{$recommend->url}}</td>
            </tr>
            <tr>
                <th>概要</th>
                <td>{{$recommend->description}}</td>
            </tr>
            <tr>
                <th>感想</th>
                <td>{{$recommend->Impressions}}</td>
            </tr>
        </table>
    </div>
</div>

밸리데이션



현재의 폼에서는, nulable로 공란을 허가하고 있는 것 이외를 공란으로 등록하려고 하면 에러 화면에 날려 버립니다.
이를 방지하기 위해 유효성 검사를 설정하고 입력 항목에 제한을 둡니다.

recommend/database/migrations/2020_09_23_105017_create_recommends_table.php
public function up()
    {
        Schema::create('recommends', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('image_file_name', 100)->nullable();
            $table->string('image_title',100)->nullable();
            $table->string('url');
            $table->string('description')->nullable();
            $table->string('Impressions')->nullable();
            $table->timestamps();
        });
    }

유효성 검사 설정 절차

양식 요청 작성
$ php artisan make:request RecommendPostRequest

요청에 적용할 유효성 검사 규칙 설정

recommend/app/Http/Requests/RecommendPostRequest.php
class recommendPostRequest 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 [
            'title' => 'required|max:20',
            'url' => 'required',
            'description' => 'max:200',
            'Impressions' => 'max:200',
        ];
    }
}

유효성 검사 규칙을 컨트롤러 메서드의 유형 힌트로 지정

recommend/app/Http/Controllers/RecommendController.php
use App\Http\Requests\RecommendPostRequest;

recommend/app/Http/Controllers/RecommendController.php
 public function store(RecommendPostRequest $request)
    {
        Recommend::create($request->all());
        return redirect()->route('recommends.index')->with('status', '投稿しました');
    }

recommend/app/Http/Controllers/RecommendController.php
public function update(RecommendPostRequest $request, Recommend $recommend)
    {
        $recommend->update($request->all());
        return redirect()->route('recommends.show', compact('recommend'))->with('status', '編集しました');
    }

오류 메시지 표시



유효성 검사를 위반하면 자동으로 오류 메시지를 생성합니다.
그것을 설정하기 위해 다음과 같이 설명했습니다.

recommend/resources/views/recommends/edit.blade.php
<tr>
    <th><input type="text" name='title' value="{{$recommend->title ?? ''}}"></th>
      @error('title')
      <span class="invalid-feedback" role="alert">
          <strong>{{ $message }}</strong>
      </span>
      @enderror
    <th><input type="URL" name='url' value="{{$recommend->url ?? ''}}"></th>
      @error('url')
      <span class="invalid-feedback" role="alert">
          <strong>{{ $message }}</strong>
      </span>
      @enderror
    <th><textarea name="description" id="" cols="30" rows="10">{{$recomend->description ?? ''}}</textarea></th>
    <th><textarea name="Impressions" id="" cols="30" rows="10">{{$recomend->Impressions ?? ''}}</textarea></th>
</tr>

좋은 웹페이지 즐겨찾기