使用POST的Laravel href

时间:2016-06-14 07:57:03

标签: laravel parameter-passing action

我正在尝试使用操作href将一些数据传递给我的控制器。我不知道为什么,但laravel使用 GET 方法传递数据,但我需要 GET 而不是 GET POST 。我真的不明白为什么laravel这样做并且找不到答案。我做了多次,我的语法似乎是正确的。有人可以看看吗?

刀片:

 <td>
 @foreach($products as $product)
        <a href="{{ action('ProductsController@delete', $product->id ) }}">
        <span class="glyphicon glyphicon-trash"></span></a> 
               {{ $product->name }},
 @endforeach
 </td>

我的路线:

Route::post('delete', ['as' => 'delete', 'uses' => 'ProductController@delete']);

在我的控制器中只是一个:

public function delete()
{
    return 'hello'; // just testing if it works
}

错误:

MethodNotAllowedHttpException in RouteCollection.php line 219....

我知道这是一个get方法,因为如果我试图将数据传递给我的控制器,我的URL看起来像这样:

blabla.../products/delete?10 

我的语法有问题吗?我真的不明白为什么它使用get方法。 我还尝试了data-method="post"我的<a>标签,但这也没有用。

感谢您抽出宝贵时间。

4 个答案:

答案 0 :(得分:7)

当您使用<a href=example.com>等锚点建立链接时,您的方法将始终为GET。这就像在浏览器中打开URL一样,您发出了GET请求。

您应该使用表单将POST请求发送到控制器的delete方法。假设你有HTML和表单的Illuminate HTML包,你可以这样做:

{!! Form::open(['method' => 'DELETE', 'route' => $route]) !!}
{!! Form::submit('delete', ['onclick' => 'return confirm("Are you sure?");']) !!}
{!! Form::close() !!}

修改 使用按钮标记:

{!! Form::open(['method' => 'DELETE', 'route' => $route]) !!}
<button type="submit"><i class="glyphicon glyphicon-remove"></i>Delete</button>
{!! Form::close() !!}

答案 1 :(得分:1)

这是你的问题:

<a href="{{ action('ProductsController@delete', $product->id ) }}">

始终通过GET提交锚标记。它是一个内置的HTTP,并不是Laravel特有的。

提交表单时指定POST HTTP Verb或者HTTP方法由指定POST作为HTTP谓词的AJAX请求调用。

相反,请考虑提交所需内容的表单中的submit类型按钮。

    <td>
        @foreach($products as $product)
            <form method="POST" action="{{ route('delete') }}">
                <input type="hidden" name="product_id" value="{{ $product->id }}">
                {!! csrf_field() !!}
                <button type="submit" class="btn">
                    <span class="glyphicon glyphicon-trash"></span>
                </button>
            </form>
            {{ $product->name }},
        @endforeach
    </td>

然后在你的控制器中:

    public function delete()
    {
        // 'Die Dump' all of the input from the form / request
        dd( request()->input()->all() );

        // 'Die Dump' the specific input from the form
        dd( request()->input('product_id') );
    }

您将开始了解GET和POST请求在发送键/值对时的不同。

了解更多信息:

http://www.tutorialspoint.com/http/http_methods.htm

答案 2 :(得分:0)

最适合laravel7。首先定义具有给定表单ID的表单。

@auth
   <form id="logout-form" action="{{ route('logout') }}" method="POST" 
     style="display: none;">
       @csrf
  </form>
 @endauth

然后可以使用anchor标签进行注销操作。在后台,javascript可以正常工作。无论何时注销,然后对给定的post方法和注销路径的表单方法进行操作即可。

<a class="nav-link dropdown-toggle text-muted waves-effect waves-dark"
                              href="{{ route('logout') }}" onclick="event.preventDefault();document.getElementById('logout-form').submit();"
id="2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 
                                  <i class="mdi mdi-logout"></i>
</a>

最大的好处是,表单并非非必需地加载。 到目前为止已登录,否则未加载

答案 3 :(得分:0)

Laravel 7

通过jQuery

<form id="form" action="{{route('route_name')}}" method="POST">@csrf</form>
<a href="javascript:void(0)" onclick="$('#form').submit()"></a>

通过JS

<form id="form" action="{{route('route_name')}}" method="POST">@csrf</form>
<a href="javascript:void(0)" onclick="document.getElementById('form').submit()"></a>