webentwicklung-frage-antwort-db.com.de

CRUD Laravel 4 wie man vernichtet, um zu zerstören?

Ich werde meinen Benutzer mit einem HTML-Link zerstören, aber er scheint nicht den richtigen Link zu erzeugen.

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");
}

In meiner Sicht nenne ich das {{URL::action('[email protected]', array($user->id))}}

25
helloworld

Update 21.08.2017 für Laravel 5.x

Die Frage stellt sich nach Laravel 4, aber ich schließe dies ein, falls Leute, die nach Laravel 5.x-Antworten suchen, hier enden. Der Form-Helfer (und einige andere) sind nicht ab 5.x verfügbar. Sie müssen immer noch eine Methode in einem Formular angeben, wenn Sie neben GET oder POST etwas tun. Dies ist der aktuelle Weg, dies zu erreichen:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <!-- other inputs... -->
</form>

Sie können auch {{ method_field('PUT') }} verwenden, anstatt die verborgene _method-Eingabe herauszuschreiben.

Siehe https://laravel.com/docs/5.4/routing#form-method-spoofing

Ursprüngliche Antwort für Laravel 4

Ich denke, wenn Sie auf den Link klicken, sendet er wahrscheinlich eine GET-Anfrage an diesen Endpunkt. CRUD in Laravel arbeitet nach REST. Das heißt, es erwartet eine DELETE-Anforderung anstelle von GET.

Hier ist eine Möglichkeit aus einem Tutorial von 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() }}

Auf diese Weise senden Sie die Anforderung in einem Formular mit der DELETE-Methode. Der Artikel erklärt, warum ein herkömmlicher Link nicht funktioniert:

Möglicherweise stellen Sie fest, dass sich die Löschschaltfläche in einem Formular befindet. Der Grund dafür ist, dass die destroy () -Methode unseres Controllers eine DELETE-Anforderung benötigt. Dies kann auf diese Weise erfolgen. Wenn es sich bei der Schaltfläche um einen einfachen Link handelt, wird die Anforderung über die GET-Methode gesendet, und die destroy () -Methode wird nicht aufgerufen.

33
Tayler

Eine coole Ajax-Lösung, die funktioniert, ist folgende:

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>

Und in der UserController.php haben wir diese Methode:

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

    return $affectedRows;
}

17
paulalexandru

Eine andere "saubere" Lösung ist es, den Rails-Weg wie folgt zu beschreiben: here :

  1. Erstellen Sie eine neue .js-Datei in der Öffentlichkeit und schreiben Sie diese Funktion:

    $(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();');
    });
    
  2. Vergessen Sie nicht, die JS-Datei in Ihre Vorlage aufzunehmen, nachdem Sie jQuery hinzugefügt haben.

  3. Verwenden Sie die klassischen Funktionen link_to() oder link_to_method(), um Links zum Löschen von Datensätzen zu erstellen. Denken Sie daran, den Parameter "data-method"="DELETE" anzugeben:

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

Was ich daran mag, das scheint viel sauberer zu sein, als den Code mit Form::open(); in Blade-Vorlagen aufzublähen.

15
user3535692

Dies ist eine alte Frage, aber ich habe nur nach einer schnellen Antwort gesucht und bin mit keiner dieser Fragen zufrieden. Was ich jedem vorschlagen könnte, der das gleiche Problem hat, ist das Erstellen einer neuen Route. Es ist dumm, sich zu viele Sorgen über die Einhaltung der Rohdaten zu machen, weil es über HTML keine solche Sache gibt. Jede Lösung ist einfach nur ein Schuh-Hörner, egal ob es sich um ein verstecktes Formularfeld oder um eine Route handelt.

In Ihren Routen haben Sie wahrscheinlich so etwas:

Route::resource('users', 'UsersController'); Das Problem dabei ist, dass der einzige Weg, um zur "destroy" -Methode zu gelangen, darin besteht, eine Post-Anfrage zu senden, die eine versteckte Eingabe mit dem Namen "_method" und den Wert "DELETE" enthält.

Fügen Sie einfach unter dieser Zeile hinzu: Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'[email protected]']);

Jetzt haben Sie eine Route, auf die Sie über HTML::linkRoute, Route::url oder auf eine beliebige Methode zugreifen können.

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

BEARBEITEN

Ich möchte klarstellen, auch wenn ich erklärt habe, warum es etwas dumm ist, sich rückwärts zu biegen, um die Einhaltung der Crud-Anforderungen zu erfüllen. Es ist immer noch wahr, dass Ihre App sicherer ist, wenn Änderungen nur durch POST -Anfragen vorgenommen werden.

8

Für diejenigen, die die Lösch-Schaltfläche in Laravel 5 erstellen möchten:

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

Dies ist der Antwort von Tayler ähnlich, aber wir verwenden die neuen Blade-Escape-Tags ({!! und !!}), verwenden die Form-Fassade, um die Schaltfläche zu generieren, und verwenden einen eleganteren Ansatz für die Verknüpfung mit dem Controller. 

In Laravel <5 wurde das Forms & HTML-Paket automatisch eingezogen. In Laravel 5 müssen wir dieses Paket zu composer.json hinzufügen:

...
"required": {
  ...
  "laravelcollective/html": "^5.1"
}
...

Fügen Sie nun den Service Provider und den Alias ​​in config/app.php hinzu:

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

'aliases' => [
  ...
  'Form' => Collective\Html\FormFacade::class,
  'Html' => Collective\Html\HtmlFacade::class,
],

Das obige wird ausgegeben

<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>

Wenn Sie einen anderen Formularersteller verwenden, stellen Sie sicher, dass dieser etwas ähnliches generiert. 

8
DutGRIFF

Möchten Sie eine DELETE-Anfrage senden, wenn Sie sich außerhalb eines Formulars befinden?

Nun, Jeffrey Way hat ein Nice-Javascript erstellt, das ein Formular für Sie erstellt. Um es zu verwenden, müssen Sie lediglich data-method="delete" zu Ihren Löschlinks hinzufügen.

Um zu verwenden, importieren Sie script und erstellen Sie eine Verknüpfung mit dem data-method="DELETE"-Attribut.

Skript :

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

})();
4
chebaby

Für diejenigen, die eine Lösch-Schaltfläche mit Anker-Tag in Laravel erstellen möchten 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() !!}
2
Konsole

Ich habe Ihren Code ausprobiert, so verwendet und gearbeitet:

    <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>

Ich denke, das einzige Problem liegt in Ihrem Array: 

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