Laravel 6: удаление пользователя во время входа - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время я занимаюсь разработкой веб-сайта. Я работаю над CRUD для одной из своих функций, и у меня не было проблем до момента удаления. Я использую bootstrap модальное окно в качестве всплывающего окна с предупреждением о том, что вы sh хотите удалить свою учетную запись. Код для этого представления и всплывающего окна выглядит следующим образом:

<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" data_userid="{{$user->id}}" class="btn btn-danger" data-toggle="modal" data-target="#deleteModal">
                        Delete
                    </button>
                    </div>
                    </form>
                </div>
                </div>
            </div>
        </div>
    </div>
</div>


<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', $user)}} " method="post">
        {{method_field('delete')}}
        {{csrf_field()}}
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </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>
      </form>
    </div>
  </div>
</div>

Мои маршруты для этой страницы и функции выглядят так:

Route::get('/users/delete', 'Admin\UsersController@index')->name('delete');

Route::delete('admin/users/{user}', 'Admin\UsersController@destroy')->name('users.destroy');
    public function destroy($id,Request $request)
    {  
        $user = User::where("id","=",$id)->first();
        $user->delete($id);


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

    }

ТАКЖЕ всякий раз, когда я Попытайтесь получить доступ к странице из выпадающего меню с маршрутом

 <a class="dropdown-item" href="{{ route('users.destroy', $user)}}">
                                        Delete Account

Меня встретила пустая страница, я уверен, что это до параметра. Просто для пояснения: всякий раз, когда появляется модальное окно, и пользователь нажимает «Да, удалить мою учетную запись», ничего не происходит, и окно остается открытым, и моя маршрутизация на страницу {{ route('users.destroy', $user)}} приводит к пустой странице. Любая помощь с благодарностью!

Ответы [ 4 ]

0 голосов
/ 02 апреля 2020

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

Это ваш маршрут конфигурации:

Route::get('/users/delete', '[...]')->name('delete'); 
Route::delete('admin/users/{user}', '[...]')->name('users.destroy');

Вот как вы должны их использовать:

  • На вашем <a/> вы должны используйте route('delete')
  • На вашем <form/> вы должны использовать route('users.destroy', ['user' => $userId]).

И ваше действие удаления должно выглядеть следующим образом:

  • Удалить пользователь
  • Выйти из системы текущего пользователя
  • Перенаправить куда-нибудь
  public function destroy($id)
  {  
      User::find($id)->delete();
      Auth::logout();

      return Redirect::route('home')
          ->with('global', 'Your account has been deleted!');

  }

Надеюсь, это поможет.

0 голосов
/ 02 апреля 2020

вы можете сделать это, используя ajax, и добавьте более интерактивную форму для пользовательского интерфейса

в вашем блейд-файле

@foreach($user as $u)
   <a href="javascript:void(0);" classs="delete" data-id="{{$u->id}}">Delete</a>
@endforeach

в нижней части блейда вы можете вызвать ajax request

<script>
  $(document).on('click','.delete',function()
  {
    var id = $(this).data('id');
    swal({
        title: 'Are you sure you want to delete this?',
        type: "warning",
        showCancelButton: true,
        confirmButtonClass: "btn btn-danger m-btn m-btn--pill m-btn--icon m-btn--air",
        confirmButtonText: '<span><i class="la la-thumbs-up"></i> Yes, Delete it!</span>',
        cancelButtonClass: 'btn btn-secondary m-btn m-btn--pill m-btn--icon m-btn--air',
        cancelButtonText: '<span><i class="la la-thumbs-down"></i>No, thanks</span>',
    }).then(function(e){
        if(e.value){
            $.ajax({
                url:"{{route('admin.document.delete')}}",
                type:'POST',
                headers:{ 'X-CSRF-Token' : jQuery('meta[name=csrf-token]').attr('content') },
                dataType:'json',
                data:{'id':id,_token: '{{csrf_token()}}'},
                success:function(response){   
                    var msg = response.msg;
                    if(response.status=='success'){
                        //here you can do whatever after delete msg
                        //for reload u can use - (location.reload);
                    }
                },

            });
        }
    });
}); 
</script>

и наконец в вашем контроллере

public function destroy(Request $request)
{
   $id=$request['id'];
   $delete = manageMultipleDocument::find($id)->delete();
//optional
   $flashArr = array(
            'msg' => 'Document deleted successfully.',
            'status' => 'success'
        );
//optional
   $request->Session()->flash('succ_message',$flashArr);
//Required return any thing
   return $flashArr;
}
0 голосов
/ 02 апреля 2020

Изменить

<form action="{{ route('delete', $user)}} " method="post">

на

<form action="{{ route('delete', ['user' => $user]) }}" method="post">

в режиме.

Также

<a class="dropdown-item" href="{{ route('users.destroy', $user)}}">Delete Account </a>

Не работает, потому что это GET запрос. Удаление должно быть запросом DELETE.

Таким образом, вы должны открыть модал с помощью клика;

<a href="#" data-toggle="modal" data-target="#deleteModal" class="dropdown-item"> Delete Account</a>
0 голосов
/ 02 апреля 2020

Вот как мы пытаемся удалить Laravel

public function destroy(User $user)
{  
    $user->delete();
    return Redirect::route('home')->with('global', 'Your account has been deleted!');        
}
...