Я создал надежный API, используя контроллеры laravel . У меня есть PhotosController
которого есть метод destroy($id)
для удаления ресурсов. также у меня есть часть кода javascript, которая отправляет запрос DELETE
в мое приложение. результатом должно быть удаление фотографии с $id
id. но laravel не направляет мой запрос на destroy
метода. вместо этого он отправляет 401 Несанкционированную ошибку.
дело в том, что я хочу отправить DELETE
запрос в мое приложение через Ajax
, но laravel не разрешает мой запрос!
Файл routes.php:
Route::resource('photos', 'PhotosController');
уничтожить метод:
public function destroy($id) { try{ unlink($_SERVER["DOCUMENT_ROOT"].'/uploads/doctors/' . $id); Session::forget('photo'); $msg = Notification::where('flag', 's')->where('code', 'user-update-delete-photo-gallery')->first()->msg; return Response::json(array('success' => $msg)); }catch (Exception $e){ App::abort(500, $e->getMessage()); } }
мой запрос Ajax:
$.ajax( { url: "/photos/" + name, method : "DELETE", // Or POST : result is the same data :{ _token : $("input[name=_token]").val(), _method : 'DELETE' }, success: function(data, textStatus, jqXHR ){ parent.replaceWith(""); toastr.success(data['success']); $("#overlay").hide(); }, beforeSend : function(jqXHR, settings ){ $("#overlay").show(); }, error : function(jqXHR, textStatus, errorThrown ){ toastr.error(jqXHR.responseText); $("#overlay").hide(); } } );
Спасибо за вашу помощь.
Я все время делаю в своих приложениях Laravel без проблем. Этот код позволяет пользователю удалять ресурс через AJAX, одновременно представляя диалог подтверждения начальной загрузки. Код выложен в порядке, в котором будут происходить события.
СМОТРЕТЬ С РЕСУРСОМ ДЛЯ УДАЛЕНИЯ
<a class="delete-plan" href="{{ route('admin.plans.destroy', $plan['id']) }}" data-redirect="{{ route('admin.plans.index') }}" data-plan-name="{{ $plan['name'] }}" data-lang="billing.plans"> <i class="fa fa-trash fa-lg"></i> </a>
JQUERY ДЛЯ ПРОДВИЖЕНИЯ ПОДТВЕРЖДЕНИЯ
$('.delete-plan').on('click', function(e) { e.preventDefault(); var data = { 'route': $(this).attr('href'), 'redirect': $(this).data('redirect'), 'modal_title': 'Delete Plan', 'content_view': 'Are you sure you want to delete plan: <strong>' + $(this).data('plan-name') + '</strong>?', 'lang': $(this).data('lang') }; loadDestroyModal(data); }); function loadDestroyModal(data) { $.get('/ajax/destroy-modal', { data: data }, function(modal) { $('body').append(modal); $('#destroy-modal').modal('show'); }); }
КОНТРОЛЛЕР AJAX
// routed by /ajax/destroy-modal public function destroyModal() { $data = Input::get('data'); $params = [ 'route' => $data['route'], 'redirect' => $data['redirect'], 'title' => $data['modal_title'], 'content' => $data['content_view'], 'lang' => $data['lang'] ]; return View::make('_helpers.modal-destroy', $params); }
МОДАЛЬ ПОДТВЕРЖДЕНИЯ УНИЧТОЖЕНИЯ (_helpers.modal-destroy)
<div id="destroy-modal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"> <span aria-hidden="true"><i class="fa fa-times"></i></span> <span class="sr-only">Close</span> </button> <h4 class="modal-title">{{ $title }}</h4> </div> <div class="modal-body"> {{ $content }} </div> <div class="modal-footer"> <button id="modal-confirm" type="button" class="btn btn-primary" data-route="{{ $route }}" data-redirect="{{ $redirect }}" data-lang="{{ $lang }}">Confirm</button> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div>
ПРОСМОТР ПРОЦЕССА МЕТОДА РАЗРЕШЕНИЯ И СОКРАЩЕНИЕ ВСПЫШКИ СООБЩЕНИЯ
$('body').on('click', '#destroy-modal #modal-confirm', function(e) { var redirect = $(this).data('redirect'); var lang = $(this).data('lang'); $(this).html('<i class="fa fa-spinner fa-spin"></i> Please Wait'); $.ajax({ 'url': $(this).data('route'), 'type': 'DELETE', 'success': function(response) { if (response) { redirectWithFlashMessage(redirect, 'destroy', 'success', lang); } else { redirectWithFlashMessage(redirect, 'destroy', 'errors', lang); } } }); });
КОНТРОЛЛЕР ПЛАНОВ
public function destroy($id) { try { Stripe::plans()->destroy(['id' => $id]); return Response::json(TRUE); } catch (Exception $e) { return Response::json(FALSE); } }
СОКРАЩЕНИЕ ДЛЯ РЕДАКЦИИ
function redirectWithFlashMessage(redirect, type, status, lang) { var params = { type: type, status: status, lang: lang }; $.get('/ajax/flash', params, function(response) { window.location.href = redirect; }); }
AJAX CONTROLLER (перенаправление с помощью Flash)
public function flashData() { $message_type = 'success' == Input::get('status') ? 'success' : 'failure'; $message = Lang::get(Input::get('lang'))[Input::get('type') . '_' . $message_type]; Session::flash($message_type, $message); return ['status' => $message_type, 'message' => $message]; }
Это много кода, но после его настройки очень легко реплицироваться.
Я думаю, что ваша система требует аутентификации для действия контроллера «destroy». Поэтому перед вызовом этого метода вам необходимо войти в систему.
Если вы используете промежуточное ПО «auth» (приложение \ Http \ Middleware \ Authenticate.php), вы можете легко найти функцию «handle», которая возвращает ошибку «Unauthorized».
Надеюсь, это поможет.