2016-01-13 4 views
1

У меня есть один маршрут, определенный как это:Laravel находчивый контроллер - дифференцировать вызов API из браузера

Route::resource('problem', 'ProblemController');

В тот момент я POST к /problem, метод [email protected] увольняют.

Теперь я хочу вернуть ответ JSON, если это вызов API или представление (или, возможно, перенаправление), если я нахожусь на «веб-стороне» моего приложения. Как я могу подойти к этой проблеме?

Должен ли я создавать отдельные контроллеры? Должен ли я (в каждом методе/контроллере) определять тип запроса и отвечать соответствующим образом? Должен ли я использовать middlewares? Группы маршрутов? Отдельное приложение?

Основная цель состоит в том, чтобы иметь несколько типов приложений (API + versioning + web) в одном пакете, но совместно использовать бизнес-логику, модели и большую часть кода (чтобы избежать повторения).

Я использую Laravel 5.2.

Спасибо!

+0

чек '$ _SERVER [ 'HTTP_X_REQUESTED_WITH'] '- это может быть фальшивым, но я предполагаю, что это не проблема безопасности, просто удобная одна – Steve

+0

Эта переменная устанавливается, когда запрос выполняется с использованием Ajax-вызова, поэтому он не будет работать, если вы выполните запрос другим способом, например используя завиток или некоторый клиент для отдыха. Другое дело, что суперклассы, такие как $ _SERVER или $ _GET, никогда не должны быть доступны напрямую при использовании фреймворка, поскольку он обертывает их в ряд удобных классов/методов. –

ответ

6

объект Request предлагает метод wantsJson(), который проверяетAccept заголовка запроса и возвращает значение TRUE если JSON было предложено.

В контроллере вы можете сделать следующее:

if(request()->wantsJson()) 
{ 
    return ['foo' => 'bar']; 
} 

return view('foo.bar'); 

Вы можете прочитать больше о переговорах контента в Laravel здесь: http://fideloper.com/laravel-content-negotiation

1

Вы можете создать маршрут группы, как это:

Route::group(['prefix'=>'api'], function(){ 
    //All routes in this route become domain.com/api/route 
}); 

Это делает самый смысл для меня, потому что маршрут, который возвращает представление и маршрут API две разные вещи. У вас должен быть контроллер для страниц и просмотров, которые вы хотите показать в своем приложении, и еще один для маршрутов api, которые обновляют и изменяют ваши данные, возвращая JSON.

+0

Пока они возвращают одни и те же данные (один и тот же ресурс), он должен быть той же конечной точкой, по крайней мере, для правил REST, поскольку в этом случае изменяется только представление ресурса, будь то JSON, HTML, XML или что-то еще. –

+0

Интересно, и я понимаю, почему это имеет смысл. По моему опыту, страницы приложения часто содержат более сложные элементы, чем просто список одного ресурса. Поэтому у меня есть контролеры страниц, а затем они используют ajax для использования API и возвращения JSON. Вероятно, это зависит от использования. Благодаря! – Jeff

Смежные вопросы