我正在构建一个网站,它通过 javascript 加载所有页面和内容,同时还操纵浏览器地址栏(给人一种正常的、可导航的网站的错觉,每个页面都有自己的 URL)。作为后备措施,并且为了搜索引擎的利益,页面还必须能够在各自的 URL 上正常加载。
为此,我需要让 Laravel 知道页面数据是通过 ajax 调用还是普通 HTTP 请求请求的。我想这就是我会使用中间件的情况。我希望能够使用两个不同的 Controller 处理页面;一种用于 ajax,一种用于 HTTP。
即:
if (Request::ajax()){
forward request to ajax page controller
}else {
forward request to standard page controller
}
这可以用中间件处理吗?我能找到的所有示例似乎都假设 Controller 已经是给定的。
最佳答案
我使用routes.php
文件而不是中间件。我相信中间件是在路线确定之后。
if(Request::ajax() || Request::json()){
Route::get('items', [
'as' => 'api.posts.index' ,
'uses' => 'Api\ItemsController@index'
]);
} else {
Route::get('items', [
'as' => 'posts.index' ,
'uses' => 'ItemsController@index'
]);
}
我这样做是因为我喜欢将 json 和 web 的 url 分开。
Route::get('items', [
'as' => 'posts.index' ,
'uses' => 'ItemsController@index'
]);
/**
* JSON API
*
*/
Route::group([
'prefix' => 'api/v1',
'as' => 'api.',
'namespace' => 'Api'
], function () {
Route::get('items', [
'as' => 'posts.index' ,
'uses' => 'ItemsController@index'
]);
}
无论哪种方式,你的 Controller 都会住在这里。
App/Http/Controllers/Api/ItemsController.php
App/Http/Controllers/ItemsController.php
编辑
我阅读了 GONG 的评论,RouteServiceProvider 也适用于此,但您仍然有两个不同的 url。您必须管理另一个路由文件,但无论什么对您有用。
关于Laravel:确定使用哪个 Controller 的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276301/