2016-09-10 2 views
1

왜 이런 일이 발생합니까? 이것은 모든 계정의 색인 목록입니다. 난 그냥 그 category.destroy 경로에 의해 특정 범주를 삭제할하지만Laravel Destroy 삭제하지 않는 옵션

index.blade.php

@extends('layouts.master') 
@section('title','All Categories') 
@section('contents') 
<div class="row"> 
    <div class="col-md-8 col-sm-4 col-md-offset-2"> 
     <div class="panel panel-default"> 
      <div class="panel-heading">All Categories</div> 
      <div class="panel-body"> 
       <article> 
        <div class="table-responsive-vertical shadow-z-1"> 
         <!-- Table starts here --> 
         <table id="table" class="table table-hover table-mc-light-blue"> 
          <thead> 
           <tr> 
            <th>ID No</th> 
            <th>Category</th> 
            <th>Edit/Delete</th> 
            <th>Status</th> 
           </tr> 
          </thead> 
          @foreach($categories as $category) 
          <tbody> 
           <tr> 
            <td data-title="ID">{{$category->id}}</td> 
            <td data-title="Name">{{$category->name}}</td> 
            <td><a href="{{ route('category.edit',$category->id) }}" class="btn btn-primary btn-sm pull-left">Edit</a> 
             &nbsp<a href="{{ route('category.destroy', $category->id) }}" class="btn btn-danger btn-sm">Delete</a> 
            </td> 

           </tr>   
          </tbody> 
          @endforeach 
         </table> 
        </div> 
       </article> 

      </div> 
     </div> 
    </div> 
</div> 
@endsection 
@section('js') 
{!!Html::script('assets/js/jquery.min.js')!!} 
{!!Html::script('assets/js/bootstrap.min.js') !!} 
<script> 
    $('#flash-overlay-modal').modal(); 
</script> 

<script> 
    $('div.alert').not('.alert-important').delay(3000).fadeOut(350); 
</script> 
@endsection 

의 CategoryController.php

public function destroy($id){ 
     $category = Category::findOrFail($id); 
     $category->delete(); 
     Session::flash('flash_message', 'Task successfully deleted!'); 
     return redirect()->route('category.index'); 
    } 

대신 그냥보기 특정 항목을 표시합니다 카테고리의 이 경로에 뭔가를

+0

경로에 대한 링크를 작성하면 파괴 경로가'GET'이 아니므로 실제로는 해당 경로에 액세스하지 않고 있으므로'DELETE'이므로 실제로는 파괴 경로에 작은 양식을 작성해야합니다 버튼을 사용하여 양식 작업을 실제 경로로 트리거 할 수 있습니다. –

답변

1

시도를 삭제하거나 아니에요 :

Route::get('category/{category}/destroy',[ 
    'uses'=>'CategoryController[email protected]', 
    'as' => 'category.destroy' 
]); 
+0

고맙습니다. – d3cypher

+0

@ A.Sand 이것이 작동하는 동안 GET 요청은 "읽기 전용"으로되어 있어야합니다. GET 요청에 데이터 수정을 허용하기를 원하지 않을 것입니다. 리소스 정의에 의해 생성 된 적절한 DELETE 라우트에 액세스하는 것이 더 나을 것입니다. – patricus

+0

@patricus 예, 안전하지는 않지만, 관리자 권한과 같은 인증을 통해 그의 요청을 보호한다면, 같은 취약점이 있습니까? – maudev

2

이 파괴 경로에 액세스하려면 DELETE HTTP 요청 동사를 사용해야합니다. HTML 링크는 GET 요청 만 허용합니다.

HTML 링크를 spoofs DELETE 방법을 사용하는 HTML 양식으로 변경하거나 restfulizer.js과 같은 것으로 검색하여 삭제 링크를 자동으로 양식을 삭제하도록 변환해야합니다.

제안 된 것처럼 삭제 기능을위한 GET 경로를 만들 수도 있지만 이로 인해 잠재적 인 결과가 발생할 수 있습니다. GET 및 HEAD 요청은 일반적으로 "읽기 전용"요청으로 간주되어야하며 데이터를 수정하면 안됩니다. POST, PUT, PATCH 및 DELETE 요청은 일반적으로 "쓰기"요청으로 간주됩니다. 웹 스파이더는 삭제 링크를 크롤링하여 모든 데이터를 삭제하거나 웹 브라우저가 페이지의 모든 GET 요청을 미리 가져올 수 있으므로 삭제 버튼을 클릭 한 사람이 없더라도 삭제 링크에 액세스 할 수 있습니다. GET 요청에서 데이터 수정을 시작할 때 발생할 수있는 잠재적 인 불쾌한 점이 많습니다. this answer에는 좋은 정보가 있습니다.

관련 문제