Подтвердить что ты не робот

CRUD 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('[email protected]', array($user->id))}}

4b9b3361

Ответ 1

Обновление 21.08.2017 для Laravel 5.x

Вопрос касается 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>

Вы также можете использовать {{ method_field('PUT') }} вместо записи скрытого ввода _method.

См. Https://laravel.com/docs/5.4/routing#form-method-spoofing.

Оригинальный ответ для Laravel 4

Я думаю, что когда вы нажимаете на ссылку, это, вероятно, отправляет запрос GET к этой конечной точке. CRUD в Laravel работает согласно REST. Это означает, что он ожидает запрос DELETE вместо GET.

Вот одна возможность из учебника Бориса Страхия.

    {{ 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().

Ответ 2

Охлаждающее решение 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;
}

 

Ответ 3

Еще одно "чистое" решение - сделать это способом Rails, как описано здесь:

  • Создайте новый .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();');
    });
    
  • Не забудьте включить файл .js в свой шаблон после включения jQuery.

  • Используйте классические функции link_to() или link_to_method() для создания ссылок для удаления записей. Не забудьте включить параметр "data-method"="DELETE":

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

Что мне нравится в этом, кажется, что он намного чище, чем раздувание вашего кода с помощью Form::open(); в шаблонах клинков.

Ответ 4

Это старые вопросы, но я просто искал быстрый ответ и не удовлетворен ни одним из них. То, что я предлагаю кому-либо с этой же проблемой, - создать новый маршрут. Беспокойство слишком много о соблюдении кроны - это глупо, потому что в HTML нет такой вещи; любое решение просто подходит для обуви, будь то скрытое поле формы или маршрут получения.

Итак, на ваших маршрутах, вероятно, есть что-то вроде этого:

Route::resource('users', 'UsersController'); Проблема в том, что единственный способ добраться до метода "уничтожить" - это отправить почтовый запрос с скрытым вводом с именем "_method" и значением "DELETE".

Просто добавьте в эту строку: Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'[email protected]']);

Теперь у вас есть маршрут, к которому вы можете получить доступ: HTML::linkRoute, Route::url или любой другой метод.

Например: {{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}

ИЗМЕНИТЬ

Я хочу пояснить, хотя я объяснил, почему это глупо перегибаться назад, чтобы соответствовать непротиворечивости, все равно верно, что ваше приложение будет более безопасным, если изменения будут сделаны только через запросы POST.

Ответ 5

Для тех, кто хочет создать кнопку удаления в Laravel 5:

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

Это похоже на ответ Тейлера, но мы используем новые метки отладки ({!! и !!}), мы используем фасад Form для генерации кнопки, и мы используем более элегантный подход к ссылке на контроллер,

В Laravel < 5 Формы и HTML-пакет были автоматически втянуты. В 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>

Если вы используете другой конструктор форм, убедитесь, что он генерирует нечто похожее на приведенное выше.

Ответ 6

Хотите отправить запрос DELETE вне формы?

Ну, Jeffrey Way создал хороший javascript, который создает форму для вас и для ее использования вам нужно добавить data-method="delete" в свой удалить ссылки.

Чтобы использовать, импортируйте script и создайте ссылку с атрибутом data-method="delete".

script:

(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();

})();

Ответ 7

Для тех, кто хочет создать кнопку удаления с использованием тега привязки в laravel 5.

{!! Form::open(['action' => ['[email protected]', $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() !!}

Ответ 8

Я попробовал ваш код, использовал его так:

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

Я думаю, что единственная проблема в вашем массиве:

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

Ответ 9

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