#php #mysql #ajax #laravel #laravel-8
#php #mysql #ajax #laravel #laravel-8
Вопрос:
Итак, мы с моим другом работаем над представлением администратора для управления пользователями. Я хотел, чтобы это представление могло удалять пользователей нажатием кнопки.
Сам список пользователей выглядит следующим образом:
@section('main')
@csrf
<ul class="collapsible">
@foreach($users as $user)
<li method="POST" action="delete">
<div class="collapsible-header">
<i class="material-icons">face</i>{{$user->fname}} {{$user->lname}}
</div>
<div class="collapsible-body" id="{{$user->id}}">
<p>Adresse: {{$user->address1}}, {{$user->postalcode}} {{$user->city}}</p>
<p>Land: {{$user->country}}</p>
<p>E-Mail: {{$user->email}}</p>
<span>Beigetreten: {{$user->created_at}}</span>
<br>
<a class="btn red waves-effect waves-light user-delete-button" href=""
id="user-delete-button" data-userid="{{$user->id}}">
<i class="material-icons">delete</i>
</a>
</div>
</li>
@endforeach
</ul>
@endsection
Сценарий в расширенном dashboard.blade.php шаблон выглядит следующим образом:
<script>
$(document).ready(function(){
$('.collapsible').collapsible();
$('.user-delete-button').click(function (e){
$.ajax({
url: '{{route('deleteuser')}}',
data: {"userid": $(this).data("userid")},
type: 'post',
success: function(data)
{
console.log('deleted');
}
});
});
});
</script>
Пользовательский контроллер:
class UserController extends Controller
{
public static function destroy($id) {
$user = AppModelsUser::findOrFail($id);
$user->delete();
return redirect('/userlist');
}
//
}
И, наконец, маршрут в web.php:
Route::post('/deleteuser', [UserController::class, 'destroy'])->name('deleteuser');
Так что теперь всякий раз, когда я пытаюсь удалить пользователя, нажимающего на кнопку, я получаю «500 Internal Server Error» в консоли.
На данный момент я не просто понятия не имею, что я должен делать, чтобы это сработало. Единственное, что я хочу, это удалить запись и обновить базу данных простым нажатием кнопки. Но в настоящее время ничего из того, что я пробовал, пока не работало.
Надеюсь, вы сможете мне помочь. Заранее спасибо!
Комментарии:
1. Перейдите в папку Storage> Logs и сообщите нам об ошибке..
2. Я думаю, что функция не должна быть статической, и вы должны добавить идентификатор в свой маршрут
/deleteuser/{id}
3. Кроме того, ознакомьтесь с ответом, возвращенным на вкладке сети вашей консоли, чтобы увидеть специфику ошибки.
Ответ №1:
в вашем запросе должен быть файл заголовка, поэтому используйте этот тип: ‘post’, заголовок
Комментарии:
1. Не могли бы вы уточнить?
2. $.ajax({ type:’post’, headers: { ‘X-CSRF-TOKEN’: $(‘meta[name=»csrf-token»]’).attr(‘content’) }, url:'{{ route(«delete_all_document») }}’, data:{type:тип, pId: pId}, успех: функция (данные){ окно. location.reload(); } });
3. таким образом, вы можете добавить заголовок в свой вызов ajx @PatZabawa
Ответ №2:
Вариант 1: добавьте параметр {id} к вашему маршруту.
Route::post('/deleteuser/{userid}', [UserController::class, 'destroy'])->name('deleteuser');
use AppModelsUser;
class UserController extends Controller
{
public function destroy($userid) {
$user = User::findOrFail($userid);
$user->delete();
return redirect('/userlist');
}
}
Вариант 2: используйте привязку модели маршрута в вашем маршруте и действии контроллера:
Route::post('/deleteuser/{user}', [UserController::class, 'destroy'])->name('deleteuser');
use AppModelsUser;
class UserController extends Controller
{
public function destroy(User $user) {
$user->delete();
return redirect('/userlist');
}
}
Вариант 3: использовать объект запроса для извлечения строки запроса
Route::post('/deleteuser', [UserController::class, 'destroy'])->name('deleteuser');
use AppModelsUser;
use IlluminateHttpRequest;
class UserController extends Controller
{
public function destroy(Request $request) {
$user = User::findOrFail($request->query('userid', null));
$user->delete();
return redirect('/userlist');
}
}
Ответ №3:
Возможно, вы получали ошибку 500, потому что ваш класс контроллера не был найден. Вам нужно использовать полное пространство имен. Измените свой код следующим образом:
Маршрут:
Route::post('/deleteuser', [AppHttpControllersUserController::class, 'destroy'])->name('deleteuser');
Контроллер:
class UserController extends Controller
{
public static function destroy(Request $Request) {
$id = $Request->input('userid');
$user = AppModelsUser::findOrFail($id);
$user->delete();
return redirect('/userlist');
}
}
Примечание: для POST
запроса вам необходимо отправить csrf token
через ваши данные ajax
data: {
"_token": "{{ csrf_token() }}",
"userid": $(this).data("userid")
}
или вы можете добавить пармы заголовка следующим образом:
$.ajax({
url: '{{route('deleteuser')}}',
data: {"userid": $(this).data("userid")},
type: 'post',
headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}' },
success: function(data)
{
console.log('deleted');
}
});
Надеюсь, это сработает!
Комментарии:
1. Если csrf не соответствует, то будет выдана ошибка 419, а не 500
2. Я предложил все это, потому что у него тоже отсутствует csrf.. @sta