【问题标题】:DELETE method doesn't work inside a PHP variableDELETE 方法在 PHP 变量中不起作用
【发布时间】:2020-04-26 21:54:25
【问题描述】:

我正在使用 laravel,我正在尝试进行 Ajax 实时搜索,我设法让它工作,但是 @csrf 和 @method('DELETE') 在我的代码中不起作用

foreach ($data as $row) {
                $output .= '<div class="col s4 m4">
                <div class="card blue-grey darken-1">
                    <div class="card-content white-text">
                        <span class="card-title center">'. $row->first_name.' '.$row->last_name.'</span>
                        <p><u>id</u>: '. $row->id.'</p>
                        <p><u>email</u>: '. $row->email.'</p>
                        <p><u>Phone</u>: '. $row->phone.'</p><br>
                    </div>
                    <div class="card-action">
                        <a href="/users/'. $row->id.'" class="waves-effect waves-light btn">Infos</a>
                        <a href="/users/'. $row->id.'/edit" class="waves-effect waves-light btn">Edit</a>
                        <a class="waves-effect waves-light btn modal-trigger center-align" href="#modal1">Delete<i class="material-icons right">delete</i></a>
                    </div>
                </div>
            </div>

            <div id="modal1" class="modal">
                <div class="modal-content">
                    <h4>Delete User</h4>
                    <p>Are you sure to delete this user?</p>
                </div>
                <div class="modal-footer">
                    <a href="#" class="modal-action modal-close waves-effect waves-red btn-flat ">Cancel<i class="material-icons right">close</i></a>
                    <form action="/users/'. $row->id.'" method="POST">
                        @csrf                  {{-- Doesn't work --}}
                        @method("DELETE")      {{-- Doesn't work --}}
                        <button class="modal-action modal-close waves-effect waves-green btn-flat" type="submit" name="action" value="delete">Confirm
                        <i class="material-icons right">check</i></a>
                    </form>
                </div>
            </div>
            <script type="text/javascript">
                $(document).ready(function(){
                    $("#modal1").modal();
                });
            </script>';
            }

它显示了这个错误:

此路由不支持 POST 方法。支持的方法:GET、HEAD、PUT、DELETE。

并且@csrf / @method('DELETE') 出现在我的页面中,就好像它是一个跨度一样。 对不起我的英语我尽量说清楚。

【问题讨论】:

  • 你使用的是哪个 Laravel 版本?

标签: laravel


【解决方案1】:

首先 @csrf 和 @method 是 Laravel-blade 指令,所以它会 必须在刀片文件中定义。否则将无法正常工作。

要使用,您可以从控制器传递数据以查看和定义刀片文件中的所有 html 代码。

【讨论】:

    【解决方案2】:

    您没有使用刀片模板,因此您不能在那里使用@csrf 或@methos。 2 个选项供您选择:

    1. 您可以重构代码以使用 Blade,这将是 Laravel 开发人员的推荐选项,您可以在文档中看到它的完整扩展:https://laravel.com/docs/7.x/blade
    2. 您可以在代码中插入 PHP 等效项
    
        <form action="/users/'. $row->id.'" method="POST">
            <input type="hidden" name="_token" value=".' csrf_token() '.">
            <input type="hidden" name="_method" value="DELETE">
            <button class="modal-action modal-close waves-effect waves-green btn-flat" type="submit" name="action" value="delete">Confirm
            <i class="material-icons right">check</i></a>
        </form>
    
    

    【讨论】:

    • 是的,我 5 分钟前才发现它,现在它工作得很好。谢谢你的回复:)
    • 很高兴能提供任何帮助?
    【解决方案3】:

    最好使用路由名称。表示而不是使用:

    <form action="/users/'. $row->id.'" method="POST">
          @csrf                  {{-- Doesn't work --}}
          @method("DELETE")      {{-- Doesn't work --}}
          <button class="modal-action modal-close waves-effect waves-green btn-flat" type="submit" name="action" value="delete">Confirm
             <i class="material-icons right">check</i>
          </button>
    </form>
    

    使用:

     <form action="{{ route('users.delete') }}" method="POST">
            @csrf                  
            @method("DELETE")
            <button class="modal-action modal-close waves-effect waves-green btn-flat" type="submit" name="action" value="delete">Confirm
            <i class="material-icons right">check</i>
     </button>
     </form>
    

    可能{{ route('users.delete') }} 对您不存在,因此您可以使用命令php artisan route:list 查看所有路由,并为删除方法使用正确的路由名称

    【讨论】:

    • 我不认为这是这里的问题
    【解决方案4】:

    它不起作用,因为您在 php 文件中使用它。它只适用于blade.php 文件。

    尝试以下解决方案之一作为替代方案。

    你可以声明一个隐藏字段

    <input type="hidden" name="_method" value="delete" />
    

    或者你可以在刀片文件中使用 Laravel 5.1 或更高版本

    <form action="/users/'. $row->id.'" method="POST">
       {{method_field('DELETE')}}
       {{csrf_token}}
       <button class="modal-action modal-close waves-effect waves-green btn-flat" type="submit" name="action" value="delete">Confirm
         <i class="material-icons right">check</i>
      </button>
    </form>
    

    【讨论】:

    • 我用过它,现在它工作得很好,谢谢:)
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2015-02-08
    • 2012-09-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多