Запросы 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 маршрута, и он должен быть одинаковым для обоих запросов.

Author: Shaz, 2015-12-01

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', ...)

И вы обрабатываете запрос, надеюсь, это поможет вам.

 6
Author: Victor Palomo, 2016-01-12 15:25:27

Используйте следующий пример для создания более мощной функции контроллера.

  • Контролируем, если запрос приходит запрос 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'));
 4
Author: Sangar82, 2016-01-12 15:26:32

Нет необходимости реализовывать другой метод.

Если это не работает для вас, это может быть связано с тем, что Laravel 5 включает проверку токена CSRF по соображениям безопасности во всех запросах POST, PUT и DELETE. Вы должны включить этот токен в запрос.

Вы можете увидеть различные методы включения этого токена в официальную документацию: http://laravel.com/docs/5.1/routing#csrf-protection

 3
Author: mcanaves, 2015-12-01 20:06:39

Вы можете попробовать это

public function store(Request $request)
{
    if($request->ajax())
    {
        $name = $request->input('name');
        Response->json($name);
    }
}
 0
Author: Kevin Ventura, 2016-08-26 23:46:37