【问题标题】:Laravel: Route::resource() GET & POST work, but PUT & DELETE throw MethodNotAllowedHttpExceptionLaravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException
【发布时间】:2015-01-17 16:33:55
【问题描述】:

我正在编写一个 Web 服务 API(在 laravel 4.2 中)。
出于某种原因,基于 HTTP 方法,到我的一个控制器的路由选择性地失败了。

我的 routes.php 看起来像:

Route::group(array('prefix' => 'v2'), 
    function()
    {
        Route::resource('foo', 'FooController',
            [ 'except' => ['edit', 'create'] ]
            );
        Route::resource('foo.bar', 'FooBarController',
            [ 'except' => ['show', 'edit', 'create'] ]
            );
    }
);

因此,当我为
project.dev/v2/fooproject.dev/v2/foo/1234 网址尝试任何 GET / POST / PUT / PATCH / DELETE 方法时,一切正常。

但是,出于某种原因,只有 GET 和 POST 对 project.dev/v2/foo/1234/bar 有效。其他方法只是抛出 405 (MethodNotAllowedHttpException)。
(仅供参考,我通过 Advanced Rest Client Chrome 扩展程序发出请求。)

发生了什么事?
我错过了什么?

【问题讨论】:

  • 也许你的 API 只支持currentproject.dev/v2/companies/legalname/1234/

标签: php laravel routes url-routing


【解决方案1】:

如果您想在提交表单中使用 PUT 方法,请查看此链接 https://laravel.com/docs/5.6/routing#form-method-spoofing

但是如果你在你的项目中使用 ajax,你可以做这样的事情:

<form>
@method('PUT')
// your_element

在你的脚本上添加:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

$.ajax({
  url: {{ route('your_route', ':id') }},
  type: 'POST',
  data: data,
  dataType: 'json',
  cache: false,
}).done(function(data,status){
    // anything
}).fail(function(){
   // anything

});

【讨论】:

    【解决方案2】:

    只需在表单中添加一个隐藏的输入字段

        <input type="hidden" name="_method" value="PUT">
    

    并将表单方法保留为帖子

        <form method="post" action="{{action('')}}">
    

    【讨论】:

      【解决方案3】:

      我不知道旧的 Laravel 版本。但是我从 5.2 开始使用 Laravel,在使用 put、patch 或 delete 时需要包含隐藏的方法输入。

      例如:

      <input type="hidden" name="_method" value="PUT"> 
      

      查看https://laravel.com/docs/5.6/routing#form-method-spoofing

      【讨论】:

      • 救命!这对我有用。非常感谢
      【解决方案4】:

      对于使用 Laravel 版本 > 4.2 的用户,请使用:

      php artisan route:list
      

      这将给出您的应用程序中设置的路由列表。检查您的路线中是否允许 PUT 和 DELETE 路线。 405错误主要是因为这些方法没有路由。

      【讨论】:

      • 4.2 &gt; 4 以来略有误导 ;)
      【解决方案5】:

      解决了!
      运行php artisan routes可以找到答案。

      这表明 DELETE 和 PUT/PATCH 需要(需要)条形 ID。
      我碰巧忽略了这一点,因为这种特殊类型的“酒吧”只能有一种。轻松修复它只需将其添加到我的 URL 中,例如 project.dev/v2/foo/1234/bar/5678

      【讨论】:

        猜你喜欢
        • 2013-05-17
        • 2020-08-23
        • 2018-05-23
        • 2022-01-08
        • 2021-11-19
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多