CRUD Laravel 4如何链接销毁?

hel*_*rld 25 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");
}
Run Code Online (Sandbox Code Playgroud)

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

Tay*_*ler 33

为Laravel 5.x更新时间:08/21

关于Laravel 4的问题,但我包括这个以防万一找到Laravel 5.x答案的人在这里结束.表单助手(和其他一些)从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>
Run Code Online (Sandbox Code Playgroud)

您也可以使用{{ method_field('PUT') }}而不是写出隐藏的_method输入.

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

Laravel 4的原始答案

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

这是Boris Strahija 教程的一种可能性.

    {{ 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() }}
Run Code Online (Sandbox Code Playgroud)

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

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


pau*_*dru 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>
Run Code Online (Sandbox Code Playgroud)

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

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

    return $affectedRows;
}
Run Code Online (Sandbox Code Playgroud)

 


小智 15

另一种"干净"的解决办法是让Rails的方式描述在这里:

  1. 在public中创建一个新的.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();');
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在包含jQuery之后,不要忘记在模板中包含.js文件.

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

    {{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
    
    Run Code Online (Sandbox Code Playgroud)

我喜欢这个,它似乎比Form::open();在刀片模板中膨胀你的代码更清晰.


the*_*ade 8

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

所以,在你的路线中,你可能会有这样的事情:

Route::resource('users', 'UsersController'); 这里的问题是,只有这样,才能到"消灭"的方法是发送具有名为"_method"的隐藏输入的"删除"一个价值POST请求.

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

现在你有,你可以从访问路线HTML::linkRoute,Route::url或任何你请.

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

编辑

我想澄清一下,虽然我已经解释了为什么它有点傻弯腰向后,以适应污物达标,它仍然是真实的,你的应用将更加安全,如果改变是通过POST请求只发.


Dut*_*IFF 8

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

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

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

在Laravel <5中,Forms和HTML包被自动拉入.在Laravel 5中,我们必须将此包添加到composer.json:

...
"required": {
  ...
  "laravelcollective/html": "^5.1"
}
...
Run Code Online (Sandbox Code Playgroud)

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

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

'aliases' => [
  ...
  'Form' => Collective\Html\FormFacade::class,
  'Html' => Collective\Html\HtmlFacade::class,
],
Run Code Online (Sandbox Code Playgroud)

以上将输出

<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>
Run Code Online (Sandbox Code Playgroud)

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