Итак, у меня есть маршрут, который выглядит так:
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 файл?
После проверки классов 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!');
}
...
Я думаю, что это довольно чистое решение.
Вы не можете выполнить эту диспетчеризацию в слое маршрутизации, если сохраняете тот же URL. У вас есть два варианта:
Используйте разные маршруты для ваших вызовов AJAX. Например, вы можете префикс всех ваших вызовов AJAX /api
, Это распространенный способ:
Route::group(['prefix' => 'api'], function()
{
Route::get('items', function()
{
//
});
});
Если отличается только ваш формат ответа. Вы можете использовать условие в вашем контроллере. 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 если вы хотите больше деталей.