CRUD Laravel 4如何链接销毁?

时间:2013-10-28 19:30:57

标签: php laravel laravel-4

我会用HTML链接销毁我的用户,但它似乎没有生成正确的链接,我做错了什么?

public function destroy($id)
{
    //Slet brugeren
    $e = new User($id);
    $e->destroy();

    //Log også brugeren ud
    Auth::logout();

    //redrect til forsiden
    Redirect::to("users/create");
}

在我看来,我称之为 {{URL::action('UserController@destroy', array($user->id))}}

9 个答案:

答案 0 :(得分:33)

更新08/21/2017 for Laravel 5.x

问题是关于Laravel 4的问题,但是如果有人在寻找Laravel 5.x的答案,我会把它包括在内。表单助手(和其他一些人)aren't available as of 5.x。如果您正在执行除GET或POST之外的操作,则仍需要在表单上指定方法。这是目前实现这一目标的方法:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <!-- other inputs... -->
</form>

您也可以使用{{ method_field('PUT') }}代替写出隐藏的_method输入。

请参阅https://laravel.com/docs/5.4/routing#form-method-spoofing

Laravel 4的原始答案

我认为当您点击该链接时,它可能会向该终点发送GET请求。 Laravel中的CRUD根据REST工作。这意味着它期待DELETE请求而不是GET。

这是Boris Strahija tutorial的一种可能性。

    {{ Form::open(array('route' => array('admin.pages.destroy', $page->id), 'method' => 'delete')) }}
        <button type="submit" class="btn btn-danger btn-mini">Delete</button>
    {{ Form::close() }}

这样,您可以使用DELETE方法以表单形式发送请求。这篇文章解释了为什么传统链接不起作用:

  
    

您可能会注意到删除按钮位于表单内。原因是我们的控制器的destroy()方法需要DELETE请求,这可以通过这种方式完成。如果按钮是一个简单的链接,请求将通过GET方法发送,我们不会调用destroy()方法。

  

答案 1 :(得分:17)

一个很酷的ajax解决方案就是这样:

function deleteUser(id) {
    if (confirm('Delete this user?')) {
        $.ajax({
            type: "DELETE",
            url: 'users/' + id, //resource
            success: function(affectedRows) {
                //if something was deleted, we redirect the user to the users page, and automatically the user that he deleted will disappear
                if (affectedRows > 0) window.location = 'users';
            }
        });
    }
}

<a href="javascript:deleteUser('{{ $user->id }}');">Delete</a>

在UserController.php中我们有这个方法:

public function destroy($id)
{
    $affectedRows  = User::where('id', '=', $id)->delete();

    return $affectedRows;
}

答案 2 :(得分:15)

另一个&#34;清洁&#34;解决方案是使其成为here所述的Rails方式:

  1. 在公共场合创建一个新的.js文件并编写此函数:

    $(function(){
       $('[data-method]').append(function(){
            return "\n"+
            "<form action='"+$(this).attr('href')+"' method='POST' style='display:none'>\n"+
            "   <input type='hidden' name='_method' value='"+$(this).attr('data-method')+"'>\n"+
            "</form>\n"
       })
       .removeAttr('href')
       .attr('style','cursor:pointer;')
       .attr('onclick','$(this).find("form").submit();');
    });
    
  2. 在包含jQuery之后,不要忘记在模板中包含.js文件。

  3. 使用经典link_to()link_to_method()函数创建删除记录的链接。请记住包含"data-method"="DELETE"参数:

    {{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
    
  4. 我喜欢这一点,它似乎比在刀片模板中使用Form::open();膨胀您的代码更清晰。

答案 3 :(得分:8)

这是一个古老的问题,但我只是在寻找一个快速的答案,并且对这些问题都不满意。对于遇到同样问题的人,我建议创建一条新路线。过分担心crud合规性是愚蠢的,因为HTML上没有这样的东西;任何解决方案都只是鞋角,无论是隐藏的形式领域还是获取路线。

所以,在你的路线中,你可能有这样的东西:

Route::resource('users', 'UsersController'); 这样做的问题是,获取“destroy”方法的唯一方法是发送一个post请求,其中有一个名为“_method”的隐藏输入和一个“DELETE”值。

只需在该行下添加: Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'UsersController@destroy']);

现在,您可以通过HTML::linkRouteRoute::url或其他任何方法访问该路线。

例如: {{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}

修改

我想澄清一下,虽然我已经解释了为什么向后弯曲以适应crud合规性有些愚蠢,但如果仅通过POST请求进行更改,您的应用程序仍然会更安全。

答案 4 :(得分:8)

对于那些希望在Laravel 5中创建删除按钮的人:

{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'delete']) !!}
  {!! Form::submit('Delete', ['class'=>'btn btn-danger btn-mini']) !!}
{!! Form::close() !!}

这与Tayler的答案类似,但我们使用新的刀片转义标记({!!!!}),我们使用Form外观生成按钮,我们使用更优雅链接到控制器的方法。

在Laravel&lt; 5 Forms & HTML package被自动拉入。在Laravel 5中,我们必须将此包添加到composer.json

...
"required": {
  ...
  "laravelcollective/html": "^5.1"
}
...

现在在config/app.php中添加服务提供商和别名:

...
'providers' => [
  ...
  Collective\Html\HtmlServiceProvider::class,
],

'aliases' => [
  ...
  'Form' => Collective\Html\FormFacade::class,
  'Html' => Collective\Html\HtmlFacade::class,
],

以上将输出

<form method="POST" action="https://yourdomain.tld/users/1" accept-charset="UTF-8">
  <input name="_method" type="hidden" value="DELETE">
  <input name="_token" type="hidden" value="xxxCrAZyT0K3nsTr!NGxxx">
  <input class="btn btn-danger btn-mini" type="submit" value="Delete">
</form>

如果您使用的是其他表单构建器,请确保它生成类似于上面的内容。

答案 5 :(得分:4)

想要在表单外发送DELETE请求吗?

好吧,Jeffrey Way创建了一个很好的javascript,可以为您创建表单并使用它,您只需要将data-method="delete"添加到删除链接。

要使用,请导入script,然后使用data-method="DELETE"属性创建链接。

脚本:

(function() {

  var laravel = {
    initialize: function() {
      this.methodLinks = $('a[data-method]');

      this.registerEvents();
    },

    registerEvents: function() {
      this.methodLinks.on('click', this.handleMethod);
    },

    handleMethod: function(e) {
      var link = $(this);
      var httpMethod = link.data('method').toUpperCase();
      var form;

      // If the data-method attribute is not PUT or DELETE,
      // then we don't know what to do. Just ignore.
      if ( $.inArray(httpMethod, ['PUT', 'DELETE']) === - 1 ) {
        return;
      }

      // Allow user to optionally provide data-confirm="Are you sure?"
      if ( link.data('confirm') ) {
        if ( ! laravel.verifyConfirm(link) ) {
          return false;
        }
      }

      form = laravel.createForm(link);
      form.submit();

      e.preventDefault();
    },

    verifyConfirm: function(link) {
      return confirm(link.data('confirm'));
    },

    createForm: function(link) {
      var form = 
      $('<form>', {
        'method': 'POST',
        'action': link.attr('href')
      });

      var token = 
      $('<input>', {
        'type': 'hidden',
        'name': 'csrf_token',
          'value': '<?php echo csrf_token(); ?>' // hmmmm...
        });

      var hiddenInput =
      $('<input>', {
        'name': '_method',
        'type': 'hidden',
        'value': link.data('method')
      });

      return form.append(token, hiddenInput)
                 .appendTo('body');
    }
  };

  laravel.initialize();

})();

答案 6 :(得分:2)

对于那些希望在laravel 5中使用锚标记创建删除按钮的人。

{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'DELETE', 'name' => 'post_' . md5($user->id . $user->created_at)]) !!}
    <a href="javascript:void(0)" title="delete" onclick="if (confirm('Are you sure?')) { document.post_<?= md5($user->id . $user->created_at) ?>.submit(); } event.returnValue = false; return false;">
        <span class="icon-remove"></span>
    </a>
{!! Form::close() !!}

答案 7 :(得分:1)

我尝试了你的代码,像这样使用它并且工作:

    <a href="{{URL::action('UserController@destroy',['id'=>$user->id]) }}" 
onclick=" return confirm('Are you sure you want to delete this?')" 
class="btn btn-default">
   DELETE     </a>

我认为唯一的问题出在你的阵列中:

['id'=>$user->id]

答案 8 :(得分:0)

{{Form::open(['method'=>'delete','action'=>['ResourceController@destroy',$resource->id]])}}
 <button type="submit">Delete</button>                      
{{Form::close()}}