0
votes

Laravel-6: Suppression de l'utilisateur connecté: La méthode GET n'est pas prise en charge pour cette route. Méthodes prises en charge: POST

MODIFIER! DERNIER CODE MISE À JOUR, NOUVELLE ERREUR ^ Je conçois actuellement un site Web qui permet aux utilisateurs de créer un compte. Je rencontre des problèmes en essayant de supprimer tout d'abord l'utilisateur, puis de supprimer l'utilisateur lorsqu'il est connecté.

Mon contrôleur d'utilisateurs ressemble à ceci:

Route::post('/users/delete', 'Admin\UsersController@destroy')->name("delete-account");

Ma fenêtre d'amorçage modal qui s'ouvre à partir d'un formulaire ressemble à ceci;

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">
                <img src="{{ asset('/uploads/avatars/' . $user->avatar ) }}" style="width:100px; height:100px; float:left;
                margin-right:25px ">
                <strong>Delete {{$user->name}}'s account?</strong></div>
                <div class="card-body">
                <form action="delete" method="POST" enctype="multipart/form-data">
                {{csrf_field()}}
                <div class="form-group">
                    <label for="name">Account Email:</label>
                    <input type="text" name ="email" value="{{$user -> email}}" class="form-control" readonly>
                    <div class="form-group">
                    <div class="text-centre">
                    <p></p>
                    <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteModal">
                        Delete
                    </button>
                    </div>
                </div>
                </div>
            </div>
        </div>
    </div>
</div>

Le formulaire à partir duquel le modal s'ouvre:

<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteModalLabel">Are you sure?</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <form action="{{route('users.delete', ['user' => Auth::id()])}}" method="Post">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      @csrf
      @method('delete')
      <div class="modal-body">
        Are you sure you want to permanetly delete your account?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" data-dismiss="modal">No, cancel</button>
        <button type="submit" class="btn btn-danger">Yes, delete my account</button>
      </div>
    </div>
  </div>
</div>

Et enfin mon itinéraire ressemble à ceci;

    public function destroy(Request $request)
    {
        $user = Auth::user();
        Auth::logout();

        if ($user->delete())
        {
         return Redirect::route('\home')->with('global', 'Your account has been deleted!');
        }
    }

Toutes les idées sur la façon de faire fonctionner ceci d'abord et ensuite de l'implémenter sont les bienvenues. merci


5 commentaires

Veuillez indiquer l'erreur que vous obtenez. Cela aidera à proposer la bonne réponse.


Rien ne se passe lorsque je clique sur le bouton "Oui, supprimer mon compte" dans ma fenêtre modale.


Vous ne devez pas ajouter method_field ('patch') dans le formulaire pour une route de type get . Je veux dire que vous devez définir le type en utilisant Route :: delete .


J'avais l'impression que certains navigateurs ne prennent pas en charge le type de suppression


Tout à fait possible. Mais regardez ma réponse. J'ai utilisé POST méthode et ajouté _method avec valeur Supprimer . @Method ('Supprimer') le faire.


3 Réponses :


0
votes

Veuillez nous indiquer l'erreur que vous obtenez.

La première chose que je reconnais en voyant votre code est que vous retournez sur la deuxième ligne de votre méthode. Mais après le retour, vous vous attendez toujours à ce que le code s'exécute. Malheureusement, cela ne fonctionnera pas. Le code après un retour est ignoré.

Essayez de diviser les méthodes:

  <form action="{{route(users.destroy)}}" method="delete">

La méthode de formulaire et la requête doivent être comme ceci:

Route::delete('/users/destroy', ['uses' =>'Admin\UsersController@destroy', 'as' => 'users.destroy']);
Route::get('/users/delete', ['uses' =>'Admin\UsersController@delete', 'as' => 'users.delete']);


4 commentaires

Merci. Comment afficher la vue?


L'erreur est que rien ne se passe lorsque je clique sur le bouton de confirmation de suppression dans ma fenêtre modale


Vous devez diviser l'itinéraire. Faites une autre fonction pour la vue (GET) et restez la méthode de destruction pour la fonction de suppression, et veuillez utiliser la requête DELETE pour cela.


Je vais modifier la question pour le nouveau code si vous voulez regarder. Je viens de rencontrer l'identifiant de non-objet maintenant à partir de ma méthode de suppression



0
votes

Le problème réel était la non-concordance des types d'itinéraire. Vous avez défini une route de type GET alors que le formulaire est soumis à une route de type DELETE .

Veuillez remplacer votre code par celui-ci et vérifier: p >

public function destroy(User $user)
    {

        if($user->id !== Auth::id()) return view('admin.users.delete')->with('user', Auth::user());

        Auth::logout();

        if ($user->delete())
        {
         return Redirect::route('\home')->with('global', 'Your account has been deleted!');
        }
    }

Et changez votre route en ceci

Route::delete('/users/{user}', 'Admin\UsersController@destroy')->name("users.delete");

Votre contrôleur ne dispose pas d'une instruction IF-THEN

<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteModalLabel">Are you sure?</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <form action="{{route('users.delete', ['user' => Auth::id()])}}" method="Post">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      @csrf
      @method('delete')
      <div class="modal-body">
        Are you sure you want to permanetly delete your account?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" data-dismiss="modal">No, cancel</button>
        <button type="submit" class="btn btn-danger">Yes, delete my account</button>
      </div>
    </div>
  </div>
</div>


9 commentaires

Erreur rencontrée La méthode GET n'est pas prise en charge pour cette route. Méthodes prises en charge: DELETE., Même si j'ai changé la route actualisée et enregistrée vers Route :: delete ('/ users / {user}', 'Admin \ UsersController @ destroy') -> nom ("users.delete");


Vous avez défini la valeur de method sur GET dans la balise form . Veuillez le changer en method = "POST" dans votre balise

.


Veuillez revoir mon code mis à jour. Rencontre avec Essayer d'obtenir la propriété 'id' de l'erreur non-objet maintenant à partir de ma méthode de suppression dans mes utilisateurs


La sortie de vos modifications entraîne la méthode GET n'est pas prise en charge pour cet itinéraire. Méthodes prises en charge: SUPPRIMER


Vous avez oublié le changement d'itinéraire. Le modèle User sera fourni à votre méthode destory si vous mettez l'URI d'itinéraire comme celui que j'ai mentionné. / users / {user} .


Paramètres obligatoires manquants pour [Route: users.delete] [URI: users / {user}]


Pardon! Correction de la ligne action = "route .... . Veuillez également la corriger dans votre code.


La réception de la sortie pour vos modifications entraîne toujours la méthode GET qui n'est pas prise en charge pour cet itinéraire. Méthodes prises en charge: SUPPRIMER, mec, cela me déroute


Comme vous avez révélé vos problèmes dans les commentaires. J'ai ajouté une nouvelle réponse, veuillez la vérifier.



0
votes

Remplacez votre code par celui-ci et vérifiez:

public function destroy(Request $request)
    {
        $user = Auth::user();
        Auth::logout();

        if ($user->delete())
        {
         return Redirect::route('\home')->with('global', 'Your account has been deleted!');
        }
    }

Et changez votre route vers ceci

Route::post('/users/delete', 'Admin\UsersController@destroy')->name("delete-account");

Votre contrôleur n'a pas de IF -THEN instruction

<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteModalLabel">Are you sure?</h5>
        <form action="{{route('delete-account'}}" method="Post">
        @csrf
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
        </form>
      </div>

      <div class="modal-body">
        Are you sure you want to permanetly delete your account?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" data-dismiss="modal">No, cancel</button>
        <button type="submit" class="btn btn-danger">Yes, delete my account</button>
      </div>
    </div>
  </div>
</div>


10 commentaires

La méthode GET n'est pas prise en charge pour cet itinéraire. Méthodes prises en charge: POST.


Il semble que tout autre type d'itinéraire que get ne fonctionne pas pour moi


Avez-vous fermé la balise form . Comme j'ai oublié de le fermer. Code HTML mis à jour. S'il te plaît vérifie le.


La balise de formulaire est fermée oui


Veuillez mettre à jour votre code à partir de ma réponse et vérifier à nouveau.


Toujours la même erreur La méthode GET n'est pas prise en charge pour cette route. Méthodes prises en charge: POST. Je ne sais vraiment pas ce qui cause ça


Lorsque j'exécute php artisan route: list cmd, à côté de la route user.delete est GET | HEAD | utilisateurs / supprimer | users.delete, serait-ce ce qui en est la cause?


Cependant, à côté de users.destroy, il y a DELETE | admin / utilisateurs / {utilisateur} | users.destroy


Pour supprimer toutes les confusions. J'ai changé le nom de l'itinéraire en delete-account et mis à jour le code HTML en conséquence. Veuillez essayer.


La méthode GET n'est pas prise en charge pour cet itinéraire. Méthodes prises en charge: POST. Il doit y avoir quelque chose qui ne provoque que la méthode de GET pour fonctionner, me perturbe, je n'ai eu aucun problème tant que ce point!