Запросы ajax в Laravel
это пример кода контроллера и нормальная обработка (не AJAX) Request или запроса.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
что я должен сделать, чтобы заставить его работать и для запросов AJAX в функции store()
?
Если я создам другую функцию storeAjax()
, я могу включить ее в routes.php (с новым назначенным маршрутом), и он работает, но это не очень хорошая практика, потому что у меня есть 2 маршрута, и он должен быть одинаковым для обоих запросов.
4 answers
Возможно, это может помочь вам:
if($request->ajax()){ }//procesa la peticion ajax
else{return $view;} //retornas por ejemplo,una vista
Что касается Routes.php
, нет необходимости изменять, то, что вы делаете в своем JS, является request типа GET
:
$.ajax(type: 'GET', ...)
И вы обрабатываете запрос, надеюсь, это поможет вам.
Используйте следующий пример для создания более мощной функции контроллера.
- Контролируем, если запрос приходит запрос AJAX или нет, и получить ответ в JSON или Перенаправления в зависимости от обстоятельств)
- Использование Try/Catch, чтобы перехватывать ошибки
- Использование Log ErrorLog
-
public function store()
{
$data = [
'name' => Input::get('name'),
];
try
{
$result = $this->repository->create($data);
}
catch (Illuminate\Database\QueryException $e)
{
Log::error("YourController@store: register your error", array('created_by' => Auth::user()->id, 'message' => $e->getMessage());
if (!Request::ajax())
{
return Redirect::back()
->with('type_message', "danger")
->with('message', trans('web.error'))
}
else
{
return "{\"result\":\"ko\",\"error\":\"$e->getMessage()\"}";
}
}
if ($result)
{
if (!Request::ajax())
{
Log::info("YourController@store: Created OK", array('created_by' => Auth::user()->id, 'result' => $result->toArray()));
return Redirect::back()
->with('type_message', "success")
->with('message', trans("web.created_ok"));
}
else
{
return "{\"result\":\"ok\",\"id\":\"$result->id\",\"name\":\"$result->name \"}";
}
}
else
{
return "{\"result\":\"ko\",\"error\":\"Hubo un error guardando\"}";
}
}
Пример запроса AJAX:
$.ajax({
url: "{{ route('my_route')}}",
data: "name="+name+"&_token={{ csrf_token()}}",
dataType: "json",
method: "POST",
success: function(result)
{
if (result['result'] == 'ok')
{
}
else
{
}
},
fail: function(){
},
beforeSend: function(){
}
});
});
Создайте путь, указывающий на метод Store вашего контроллера, который будет служить вам как для запросов из формы, так и для запросов AJAX:
Route::post('/my_route', array('as' => 'my_route', 'uses' => 'YourController@store'));
Нет необходимости реализовывать другой метод.
Если это не работает для вас, это может быть связано с тем, что Laravel 5 включает проверку токена CSRF по соображениям безопасности во всех запросах POST, PUT и DELETE. Вы должны включить этот токен в запрос.
Вы можете увидеть различные методы включения этого токена в официальную документацию: http://laravel.com/docs/5.1/routing#csrf-protection
Вы можете попробовать это
public function store(Request $request)
{
if($request->ajax())
{
$name = $request->input('name');
Response->json($name);
}
}