Как сделать успокоительные маршруты Ajax к методам в Laravel 5?

Итак, у меня есть маршрут, который выглядит так:

Route::any('some/page', ['as' => 'some-page', 'uses' => 'SomePageController@index']);

Тем не менее, у меня также есть вызовы ajax по тому же URL (с использованием параметра запроса под названием Аякса лайк: some/page/?ajax=my_action) что я хочу нажать методы на моем контроллере:

Индекс уже маршрутизирует: 'SomePageController @ index'
ajax = my_action необходимо направить: 'SomePageController @ ajaxMyAction'
ajax = my_other_action необходимо направить: 'SomePageController @ ajaxMyOtherAction'
ajax = blah_blah необходимо маршрутизировать: 'SomePageController @ ajaxBlahBlah
...

Какое элегантное решение для настройки этого в моем routes.php файл?

4

Решение

После проверки классов Http Request и Route Laravel, я нашел маршрут () а также SetAction () методы могут быть полезны.

Поэтому я создал промежуточное программное обеспечение для этого:

<?php namespace App\Http\Middleware;

class Ajax {

public function handle($request, Closure $next)
{
// Looks for the value of request parameter called "ajax"// to determine controller's method call
if ($request->ajax()) {
$routeAction = $request->route()->getAction();
$ajaxValue = studly_case($request->input("ajax"));
$routeAction['uses'] = str_replace("@index", "@ajax".$ajaxValue, $routeAction['uses']);
$routeAction['controller'] = str_replace("@index", "@ajax".$ajaxValue, $routeAction['controller']);
$request->route()->setAction($routeAction);
}

return $next($request);
}

}

Теперь мой маршрут выглядит так:

Route::any('some/page/', ['as' => 'some-page', 'middleware'=>'ajax', 'uses' => 'SomePageController@index']);

И правильно нажимает на методы моего контроллера (не нарушая нормального потока Laravel):

<?php namespace App\Http\Controllers;

class SomePageController extends Controller {

public function index()
{
return view('some.page.index');
}

public function ajaxMyAction(Requests\SomeFormRequest $request){
die('Do my action here!');
}

public function ajaxMyOtherAction(Requests\SomeFormRequest $request){
die('Do my other action here!');
}
...

Я думаю, что это довольно чистое решение.

3

Другие решения

Вы не можете выполнить эту диспетчеризацию в слое маршрутизации, если сохраняете тот же URL. У вас есть два варианта:

  1. Используйте разные маршруты для ваших вызовов AJAX. Например, вы можете префикс всех ваших вызовов AJAX /api, Это распространенный способ:

    Route::group(['prefix' => 'api'], function()
    {
    
    Route::get('items', function()
    {
    //
    });
    
    });
    
  2. Если отличается только ваш формат ответа. Вы можете использовать условие в вашем контроллере. Laravel предоставляет методы для этого, например:

    public function index()
    {
    $items = ...;
    
    if (Request::ajax()) {
    return Response::json($items);
    } else {
    return View::make('items.index');
    }
    }
    

Вы можете прочитать это http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax и это http://laravel.com/docs/5.0/routing#route-groups если вы хотите больше деталей.

1

По вопросам рекламы [email protected]